我正在为一个系统集成主题的小项目工作,我正在使用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);
}
}
这种资源尝试很有用,因为它会在块结束时破坏连接。但是,让我说我在JMSConsumer等待消息时中断程序。当我重新启动程序时,它将抛出:
javax.jms.IllegalStateRuntimeException: Cannot create a subscriber on the durable subscription since it already has subscriber(s)
有没有办法在程序中断时关闭连接/取消订阅?
答案 0 :(得分:1)
如果你需要做一些清理而不是吞下异常,你可以捕获异常,做一些清理,然后重新抛出原来的异常:
try(JMSContext jmsContext = topicConnectionFactory.createContext(<username>,<password>)) {
// ...
} catch (InterruptedException e) {
// Do some cleanup.
throw e;
}
(我假设它是InterruptedException
,因为你说“说我打断了程序” - 但也许是其他类型:同样的想法适用)
答案 1 :(得分: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()尝试关闭连接。无论如何,它现在还没有工作。我也好。