如何使服务在特定时间不接收消息

时间:2010-03-29 10:19:55

标签: wcf msmq

我正在学习wcf来完成一个即将到来的项目。 我正在创建的服务是使用MSMQ来更新数据库,但数据库在某些时候无法接受消息。

该服务将成为Windows服务。我现在面临的一件事就是如何在这些时候让服务停止从队列中读取消息,例如假设我不想在星期天从队列中读取消息。我将如何实现这一目标。这样客户端就可以将消息发送到更新数据库的队列,但服务直到星期一才读取消息,以便数据库在星期一获得所有更新?

我已经开始考虑创建一个自定义主机,但我不确定我是否正朝着正确的方向前进。

提前致谢。

4 个答案:

答案 0 :(得分:1)

你可以写这样的东西。

If Date.Now.DayOfWeek = DayOfWeek.Sunday Then
 <Store it in a List(Of <MyClass>) > 
ElseIf Not <List(Of <MyClass>)> is Nothing Then
 <Call update Db function passing <List(Of <MyClass>)> and clear <List(Of <MyClass>)>)
End If

因此,如果它是星期天,您只需存储消息,如果不是,您将使用存储的消息更新数据库并清除该存储。

答案 1 :(得分:0)

这实际上并不是WCF可以帮助你的 - 这是你的应用程序的逻辑。

如果您不想在星期日接受任何消息 - 请在星期日关闭Windows服务。您可以使用计划任务执行此操作,例如星期六23:59:59将其关闭,并在星期一早上将其重新打开或等等。

或者在你的代码中处理它 - 如果它是星期天,不要处理任何消息。

这与WCF无关,我会说。 WCF中没有任何内容允许您在给定的时间段内“禁用”或隐藏WCF服务。

答案 2 :(得分:0)

我将基本上用我认为你想要的逻辑重新发布@ hgulyan的回答:

If Date.Now.DayOfWeek = DayOfWeek.Sunday Then
 ' Do nothing, it is Sunday and I don't want to process anything. 
Else
 ' Call function that processes messages in MSMQ
End If

通过这种方式,您的服务可以随时运行,但如果是星期天......它什么都不做。

答案 3 :(得分:0)

为了最终获得一个有效的解决方案,我推出了自己的IInputChannel(它覆盖了WaitForMessage和BeginWaitForMessage方法,以便它们在星期日返回False)这是因为频道无法接收任何消息,我还创建了一个新通道侦听器实现自定义通道,然后为通道侦听器创建一个新的bindingelement。

我不得不改变一些事情,比如消息的生存时间以及频道监听器的默认超时。

服务的基础知识已经完成,我现在有一个工作概念可以继续。