0

我想知道是否可以将代理消息发送到消息已经处于延迟状态的队列/主题?

我问这个是因为我目前有一个执行以下操作的过程......

  1. 该过程开始并将代理消息发送到队列(这会触发一个函数,该函数将消息主体作为一个实体记录在表存储中,并具有“处理”状态)。
  2. 在此过程中完成了额外的工作
  3. 如果我们在没有任何问题的情况下完成该过程,则会将另一条代理消息与完成消息一起发送到队列(这会触发将表存储中的实体更新为“完成”状态的相同功能)。

虽然这种方法主要是有效的,但它感觉笨重和脆弱。我真的希望能够向队列发送消息,然后在最后一步使消息在队列中可见,以便函数可以使用它(持久函数)。

我考虑过设置ScheduledEnqueueTimeUtc,但我不能保证该过程何时完成(我在这里考虑最坏的情况)所以我不确定设置它多长时间。

我还查看了Defera 的选项,BrokeredMessage但似乎只能从接收器设置,并且最初不能处于延迟状态。

我正在尝试对服务总线代理消息做些什么?我可以将预定的入队时间设置得这么长(例如 2 小时),如果达到那个时间,它会自动过期并移至死信队列吗?我是否应该将初始消息发送到死信队列,然后在该过程完成后检索它并重新提交?

有没有人有任何实现这样的过程的经验......发送一个开始消息并且只有在收到完成通知后才处理该消息?我需要它尽可能稳健,因为我在这个过程中处理金融交易。

希望我的解释是有道理的。

4

2 回答 2

0

我最终通过保留发送两条消息的过程解决了这个问题,但重构了我的持久函数以将消息记录Table StorageAzure Queue Storage. 第二个函数监听启动其进程的队列。

经过大量测试,这似乎是一个非常强大的解决方案。然后,这两条消息以什么顺序到达,或者它们需要多长时间都无关紧要……只要它们都到达,那就是第二个函数将启动的时间。

于 2018-09-03T03:21:10.037 回答
0

I'm wondering if it is possible to send a brokered message to a queue/topic where the message is already in a deferred state?

That's not possible. You can only delay a brand new message, not defer it. Deferring required a message to be received first for it to have a SequenceNumber.

Using ScheduledEnqueueTimeUtc has its challenges as you will be sending it in the future, but cannot cancel once processing is over. Instead, you could leverage QueueClient.ScheduleMessageAsync() that returns back SequenceNumber immediately. This way you can set the message far into future, but also cancel it if processing is finished earlier.

于 2018-08-27T03:26:13.433 回答