如何确保通过JMS成功发送文本消息?

时间:2014-01-15 10:43:55

标签: 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 Queue获得ID还是Acknowledge?

1 个答案:

答案 0 :(得分:2)

取决于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_idsource_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。 GET是safe(不更改状态),PUT和DELETE是idempotent(多个相同的请求应该与单个请求具有相同的效果),POST是非幂等的(它会导致更改)服务器状态每次执行时)等等。您还有well defined status codes。如果您正在使用tibemsMsgRequestor,则需要创建定制的语义和响应状态,这需要额外的努力来创建,维护和培训团队中的其他开发人员。

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

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