Windows services Microsoft服务间通信问题

Windows services Microsoft服务间通信问题,windows-services,msmq,message-queue,Windows Services,Msmq,Message Queue,我目前正在构建两个windows服务: 第一个从internet连接获取消息并将其插入数据库。这是为了快速和稳定,不做任何其他处理 第二个执行批处理,处理自上次运行以来到达的任何新消息 我试图想出一种方法,使第二个服务只在新消息准备好处理时运行其批处理过程,如果第二个服务出错,第一个服务将继续运行,反之亦然。目前,它每5秒使用一个循环 我目前正在考虑使用消息队列,其中第一个服务仅在队列为空时写入消息,第二个服务将查看队列是否包含任何消息,如果没有,则进入异步等待,直到消息到达,然后删除消息并

我目前正在构建两个windows服务:

  • 第一个从internet连接获取消息并将其插入数据库。这是为了快速和稳定,不做任何其他处理

  • 第二个执行批处理,处理自上次运行以来到达的任何新消息

我试图想出一种方法,使第二个服务只在新消息准备好处理时运行其批处理过程,如果第二个服务出错,第一个服务将继续运行,反之亦然。目前,它每5秒使用一个循环

我目前正在考虑使用消息队列,其中第一个服务仅在队列为空时写入消息,第二个服务将查看队列是否包含任何消息,如果没有,则进入异步等待,直到消息到达,然后删除消息并运行。因此,使用队列并不是真正的队列,而是一个二进制开关,当它的状态发生变化时,会触发第二个服务的事件


我想有一种更好的方法可以做到这一点,但我没有遇到过。有人能给我指出正确的方向吗?

事实上,你的方法是正是我将如何实现这些结果。使用MSMQ,您不必检查是否有消息写入队列,第一个服务只是写入队列,第二个服务只是从队列中读取以处理它(当它处于活动状态时)


使用MSMQ的好处在于,一个或另一个服务可能会关闭,但队列将打开,因此您可以继续处理。

在我看来,在这种情况下,您所需要的只是一个邮箱。第一个服务存储到数据库中,然后发送一条“要做的工作”消息。另一个只是等待入站消息


对于这么简单的东西,MSMQ有点重。然后,您可以再次使用MSMQ并完全删除该DB。这就是解决问题的方法。

谢谢你的回答。我已经详细阐述了我上面的问题。实际上,我可能滥用了这里的队列机制,因为我想将消息存储在数据库中,而不是全部存储到队列中,所以将队列用作触发事件的二进制开关。这样行吗?你可以这样做。在队列中发送消息时,只需发送与数据库中记录的id相对应的id。但是,在这两方面,您都应该将数据库记录和队列消息的写入以及事务中的接收包装起来。我同意,尽管我上面的一些人不同意。他们的论点是,如果队列损坏或内存不足,我们可能会丢失消息。你可以说数据库可能也有同样的问题,尽管这是他们决定的。