Java 无法在持久订阅上创建订阅服务器
我正在为一个系统集成主题做一个小项目,我正在使用JMS(JBOSS)。我们必须使用持久的主题,这一部分相当简单。问题是,假设我使用以下代码:Java 无法在持久订阅上创建订阅服务器,java,jboss,jms,Java,Jboss,Jms,我正在为一个系统集成主题做一个小项目,我正在使用JMS(JBOSS)。我们必须使用持久的主题,这一部分相当简单。问题是,假设我使用以下代码: TopicConnectionFactory topicConnectionFactory = InitialContext.doLookup("jms/RemoteConnectionFactory"); try(JMSContext jmsContext = topicConnectionFactory.createContext(<userna
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…为什么不尝试-暂时-捕获
异常
,看看如果您“中断”流程会引发什么?(只是不要将其作为捕获异常
长期)谢谢,原来我只是以错误的方式关闭了连接。我将发布答案。顺便说一下,我试图捕获异常,但没有