Java ActiveMQ避免新连接启动

时间:2015-05-25 07:01:17

标签: java jms activemq

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class MessageSender {
    public static ConnectionFactory factory = null;
    public static Connection connection = null;
    public static Session session = null;
    public static Destination destination = null;
    public static MessageProducer producer = null;

    public static void sendMessage(String queueName,String messageContent) {
        try {
            factory = new ActiveMQConnectionFactory(
                    ActiveMQConnection.DEFAULT_BROKER_URL);            
            connection = factory.createConnection();            
            connection.start();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue(queueName);        
            producer = session.createProducer(destination);
            TextMessage message = session.createTextMessage();
            message.setText(messageContent);
            producer.send(message);
            System.out.println("Sent: " + message.getText() );     

        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

上面是我的java JMS代码,用于将消息推送到队列。每次我想要推送消息排队时,我都会像下面那样调用

MessageSender.sendMessage("orderdetailsQueue","OrderReceivedIdB6789");  

因此,对于每条消息,它都会调用new connection.start()。我怎么能概括这个呢?

1 个答案:

答案 0 :(得分:1)

创建连接工厂,然后在每个sendMessage中建立连接可能不是一个好主意。

您可以将此连接工厂初始化部件移动到singleton util类,该类在实例化该util类时仅创建一次连接工厂。还可以使用PooledConnectionFactory而不是普通连接工厂来创建连接池,会话和生成器。 sendMessage应通过调用connectionUtil.getConnection()获取连接。 sendMessage中的其余代码看起来很好,除非您需要通过在这些对象上调用finally来释放close()中的会话,生成器和连接。

Pooled Connection Factory