2

私は非常に奇妙な問題と戦っています... Windows 7 Ultimate上の.NET 4.0を使用して、WCFサービス間のサービスバス通信(MassTransit + MSMQ経由)を実装しました。サービスが起動すると、すべてが正常に機能し、お互いにメッセージを受信しますが、特定の時点で、コンピューターの管理 -> サービスとアプリケーション -> メッセージ キュー -> でプライベート キューを手動で削除するまで、サービスは受信しません。 > プライベート キュー。

各サービスごとに、MassTransit を構成するブートストラップがあります。

    // Bootstrapper configuration
    public void Configure(IUnityContainer container)
    {
        // Service bus configuration
        var config = ConfigurationDataAccess.GetSupervisionServiceConfig();

        // Cleaning up the former Private Queues before to start the service
        var privateQueues = MessageQueue.GetPrivateQueuesByMachine(System.Environment.MachineName);

        foreach (var messageQueue in privateQueues)
        {
            try
            {
                if (messageQueue.QueueName.Contains("supervisionservice"))
                {
                    MessageQueue.Delete(messageQueue.Path);
                }
            }
            catch (MessageQueueException)
            {
                // An exception has occurred trying to remove a private message queue.
            }
        }

        // Initializing MassTransit
        var bus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.UseMulticastSubscriptionClient();
            sbc.ReceiveFrom(config.ServiceBusReceiveFromAddress);
        });

        container.RegisterInstance(bus);

        //Start the service...
    }
}

次に、サービスのメイン クラスが MassTransit を拡張します。以下に例を示します。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class DataService : Consumes<ServiceMessage>.Selected
{
     public DataService()
     {
          // The service bus object takes the instance from the bootstrapper through the dependency
          // injection of the Unity.
          ServiceBus.SubscribeInstance(this);
     }

    public bool Accept(ServiceMessage message)
    {
        // For an easy explanation
        return true;
    }

    public void Consume(ServiceMessage message)
    {
        // Treat the message
    }

    public void SendMessage(ServiceMessage message)
    {
        // Publish the message over the service bus
        ServiceBus.Publish(message);
    }
}

説明したように、特定の時点で Accept メソッドは呼び出されなくなります。唯一の方法は、プライベート キューを手動で削除し、サービスを再起動することです。その後、次のトラブルまで、システムは再び正常に動作します :-(.

どんな提案でも大歓迎です。

どうもありがとう!アレッサンドロ

4

1 に答える 1

0

UseMulticastSubscriptionClient は、サブスクリプションを処理する最も安定した方法ではないようです。私は週末を通してすべてを稼働させるために働いており、現在、永続的な (複数の) サブスクリプションを持っています。

この質問への回答として、私の手順を書き留めました。これは役に立ちましたか?

于 2013-07-28T22:52:02.163 に答える