问题很简单:如何在Java SE应用程序中正确关闭和释放JMS资源。我使用的是IBM MQ v8。
我的问题是IBM MQ for JMS似乎启动了一个名为" JMSCCThreadPoolMaster"当应用程序中没有更多JMS时,它不会死亡。它一直存在直到应用程序本身死亡。这不是我想要的。我希望能够以编程方式关闭该线程池。我的应用程序在启动时仅执行2秒的JMS,然后在资源相当有限的环境中继续执行数周甚至数月的其他操作。似乎不合理的是,我无法告诉JMS我在前2秒后完成了使用它,以便资源得到适当的释放。
这里有一个小小的考验来证明这一点:
package org.test.jms.producer.simpleconsumer;
import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsConstants;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
public class MyTest {
private static final Logger LOGGER = Logger.getLogger(MyTest.class.getName());
public static void main(String[] args) throws JMSException, InterruptedException {
// Do some JMS stuff in a separate thread.
Thread jmsThread = new Thread(new JmsRunnable());
jmsThread.start();
// Wait some time to allow any background thread to properly
// close down.
Thread.sleep(60*1000);
// Print the threads that exist at this point in time.
Thread[] threads = new Thread[100];
int noOfThreads = Thread.enumerate(threads);
for (Thread t : threads) {
if (t != null) {
System.out.println(" Active thread : " + t.getName());
}
}
}
private static class JmsRunnable implements Runnable {
@Override
public void run() {
try {
// just do a connect and then immediately disconnect.
JmsFactoryFactory ff = JmsFactoryFactory.getInstance(JmsConstants.WMQ_PROVIDER);
JmsConnectionFactory factory = ff.createConnectionFactory();
Map<String, Object> props = new HashMap<>();
props.put(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
props.put(WMQConstants.WMQ_HOST_NAME, "localhost");
props.put(WMQConstants.WMQ_QUEUE_MANAGER, "dev");
props.put(WMQConstants.WMQ_CHANNEL, "mychannel");
factory.setBatchProperties(props);
Connection connection = factory.createConnection(); // ++
connection.close();
LOGGER.log(Level.INFO, "Thread is closing");
} catch (JMSException ex) {
LOGGER.log(Level.SEVERE, "Something bad happened", ex);
}
}
}
}
在我列出活动线程的位置,应用程序不再存在任何活动的JMS资源。然而,还有这个背景主题。
标有&#34; ++&#34;的行触发创建名为&#34; JMSCCThreadPoolMaster&#34;的背景线程的原因。
如何正确关闭?特定于IBM MQ的解决方案是可以接受的,即我可以转换为IBM MQ特定的JMS类。