发布/消费:等待订阅,过滤消息并处理

时间:2016-12-24 17:00:56

标签: c# .net system.reactive reactivex

使用Rx.Net 3

通过使用Quartz.Net Scheduler,我构建了一个工作流管理器,用于将作业(使用完成作业的Quartz Joblistener)与嵌入式Web服务器链接起来。 应用程序实例化Subject(单例)的实例。

Web服务获取数据并启动工作流,注入唯一ID。此唯一ID通过工作流传播。 Joblistener委托检测特定作业的结束,并在注入的Subject实例上调用OnNext,其中Type包含唯一ID和DB表ID。

这个想法是每次调用的Web服务都订阅了Subject并等待传入​​的消息/事件,并在唯一ID上过滤它们。当找到处理订阅时,收集并将生成的数据返回给调用者。

如何让我的Subscribe()等待收到的消息,过滤它们和Dispose(),而不会过早地完成Web服务。

2 个答案:

答案 0 :(得分:0)

// model
public class AsyncCommunicationObject
{
    public string Key { get; }
    public string Value { get; }

    public AsyncCommunicationObject(string key, string value)
    {
        Key = key;
        Value = value;
    }
}

// injectable singleton 
public static Subject<AsyncCommunicationObject> AsyncCommunication { get; set; } = new Subject<AsyncCommunicationObject>();

// in web service           
System.Threading.EventWaitHandle waitHandle = new System.Threading.AutoResetEvent(false);
string yourID = some ID

var subscription = _asyncCommunication (injected)
    .Where(x => x.Key == yourID)
    .Take(1)
    .Subscribe(
        x =>
        {
            dbId = x.Value;
            waitHandle.Set();
        }
    );

_schedulerCore.ExecuteJob(upload.JobId, jobDataMap);

waitHandle.WaitOne();
waitHandle.Reset();

subscription.Dispose();

// in job listener
_asyncCommunication.OnNext(new AsyncCommunicationObject(your ID, some value)

答案 1 :(得分:0)

您无需手动处理订阅。 任何边界运算符(如TakeFirst信号OnCompleted都会导致序列被丢弃。您还可以使用await observables来避免编写回调。

例如, dbId = await AsyncCommunication.FirstAsync(x => x.Key == id)