簡體   English   中英

面向TIBCO EMS服務器的Spring JMS使用者自行到期

[英]Spring JMS Consumers to a TIBCO EMS Server expire on their own

我們已經構建了一個Spring Boot消息服務,該服務偵聽TIBCO EMS(企業消息服務)服務器上托管的JMS隊列。 這是一個相當簡單的應用程序,它接收JMS消息,進行一些數據操作並更新數據庫。

問題在於,有時隊列中沒有JMS使用者,並且未處理傳入消息。 但是,Spring Boot應用程序已啟動並正在運行(已通過ps -ef驗證)。 重新啟動該應用程序可恢復使用者,但不幸的是,這在生產等方面不是可行的解決方案。

其他有趣的事實:

  • 我們已經觀察到,當JMS服務器接受SSL流量並將其部署為容錯對時,就會發生這種情況(盡管這是一個令人困惑的觀察)
  • 當使用者關閉時,日志中絕對沒有任何指示(例如錯誤)。
  • 我們正在使用Spring-JMS(4.1.0)和TIBCO EMS(8.3.0)

實例化DefaultJmsListenerContainerFactory的代碼段:

@Bean
public DefaultJmsListenerContainerFactory listenerJmsContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    TibjmsQueueConnectionFactory cf = new TibjmsQueueConnectionFactory("tcp://localhost:7222");
    cf.setUserName("admin");
    cf.setUserPassword("");
    factory.setConnectionFactory(cf);
    return factory;
}

JMS偵聽器:

@JmsListener(destination = "queue.sample", containerFactory = "listenerJmsContainerFactory")
public void listen(TextMessage message, Session session) throws JMSException{
    System.out.println("Received Message: "+message.getJMSMessageID());
    System.out.println("Acknowledgement Mode: "+session.getAcknowledgeMode());
// Some more application specific stuff
}

當我們嘗試在Spring Boot和TIBCO端都設置其他日志記錄時,我們想檢查一些點,例如:

  • 消費者閑置超過一定時間會自動到期嗎?
  • 這受DMLC設置(例如idleConsumerLimit,idleTaskExecutionLimit等)支配嗎?
  • 可以在上面提到的Spring Boot代碼中查看這些屬性嗎? 例如,在上面的代碼中,JMS偵聽器由DefaultJmsListenerContainerFactory在后台創建。 因此,我們如何訪問DMLC對象,以便調用諸如getIdleConsumerLimit(),getIdleTaskExecutionLimit()等方法。

感謝您的投入,Prabal

最有可能的是,網絡中的某些東西(路由器,防火牆等)正在默默地丟棄空閑連接。

盡管不是JMS規范的一部分,但大多數供應商都實現了某種心跳機制,以便客戶端/服務器不時交換ping,以防止網絡組件采取此類操作和/或檢測此類情況。

查看Tibco文檔,了解如何配置心跳(他們可能將其稱為其他信號)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM