2014-01-15 94 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,用於請求回覆或者希望確保發送的消息被成功處理時。