无法在持久订阅上创建订户

时间:2015-10-15 22:43:05

标签: java jboss jms

我正在为一个系统集成主题的小项目工作,我正在使用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)

有没有办法在程序中断时关闭连接/取消订阅?

2 个答案:

答案 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()尝试关闭连接。无论如何,它现在还没有工作。我也好。