关闭和释放JMS资源

时间:2016-08-04 20:54:44

标签: java jms ibm-mq

问题很简单:如何在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类。

0 个答案:

没有答案