2016-04-23 9 views
1

私はServiceStack MQ(ServiceStack.Aws.Sqs.SqsMqServer v4.0.54)を使用しています。 私はWindowsサービス内でMQサーバーを実行しています。ServiceStack MQサーバーのシャットダウンでワーカーのバックグラウンドスレッドが完了するのを待たずに

私の目標:Windowsサービスをシャットダウンしようとするときに 、私は、実行中のすべての労働者が処理を終了し、その後 MQSERVERを終了させるため 待つしたいと思います。

問題: ServiceStack MqServer(Redis/RabbitMq/Sqsであるかどうか)にはStop()メソッドがあります。しかし、すべての労働者が作業を完了するまでは、それは妨げられません。単に がバックグラウンドスレッドにパルスを送ってワーカーを停止させ、その後に戻ります。 その後、Windowsサービスプロセスが停止し、既存のワーカーが中止されます。 これはgithubのソースコードへのリンクです - >https://github.com/ServiceStack/ServiceStack/blob/75847c737f9c0cd9f5dd4ea3ae1113dace56cbf2/src/ServiceStack.RabbitMq/RabbitMqServer.cs#L451

一時的な回避策:私はSqsMqServer、基本クラスで保護されたメンバーの労働者をループのサブクラスを作成し、各1の停止を呼び出し 。 (この場合、このStop()メソッドはブロッキング呼び出しとして正しく実装され、現在作業中のもので作業が完了するまで無期限に待機します)。

現在、MqServerをシャットダウンする方法について私の理解は正しいですか?これは私が誤解しているバグか何かですか?

答えて

1

SqsMqServerのソースコードは、ServiceStack.Awsリポジトリに保存されています。

Stop() methodは、StopWorkerThreads()のbgスレッドにパルスを送り、それはstops all workersを通過します。

+0

私が苦労している問題は、IMessageServiceのStop()メソッドがブロックされていないことです。それはバックグラウンドスレッドをパルスしてから戻る。この時点で、メインスレッド(プロセス終了前のWindowsサービス)は、ワーカーが実際に停止した時期を知ることができません。ワーカーは依然としてmqメッセージを処理中です。 – xihan

+0

@ xihan私は[このコミット](https://github.com/ServiceStack/ServiceStack.Aws/commit/36d2b9669fb13c1f2d3adbb83c18342ec41c7a3c)に新しいWaitForWorkersToStop()APIを追加しました。これは、MQ Statusが停止するまでポーリングします。この変更はv4.0.57 +から利用できます。これは[MyGetで利用可能](https://github.com/ServiceStack/ServiceStack/wiki/MyGet)です。 – mythz

関連する問題