2016-06-07 50 views
1

我有以下製片人:如何知道使用JCSMP發佈消息時是否有錯誤?

XMLMessageProducer producer = session.getMessageProducer(new JCSMPStreamingPublishEventHandler() { 
@Override 
public void handleError(String messageID, JCSMPException cause, long timestamp) { 
    logger.error("Error occurred when sending message {} ", messageID, cause); 
} 

// This method is only invoked for persistent and non-persistent 
// messages. 
@Override 
public void responseReceived(String messageID) { 
    logger.info("Response received for message {} ", messageID); 
} 
}); 

當調用producer.send()發佈消息到一個話題,我怎麼知道是否有因爲responseReceived()任何錯誤的直接信息,則不會調用?由於消息是異步發佈的,何時會調用JCSMPStreamingPublishEventHandlerhandleError()?在我們可以斷定發佈消息沒有錯誤之前,我應該等待多久?

謝謝。

回答

0

當調用producer.send()發佈消息到一個話題,怎麼辦 我知道是否有因爲responseReceived()任何錯誤不 調用的直接信息?

documentation中,直接消息傳遞提供了從Solace消息總線到消費客戶端的消息的可靠但不能保證傳遞。當需要極高的消息速率和極低的延遲時,通常使用它們。權衡是當遇到擁塞或系統故障時它們也可以被丟棄。這就是爲什麼沒有確認發送直接消息的原因。

由於消息是同步發佈,什麼時候會的 JCSMPStreamingPublishEventHandlerhandleError()叫?在我們可以斷定發佈消息 沒有錯誤之前,我應該等待多長時間 ?

對於直接消息,將不會確認發佈成功。當JCSMPSession.send()返回時,表示API已將數據寫入TCP發送緩衝區。系統故障(例如發生後的網絡斷開連接)將不會被檢測到,並且該消息可能會丟失。

對於保證消息,當調用responseReceived()時,消息只能保證在設備/ VMR上被假脫機。如果發生錯誤,將調用handleError()

+1

我剛剛測試了的HandleError()是當我發佈到無效的ACL的話題,叫做如下圖所示:發送消息0 ((客戶端名稱時出錯:嚴重NCS-060613KS01/55284 /#000b0001本地地址:10.70.202.136:60541遠程地址:192.168.204.119:55443) - )com.solacesystems.jcsmp.JCSMPErrorResponseException:403:發佈ACL拒絕 - 主題'ccs1/topic12'[子代碼:28] –

+0

是的,這是正確的,我我忽視了這一點。很快編輯答案。 –

相關問題