我将在C#中使用MSMQ来读取消息;我将它放在Window Service中,所以在OnStart上我将开始使用queue.Receive方法读取消息,这将是阻塞/同步调用。和OnEnd方法我想用queue.Close(); queue.Dispose()。
这种方法有什么缺点吗?
由于 海洋
答案 0 :(得分:2)
这是不正确的方法。在服务启动时调用OnStart
一次,你应该放置初始化逻辑。例如,启动线程将在循环中调用Receive
。
答案 1 :(得分:1)
你的方法对我来说很好。我唯一的建议是确保您打算部署Windows服务的每台计算机位于同一个域中,或者位于具有相互信任且位于同一林中的域中。我最近遇到了一个问题,我继承了使用MSMQ的解决方案,其工作方式与上面提到的方法大致相同。它被测试为在单个域上工作而没有性能问题。不幸的是,客户正处于合并的过程中,当需要在更广泛的公司实施解决方案时,结果是解决方案必须在不同森林中不同域中存在的机器上实现,在这种情况下,MSMQ根本不工作,完全不得不使用另一种方法。
答案 2 :(得分:1)
这是一种相当常见的模式,但它有一些缺点。
首先,您应该考虑使用线程池(或4.0中的.NET并行库)来异步处理您的消息。您的队列读取器是否可以异步取决于您的事务模式。处理是原子的吗?
其次,您还应该考虑使用一个计时器(System.Timers.Timer),它在OnStart中启动并在OnEnd中结束,并在每个计时器事件中从队列中读取一条或多条消息。
第三,你应该认真考虑使用WCF MSMQ绑定,它可以处理这些东西的很多复杂性。