MassTransit实施:有时无法收到消息

时间:2013-03-19 12:37:25

标签: c# wcf msmq masstransit

我正在解决一个非常奇怪的问题......我已经在WCF服务之间实现了服务总线通信(通过MassTransit + MSMQ),在Windows 7 Ultimate上实现了.NET 4.0。当服务启动时,一切正常并且它们彼此接收消息,但是在给定点,它们不再接收它们,直到我手动删除计算机管理中的专用队列 - >服务和应用 - >消息队列 - >私人队列。

根据每项服务,我有一个引导程序,我配置了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方法。唯一的方法是手动删除专用队列并重新启动服务。然后系统再次正常工作,直到下一个麻烦: - (。

任何建议都会非常感激。

非常感谢! 的Alessandro

1 个答案:

答案 0 :(得分:0)

UseMulticastSubscriptionClient似乎不是处理订阅的最稳定方式。我整个周末一直在努力让所有事情都正常运行,我现在有永久(多个)订阅。

在我对this question的回复中,我写下了自己的步骤。 这对你有帮助吗?