c++ - 如何确保通过 JMS 成功发送短信?

标签 c++ jms tibco tibco-ems

我通过 JMS 使用 C++ 编写了一个短信发送程序。

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

假设 status == 0,这仅意味着 Function 已成功运行。这并不意味着我的短信发送成功 如何确保我的消息已成功发送?我应该从 JMS 队列获取 ID 或确认吗?

最佳答案

这取决于 Message Delivery Mode .

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

NON_PERSISTENT消息发送后,tibemsMsgProducer_SendToDestination调用可能会或可能不会等待确认,具体取决于是否启用授权以及 npsend_check_mode环境。有关具体详细信息,请参阅 EMS 文档(上面链接)。

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

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

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

monitoring messages contain many properties ,包括 msg_id , source_nametarget_name 。您可以使用该信息将其与您发送的消息关联起来。

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

但是,如果您确实选择了 tibemsMsgRequestor路由,那么您可能还需要考虑简单地使用 HTTP 请求,并使用负载均衡器代替 EMS 服务器。从架构上来说,这两个选项之间没有太大区别(EMS 使用持久 TCP 连接,HTTP 不使用)

Producer ->   EMS Server  -> ConsumerA
                          -> ConsumerB

  Client -> Load Balancer -> ServerA
                          -> ServerB

但是与 HTTP you have clear semantics for each of the methods 。获取是 safe (不改变状态),PUT 和 DELETE 为 idempotent (多个相同的请求应与单个请求具有相同的效果),并且 POST 是非幂等的(每次执行时都会导致服务器状态发生变化)等。您还有 well defined status codes 。如果您使用tibemsMsgRequestor您需要创建定制的语义和响应状态,这将需要额外的精力来创建、维护和培训团队中的其他开发人员。

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

因为在我看来,此 HTTP 是一个更好的选择,对于请求-回复或当您想要确保发送的消息已成功处理时。

关于c++ - 如何确保通过 JMS 成功发送短信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21135269/

相关文章:

c++ - 套接字,请求http网页

jakarta-ee - weblogic 10.3 上的单例

c# - 当 TIBCO EMS 服务器尝试故障转移时,客户端应该做什么?

java - 连接到 ActiveMQ 服务器的 Android 应用程序

java - ActiveMQ 向 StompConnection 注册监听器

cross-browser - 您使用 TIBCO 通用界面的体验如何?

visualization - 如何在 Spotfire 中的过滤器中隐藏特定值?

c++ - 何时为此结构调用复制构造函数?

c++ - 子类怎么调用父类初始化成员变量的构造函数不同呢? [C++]

c++ - scons 如何将 sysroot 传递给 g++