我如何从 Solace 队列中轮询消息(而不是默认的推送行为)?
How I can poll messages from Solace queue (instead of default pushing behavior)?
我想写一个基于Solace的并行执行模块。我为此使用 request-reply 模式。
我有:
- 多个消息消费者,将消息发布到同一个队列中。
- 多个消息生产者,读取队列并创建回复消息。
- 消息执行时间在 10 秒到 10 分钟之间。
- 队列访问类型是non-exclusive(例如,它在所有消费者之间进行循环)。
- 每个生产者和消费者都是异步的,例如Solace API 仅在连接期间阻止执行。
我想要的是:如果 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
确认消息。
我想写一个基于Solace的并行执行模块。我为此使用 request-reply 模式。
我有:
- 多个消息消费者,将消息发布到同一个队列中。
- 多个消息生产者,读取队列并创建回复消息。
- 消息执行时间在 10 秒到 10 分钟之间。
- 队列访问类型是non-exclusive(例如,它在所有消费者之间进行循环)。
- 每个生产者和消费者都是异步的,例如Solace API 仅在连接期间阻止执行。
我想要的是:如果 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
确认消息。