代码之家  ›  专栏  ›  技术社区  ›  Manushin Igor

如何轮询来自SOLACE队列的消息(而不是默认的推送行为)?

  •  0
  • Manushin Igor  · 技术社区  · 6 年前

    我想写一个基于solace的并行执行模块。我用 request-reply 此的架构。

    我有:

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

    我想要的是: 如果products对消息有效,则不应接收任何其他消息。 这是非常重要的,因为有些任务会阻塞执行器几分钟,但是其他执行器几秒钟后就可以释放了。

    下面的方案是可行的(可能的),但是下面显示了阻塞代码。我想避开它。

    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 回复  |  直到 6 年前
        1
  •  0
  •   Russell Sim    6 年前

    消息只被推送到消费应用程序。

    也就是说,可以通过将队列上的“每个流的最大传递未确认MSG数”设置为1来获得所需的行为。 这意味着绑定到队列的每个使用者只能有1条未确认的未完成消息。 下一条消息只有在确认消息后才会发送给消费者。

    可以找到有关此功能的详细信息 here .

    请注意,代码段似乎无效。 IFlow.ReceiveMsg 仅在事务处理会话中使用,它使用 ITransactedSession.Commit 确认信息。