2014-01-15 62 views
2

我已经通过JMS使用C++编写了一个文本消息发送器程序。如何确保通过JMS succesfull发送文本消息?

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

假设状态== 0,这意味着只有该函数已经工作succesfull。这并不意味着我的短信已发送成功 如何确保我的短信已成功发送?我应该从JMS Queue获取ID还是确认回来?

回答

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(或者如果需要已确认的消息的副本,则为)。

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

此外,使用HTTP技能比EMS技能更容易找到开发人员,并且更容易找到EMS的信息HTTP,因此tibemsMsgRequestor选项将使招聘变得更加困难,解决问题的难度也更大。

由于这个HTTP是一个更好的选项IMO,用于请求回复或者希望确保发送的消息被成功处理时。