如何从Solace队列中轮询消息(而不是默认的推送行为)?

时间:2019-01-10 09:51:55

标签: c# .net messaging distributed-computing solace

我想编写基于Solace的并行执行模块。我为此使用request-reply模式。

我有:

  • 多个消息使用者,它们将消息发布到同一队列中。
  • 多个消息生产者,它们读取队列并创建回复消息。
  • 消息执行时间在10秒到10分钟之间。
  • 队列访问类型为non-exclusive(例如,它在所有使用者之间进行轮询)。
  • 每个生产者和消费者都是异步的,例如Solace API仅在连接期间阻止执行。

我想拥有的东西:如果在消息上产生效果,则它不应接收任何其他消息。这非常重要,因为某些任务会阻塞执行程序几分钟,而其他任务则会阻塞执行程序几秒钟后可以免费使用。

下面的方案是可行的(可能),但是下面显示了阻止代码。我想避免这种情况。

while(true)
{
    var inputMessage = flow.ReceiveMsg( /*timeout 1s*/1_000); // <--- blocking code, I'd like to avoid it

    flow.Ack(inputMessage.ADMessageId);

    var reply = await ProcessMessageAsync(inputMessage); // execute plus handle exceptions

    session.SendReply(inputMessage, reply)
}

1 个答案:

答案 0 :(得分:0)

仅将消息推送到使用中的应用程序。

话虽如此,通过将队列上的“ max-delivered-unacked-msgs-per-flow”设置为1,可以获得所需的行为。 这意味着绑定到队列的每个使用者仅允许有1条未确认的未确认消息。 下一条消息仅在确认该消息后才发送给使用者。

有关此功能的详细信息,请参见here

请注意,您的代码段似乎无效。 IFlow.ReceiveMsg仅在交易会话中使用,交易会话利用ITransactedSession.Commit来确认消息。