2010-07-23 50 views
1

我正在为Azure创建一个WCF服务(CALLER)。服务(CALLER)调用另一个第三方服务(EXTN)的异步方法。第三方服务调用由Azure托管的另一个WCF服务(LISTNER)的回调方法。 CALLER在status = PENDING中输入数据库中的服务详细信息。这是轮询数据库的正确方法吗?

在回调服务(LISTNER)中,我将数据库中的请求状态更新为COMPLETED/FAILED。

但我希望在SQL Azure数据库中更新状态时通知CALLER。

我想创建一个工作线程,它会定期轮询数据库来检查状态更新并通知CALLER这件事。

有没有其他更好/更有效的替代方法?

回答

0

不是。还有另外一种方法(不确定它是否可以在azure上运行),方法是使用集成的SQL消息队列(通过触发器更新队列),然后您的线程可以连续轮询(有一种方法可以在etnry中读取WAIT所以你发出一个,它等待),但除此之外...

...不,不是从数据库级别。

我有一个类似的应用程序,我通过一个批准触发器处理它OUTSIDE数据库(即通知从值改变的业务逻辑发送)。

+0

您能否提供详细资料? – Ram 2010-07-23 12:11:21

1

您正在寻找的功能在AppFabricservice bus中实现。

+0

嗨Jefferey, 请您详细说明一下吗? – Ram 2010-08-03 06:40:03

+1

听起来你正在实现一个经典的[Database-as-IPC] [1]。 AppFabric服务总线将允许您创建发布/订阅事件系统。作为服务总线发布者的LISTENER将发布'im done和status is'消息到服务总线中,然后作为服务总线用户的CALLER将接收消息并对其执行操作。 [1]:http://en.wikipedia.org/wiki/Database-as-IPC – JeffreyABecker 2010-08-03 19:36:41

0

另一种选择是使用队列并让调用者轮询来自侦听器的通知消息。服务总线可以通过让调用者订阅从监听器发送的事件通知来使用。在你的场景中,尽管它不提供比队列更多的功能 - 如果你在防火墙后面,服务总线也使用轮询。

队列可能是发送通知最有效的方式 - 这就是为什么它们是首先创建的。服务总线用于通过提供比简单消息传递更多的功能来创建不同服务之间的半永久连接。这使得它不够灵活,需要更多的编程。其计费模式(按SB连接计费)也反映了这一点。您不需要使用很多SB连接。

相关问题