Java 无法在持久订阅上创建订阅服务器

Java 无法在持久订阅上创建订阅服务器,java,jboss,jms,Java,Jboss,Jms,我正在为一个系统集成主题做一个小项目,我正在使用JMS(JBOSS)。我们必须使用持久的主题,这一部分相当简单。问题是,假设我使用以下代码: TopicConnectionFactory topicConnectionFactory = InitialContext.doLookup("jms/RemoteConnectionFactory"); try(JMSContext jmsContext = topicConnectionFactory.createContext(<userna

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

当程序被中断时,是否有办法关闭连接/取消订阅/执行其他操作?

如果您需要执行一些清理,但不接受异常,您可以捕获异常,执行一些清理,然后重新播放原始异常:

try(JMSContext jmsContext = topicConnectionFactory.createContext(<username>,<password>)) {
  // ...
} catch (InterruptedException e) {
  // Do some cleanup.
  throw e;
}
try(JMSContext JMSContext=topicConnectionFactory.createContext(,){
// ...
}捕捉(中断异常e){
//清理一下。
投掷e;
}

(我假设这是一个
中断异常
,因为你说“假设我中断程序”-但可能是其他类型:同样的想法适用)

基本上,我使用了以下代码:

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);
    }
}
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);
    }
}
TopicConnectionFactory TopicConnectionFactory=InitialContext.doLookup(“jms/RemoteConnectionFactory”);
try(JMSContext JMSContext=topicConnectionFactory.createContext(,){
Topic Topic=InitialContext.doLookup();
JMSConsumer JMSConsumer=jmsContext.createDurableConsumer(主题,);
Runtime.getRuntime().addShutdownHook(新线程(){
公开募捐{
jmsConsumer.close();
这个。中断();
}
});
Message=jmsConsumer.receive();
如果(消息!=null){
结果=message.getBody(ArrayList.class);
}
}

我想我正试图使用jmsContext.stop()关闭连接。不管怎样,它不起作用,现在起作用了。是的。

你能捕捉到中断异常,进行一些清理,然后重新播放吗?我尝试添加了一个关闭钩子,但它不起作用。我会再次检查文档,我可能试图以错误的方式关闭连接,我不知道。我实际上指的是键盘中断,或者通过IDE停止进程。老实说,我不知道这是否会引发InterruptedException…为什么不尝试-暂时-捕获
异常
,看看如果您“中断”流程会引发什么?(只是不要将其作为
捕获异常
长期)谢谢,原来我只是以错误的方式关闭了连接。我将发布答案。顺便说一下,我试图捕获异常,但没有