使用服务的MSMQ C#实现(ServiceBase)

时间:2011-02-04 20:40:24

标签: c# service msmq

我将在C#中使用MSMQ来读取消息;我将它放在Window Service中,所以在OnStart上我将开始使用queue.Receive方法读取消息,这将是阻塞/同步调用。和OnEnd方法我想用queue.Close(); queue.Dispose()。

这种方法有什么缺点吗?

由于 海洋

3 个答案:

答案 0 :(得分:2)

这是不正确的方法。在服务启动时调用OnStart一次,你应该放置初始化逻辑。例如,启动线程将在循环中调用Receive

答案 1 :(得分:1)

你的方法对我来说很好。我唯一的建议是确保您打算部署Windows服务的每台计算机位于同一个域中,或者位于具有相互信任且位于同一林中的域中。我最近遇到了一个问题,我继承了使用MSMQ的解决方案,其工作方式与上面提到的方法大致相同。它被测试为在单个域上工作而没有性能问题。不幸的是,客户正处于合并的过程中,当需要在更广泛的公司实施解决方案时,结果是解决方案必须在不同森林中不同域中存在的机器上实现,在这种情况下,MSMQ根本不工作,完全不得不使用另一种方法。

答案 2 :(得分:1)

这是一种相当常见的模式,但它有一些缺点。

首先,您应该考虑使用线程池(或4.0中的.NET并行库)来异步处理您的消息。您的队列读取器是否可以异步取决于您的事务模式。处理是原子的吗?

其次,您还应该考虑使用一个计时器(System.Timers.Timer),它在OnStart中启动并在OnEnd中结束,并在每个计时器事件中从队列中读取一条或多条消息。

第三,你应该认真考虑使用WCF MSMQ绑定,它可以处理这些东西的很多复杂性。

请参阅:http://jamescbender.com/bendersblog/archive/2009/04/04/the-one-where-i-talk-about-the-msmq-binding.aspx