2015-10-15 190 views
1

我正在開發一個系統集成主題的小型項目,並且正在使用JMS(JBOSS)。我們必須使用耐用的話題,而這一部分非常簡單。假設我使用下面的代碼:無法在持久訂閱上創建訂閱

TopicConnectionFactory topicConnectionFactory = InitialContext.doLookup("jms/RemoteConnectionFactory"); 
try(JMSContext jmsContext = topicConnectionFactory.createContext(<username>,<password>)) { 
    Topic topic = InitialContext.doLookup(<topic>); 
    JMSConsumer jmsConsumer = jmsContext.createDurableConsumer(topic, <client-id>); 
    Message message = jmsConsumer.receive(); 
    if(message != null) { 
     result = message.getBody(ArrayList.class); 
    } 
} 

這種try-with-resources是有用的,因爲它在塊結束時破壞連接。但假設我在JMSConsumer等待消息時中斷程序。當我重新啓動該程序,它會拋出:

javax.jms.IllegalStateRuntimeException: Cannot create a subscriber on the durable subscription since it already has subscriber(s) 

有沒有辦法關閉連接/取消/某物的程序被中斷時?

+1

你能抓住interruptedexception,做一些清理,然後重新拋出嗎? –

+0

我試着添加一個ShutdownHook,但它不起作用。我會再次檢查文檔,我可能會試圖以錯誤的方式關閉連接,我不知道。 – Budgerous

回答

0

基本上,我用下面的代碼:

TopicConnectionFactory topicConnectionFactory = InitialContext.doLookup("jms/RemoteConnectionFactory"); 
try(JMSContext jmsContext = topicConnectionFactory.createContext(<username>,<password>)) { 
    Topic topic = InitialContext.doLookup(<topic>); 
    JMSConsumer jmsConsumer = jmsContext.createDurableConsumer(topic, <client-id>); 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      jmsConsumer.close(); 
      this.interrupt(); 
     } 
    }); 
    Message message = jmsConsumer.receive(); 
    if(message != null) { 
     result = message.getBody(ArrayList.class); 
    } 
} 

我想用jmsContext.stop()來關閉連接。無論如何,它不工作,現在是。耶,我。

1

如果你需要做一些清理工作,但無法下嚥的異常,可以捕獲該異常,做一些清理,然後重新拋出原始異常:

try(JMSContext jmsContext = topicConnectionFactory.createContext(<username>,<password>)) { 
    // ... 
} catch (InterruptedException e) { 
    // Do some cleanup. 
    throw e; 
} 

(我假設它是一個InterruptedException,因爲你說:「說我中斷程序」 - 但也許這是一些其他類型的:同樣的想法適用)

+0

其實我的意思是像鍵盤中斷,或通過IDE停止進程。我真的不知道是否會拋出一個InterruptedException ... – Budgerous

+1

爲什麼不嘗試 - 暫時 - 如果你「中斷」了進程,看看拋出了什麼呢? (只是不要把它作爲'catch Exception'長期使用) –

+0

謝謝,事實證明我只是以錯誤的方式關閉連接。我會發布答案。 – Budgerous