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

How I can poll messages from Solace queue (instead of default pushing behavior)?

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

我有:

我想要的是:如果 produces 对消息起作用,它不应该接收任何其他消息。 这非常重要,因为一些任务会阻塞多个执行器分钟,但是其他执行者可以在几秒钟后空闲。

下面的方案是可行的(可能的),但是阻塞代码出现在下面。我想避免它。

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)
}

消息仅推送到消费应用程序。

也就是说,您可以通过将队列上的 "max-delivered-unacked-msgs-per-flow" 设置为 1 来获得您想要的行为。 这意味着绑定到队列的每个消费者只允许有 1 个未完成的未确认消息。 下一条消息只有在消费者确认消息后才会发送给消费者。

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

请注意,您的代码片段似乎无效。 IFlow.ReceiveMsg is only used in transacted sessions, which makes use of ITransactedSession.Commit 确认消息。