如何制作一个作用于'Producer \ Consumer Queue'的WCF服务?

时间:2012-07-01 13:37:18

标签: wcf triggers producer-consumer

我有一个WCF服务,有多个客户端连接到它并订阅事件。

我还有一个在后台运行的工作线程以及托管的WCF服务,并执行操作并将项目推送到'Producer \ Consumer Queue'

当队列中有项目时,如何使WCF服务动作,以便它可以从队列中提取项目,分析它 - 并向所有订阅的客户端发布消息?

我知道WCF服务会对从连接的客户端调用的操作做出反应,但是当项目排队到此队列时,如何让它响应呢?

如果可能的话,我会很感激能用简单代码示例回答的任何人。

2 个答案:

答案 0 :(得分:1)

最简单的方法是,您需要一个事件,您的wcf服务可以从队列中为该队列中的队列事件所取代,并在事件引发后开始处理该消息。对于非通用队列,您可以覆盖Enqueue方法以引发OnChanged事件。

public override void Enqueue(object obj)
{
    base.Enqueue(obj);
    OnChanged(EventArgs.Empty);
}

有关如何从通用队列引发事件的更多详细信息是here

//from worker thread
queue.Enqueue(some_object);

//in wcf you could probably do something like this
queue.OnChanged +=  ProcessMessage;

public void ProcessMessage(object sender, EventArgs e)
{
     lock(lock_object)
     {
          var some_object = queue.Dequeue;
          //processing logic and broadcasting to client
     }
}

答案 1 :(得分:0)

这是我的想法,这可能不是最好的,但它是一个开始。要为您的方案实现所需的功能,请创建两个WCF服务。第一个服务将被称为QueueService,它基本上保存和管理您的队列。第二个服务将其称为PublisherService,这个服务的目的是在从队列中添加/删除新项目时由QeueService通知。要实现这一点,您必须使用双工通道(应用发布订阅模式http://msdn.microsoft.com/en-us/library/ms752254.aspx),其中PublisherService充当QueueService的客户端。现在关于你将要使用PublisherService的客户......我不确定你到目前为止使用了什么技术。您是使用双工通道还是连续流来从PublisherService获取数据? (http://blog.john-thiriet.com/en/2011/08/using-reactive-extensions-for-a-push-based-client-server-communication-with-silverlight-and-wcf/)