再接続できるように、サブスクリプションの問題がいつ発生したかを判断する方法についての指針はありますか?
私のサービスは、サブスクリプションにRabbitMQ.Client.MessagePatterns.Subscriptionを使用しています。しばらくすると、クライアントはメッセージの受信を黙って停止します。VPN接続の信頼性が最も低いため、ネットワークの問題が疑われます。
私はしばらくの間ドキュメントを読み、ネットワークの問題が原因でこのサブスクリプションが壊れている可能性があることを確認するための鍵を探していました。接続とチャネルがまだ開いていることを確認しようとしましたが、常に開いていると報告されているようです。
それが処理するメッセージは非常にうまく機能し、キューに戻されて確認されるので、「ack」の問題ではないと思います。
単純なものが欠けているに違いないと思いますが、まだ見つけていません。
public void Run(string brokerUri, Action<byte[]> handler)
{
log.Debug("Connecting to broker: {0}".Fill(brokerUri));
ConnectionFactory factory = new ConnectionFactory { Uri = brokerUri };
using (IConnection connection = factory.CreateConnection())
{
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queueName, true, false, false, null);
using (Subscription subscription = new Subscription(channel, queueName, false))
{
while (!Cancelled)
{
BasicDeliverEventArgs args;
if (!channel.IsOpen)
{
log.Error("The channel is no longer open, but we are still trying to process messages.");
throw new InvalidOperationException("Channel is closed.");
}
else if (!connection.IsOpen)
{
log.Error("The connection is no longer open, but we are still trying to process message.");
throw new InvalidOperationException("Connection is closed.");
}
bool gotMessage = subscription.Next(250, out args);
if (gotMessage)
{
log.Debug("Received message");
try
{
handler(args.Body);
}
catch (Exception e)
{
log.Debug("Exception caught while processing message. Will be bubbled up.", e);
throw;
}
log.Debug("Acknowledging message completion");
subscription.Ack(args);
}
}
}
}
}
}
アップデート:
仮想マシンでサーバーを実行してネットワーク障害をシミュレートしましたが、接続を十分に長く切断すると例外(RabbitMQ.Client.Exceptions.OperationInterruptedException:AMQP操作が中断されました)が発生するため、ネットワークではない可能性があります問題。今はどうなるかわかりませんが、数時間実行すると失敗します。