【问题标题】:How to make a WCF service that acts on a 'Producer\Consumer Queue'?如何制作作用于“生产者\消费者队列”的 WCF 服务?
【发布时间】:2012-07-01 13:37:18
【问题描述】:

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

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

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

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

如果可能的话,我将不胜感激任何可以用简单的代码示例回答的人。

【问题讨论】:

    标签: wcf triggers producer-consumer


    【解决方案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
         }
    }
    

    【讨论】:

    • 是的,但是 WCF 服务将在哪里注册此事件?在服务的构造函数中?如果在服务处理来自它的一个客户端的消息时引发事件会发生什么?这是好的编程吗?好像不是……
    • 当你使用多个线程时,竞争条件必然会发生。处理它的责任在于我们,程序员(或者干脆选择不做多线程应用程序)。如果您看得足够仔细,我在使项目出队时使用了“锁定”语句,以避免出现竞争条件。我不明白你对好的编程的概念是什么。
    • 回答您的“但是 WCF 服务将在哪里注册此事件”。是的,构造函数似乎是个好地方。 (如果我是你,我会让队列静态)。我也希望你的工作线程是在你的 wcf 服务中产生的..
    【解决方案2】:

    这是我的想法,这可能不是最好的,但它是一个开始。要为您的方案实现所需的功能,请创建两个 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/)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多