我通过 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_name
和target_name
。您可以使用该信息将其与您发送的消息关联起来。
否则,更简单的选择是使用 tibemsMsgRequestor
而不是tibemsMsgProducer
。 tibemsMsgRequestor_Request
将发送消息并等待收件人的回复。在这种情况下,您最好使用 RELIABLE_DELIVERY
和NO_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/