Rxjs 使用可观察对象处理在处理结束时需要回调的队列消息?

Rxjs 使用可观察对象处理在处理结束时需要回调的队列消息?,rxjs,rx-java,reactive-programming,system.reactive,Rxjs,Rx Java,Reactive Programming,System.reactive,这是一个有点概念性的问题,所以如果不符合主题,请告诉我 我正在考虑编写另一个库来处理队列中的消息—在本例中是Azure存储队列。创建一个可观察对象并在每次有消息可用时向其中抛出消息是非常容易的 然而,这里有一个障碍,我不知道如何处理。问题是:处理完消息后,需要调用存储队列上的API来实际删除消息。否则,可见性超时将过期,消息将重新出现以再次退出队列 作为一个例子,下面是这个循环在C#中的外观: 公共事件事件处理程序OnMessage; 公开募捐 { while(true) { //阅读信息 va

这是一个有点概念性的问题,所以如果不符合主题,请告诉我

我正在考虑编写另一个库来处理队列中的消息—在本例中是Azure存储队列。创建一个可观察对象并在每次有消息可用时向其中抛出消息是非常容易的

然而,这里有一个障碍,我不知道如何处理。问题是:处理完消息后,需要调用存储队列上的API来实际删除消息。否则,可见性超时将过期,消息将重新出现以再次退出队列

作为一个例子,下面是这个循环在C#中的外观:

公共事件事件处理程序OnMessage;
公开募捐
{
while(true)
{
//阅读信息
var message=queue.GetMessage();
如果(消息!=null)
{
//运行任何处理程序
OnMessage?.Invoke(这个,message.AsString);
//完成后删除队列
queue.DeleteMessage(消息);
}
其他的
{
睡眠(2500);
}
}
}
这里重要的是,我们读取消息,触发任何已注册的事件处理程序进行处理,然后在处理程序完成后删除消息。我在这里省略了错误处理,但通常情况下,如果处理程序失败,我们不应该删除消息,而是让它自动恢复可见性,稍后重新交付

你如何使用Rx处理这种事情?理想情况下,我希望向任何订阅的人公开可观察到的内容。但是我需要在消息处理结束时做一些事情,不管这里的“结束”是什么意思

我可以想出几个可能的解决办法,但我真的不喜欢其中任何一个。一种方法是让库调用消费者提供的函数,该函数接收源可观察对象,连接它想要的任何东西,然后返回一个新的可观察对象,然后库可以订阅该可观察对象以进行最终清理。但这相当有限,因为消费者基本上只有一次机会连接到消息,这似乎相当有限

我想我可以把删除消息的调用放在调用onNext之后,但是我不知道处理是成功还是失败,除非api中有某种我不知道的反向通道


有什么想法/建议/以前的经验吗?

试着玩一下:

IObservable<int> source =
    Observable
        .Range(0, 3)
        .Select(x =>
            Observable
                .Using(
                    () => Disposable.Create(() => Console.WriteLine($"Removing {x}")),
                    d => Observable.Return(x)))
        .Merge();

source
    .Subscribe(x => Console.WriteLine($"Processing {x}"));
IObservable源=
可观察
.范围(0,3)
.选择(x=>
可观察
.使用(
()=>Disposable.Create(()=>Console.WriteLine($“删除{x}”),
d=>Observable.Return(x)))
.Merge();
来源
.Subscribe(x=>Console.WriteLine($“处理{x}”);
它产生:

Processing 0 Removing 0 Processing 1 Removing 1 Processing 2 Removing 2 正在处理0 删除0 处理1 删除1 处理2 删除2
如果您只是使用标准命令式C#代码,您能提供一个关于此代码如何运行的示例吗?然后我们希望向您展示Rx将如何处理它。现在描述没有告诉我如何编写解决方案。这实际上是反应性数据流中的一个开放性研究问题:双向性和项目生命周期意识。如果只是一个步骤,那么使用ReactiveX是可行的,但是,当允许多个用户步骤和/或fork-join样式处理时,这就很难实现,并且可能需要一个全新的ReactiveX库体系结构,包括协议重新设计等。我不知道这方面有任何研究或开发。@Enigmativity我已经添加了一些简单的示例代码来演示所需的逻辑。@akarnokd如果确实是这样,你应该将其作为一个答案,而不是评论,以便我可以接受。@ChrisTavares-我已经为你提出了一个潜在的解决方案。不过它有点脆弱,因为订阅者应该导致队列被填充。如果没有这一点,多个订阅者可能会成为您的问题。不管怎么说,去看场戏,看看它是否适合你。 Processing 0 Removing 0 Processing 1 Removing 1 Processing 2 Removing 2