2

我已经通过 JMS 编写了一个带有 C++ 的文本消息发送程序。

tibems_status status = TIBEMS_OK;
status = tibemsMsgProducer_SendToDestination(
                       m_tProducer,
                       m_tDestination,
                       m_tMsg );

假设 status == 0,这意味着只有 Function 工作成功。这并不意味着我的短信已成功发送 如何确保我的短信已成功发送?我应该从 JMS Queue 中获取 ID 或 Acknowledge 吗?

4

1 回答 1

2

这取决于消息传递模式

发送PERSISTENT消息后,tibemsMsgProducer_SendToDestination呼叫将等待 EMS 服务器回复确认。

发送NON_PERSISTENT消息时,tibemsMsgProducer_SendToDestination呼叫可能会或可能不会等待确认,具体取决于是否启用了授权和npsend_check_mode设置。有关具体详细信息,请参阅 EMS 文档(上面链接)。

最后,当RELIABLE_DELIVERY发送消息时,tibemsMsgProducer_SendToDestination调用不会等待确认,只有在与 EMS 服务器的连接丢失时才会失败。

但是,即使在发送确认的情况下,这也只是确认 EMS 服务器已收到消息。它不确认消息已被消息使用者接收和处理。EMS 监控消息可用于确定消息是否已被消费者确认。

消息监控主题的格式为$sys.monitor.<D>.<E>.<destination>,其中<D>matches Q|q|T|t<E>matchess|r|a|p|\*<destination>是目的地的名称。例如,要监视名为 的队列的消息确认beterman,您的程序将订阅$sys.monitor.q.a.beterman(或者$sys.monitor.Q.a.beterman如果您想要已确认消息的副本)。

监控消息包含许多属性msg_id,包括、source_nametarget_name。您可以使用该信息将其与您发送的消息相关联。

否则,更简单的选择是使用 atibemsMsgRequestor而不是 a tibemsMsgProducertibemsMsgRequestor_Request将发送消息并等待收件人的回复。在这种情况下,您最好使用RELIABLE_DELIVERYNO_ACKNOWLEDGE删除生产者与 EMS 服务器以及 EMS 服务器与消费者之间的所有确认和确认消息。

但是,如果您确实走这tibemsMsgRequestor条路,那么您可能还想考虑简单地使用 HTTP 请求,用负载平衡器代替 EMS 服务器。在架构上,这两个选项之间没有太大区别(EMS 使用持久 TCP 连接,HTTP 不使用)

Producer ->   EMS Server  -> ConsumerA
                          -> ConsumerB

  Client -> Load Balancer -> ServerA
                          -> ServerB

但是对于HTTP,每个方法都有清晰的语义。GET 是安全的(不改变状态),PUT 和 DELETE 是幂等的(多个相同的请求应该与单个请求具有相同的效果),POST 是非幂等的(每次执行都会导致服务器状态发生变化)等。您也有明确定义的状态代码。如果您正在使用tibemsMsgRequestor,则需要创建定制的语义和响应状态,这将需要额外的努力来创建、维护和培训团队中的其他开发人员。

此外,找到具有 HTTP 技能的开发人员比 EMS 技能要容易得多,而且找到 EMS 的 HTTP 信息要容易得多,因此该tibemsMsgRequestor选项将使招聘更加困难,解决问题更加困难。

因为这个 HTTP 是一个更好的选择 IMO,用于请求-回复或当您想要确保发送的消息被成功处理时。

于 2014-01-16T11:58:53.043 回答