2011-02-04 47 views
0

我将在C#中使用MSMQ来读取消息;我把它放在Window服务中,OnStart我将开始使用queue.Receive方法读取消息,这将是阻塞/同步调用。 OnEnd方法我想用queue.Close()停止队列。 queue.Dispose()。MSMQ C#实现使用服务(ServiceBase)

这种方法有什么缺点吗?

感谢 海洋

回答

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

1

你的方法看起来好像没什么问题。我唯一的建议是确保您打算部署Windows服务的每台计算机都位于同一个域中,或者位于互信域名为的域中,并且位于相同的林内。我最近遇到了一个问题,那就是我继承了一个使用MSMQ的解决方案,其工作方式与上面提出的方法大致相同。它被测试为在没有性能问题的单个域中工作。不幸的是,客户正在进行合并,当在整个公司范围内实施解决方案时,事实证明该解决方案必须在存在于不同森林的不同域中的机器上实施,在这种情况下,MSMQ根本不会工作,完全不得不使用另一种方法。

+0

我假设你的队列是公开的而不是私人的。专用队列不关心域/ Active Directory,但验证访问这些队列的权限除外。 – RMD 2011-02-04 20:54:39

+0

“,但验证访问这些队列的权限除外” - 这是该声明的关键部分。 – Rachel 2011-02-04 21:14:21

2

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