ConnectionFactory详细阐述

发布时间:2023-05-19

ConnectionFactory是JMS中最重要的接口之一,它提供了创建连接对象和其他JMS对象的方式。在JMS中,Connection是一个重量级对象,它通常代表一个客户端与JMS消息传递系统之间的物理连接。它内部维护了许多资源,如线程,TCP连接等。ConnectionFactory提供了创建Connection的方法,我们可以通过它来创建Connection对象,获取消息传递的Session对象和其他JMS对象。

一、ConnectionFactory的主要实现方式

ConnectionFactory有两种实现方式,分别是JNDI Lookup和直接创建。其中后者是比较常用的方式,在这种方式下,我们需要用ConnectionFacotry对象的实现类的构造方法来创建ConnectionFactory对象。

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

JNDI Lookup方式比较麻烦,需要在JNDI服务里先绑定对应的JMS对象,在获取对应的JMS对象。

二、ConnectionFactory的参数配置

ConnectionFactory一般有一些通用的配置参数,如brokerURL、userName、password等,这些参数可以通过调用构造方法时设置。

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616","admin","admin");

也可以通过配置文件的方式来进行参数配置,如activemq.xml中就可以配置ConnectionFacotry的参数。

三、ConnectionFactory的使用方式

ConnectionFactory主要用于创建Connection,我们可以通过Connection来创建Session、MessageProducer、MessageConsumer等对象。

Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("test");
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("Hello, world!");
producer.send(message);
connection.close();

上面的代码展示了如何使用ConnectionFactory创建Connection,Session,Destination,MessageProducer和MessageConsumer对象,发送一条消息到队列中。我们也可以将Connection对象进行复用,每次发送消息时通过recreate方法重新创建Session和MessageProducer。

四、ConnectionFactory的线程安全问题

ConnectionFactory是线程安全的,在多个线程共享一个ConnectionFactory对象时不会出现并发问题。但是,它创建的Connection对象不是线程安全的,每个线程创建自己的Connection对象才是正确的方式。同时,对于生产环境中需要高可用和高吞吐量的情况,也需要使用连接池技术。

五、ConnectionFactory与Spring JMS的结合使用

Spring JMS是Spring框架与JMS集成的产物,它提供了一系列方便的JMS操作的模板类、管理的类和配置类。在Spring JMS中,我们可以通过JndiObjectFactoryBean、ConnectionFactoryBean等来获取ConnectionFactory对象。 下面是一个通过Spring进行JMS操作的例子:

<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://localhost:61616" />
    <property name="userName" value="admin" />
    <property name="password" value="admin" />
</bean>
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="test" />
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<bean id="messageSender" class="com.example.MessageSender">
    <property name="jmsTemplate" ref="jmsTemplate" />
    <property name="destination" ref="destination" />
</bean>

在这个例子中,我们通过Spring配置文件来创建ConnectionFactory、Destination和JmsTemplate对象,然后在MessageSender类中通过JmsTemplate对象来发送消息。