繁体   English   中英

如何正确关闭JMS连接?

[英]How to properly close a JMS connection?

我正在尝试使用Spring的SingleConnectionFactory,那里有2个连接工厂,并且一次只能连接其中一个。

<bean id="connectionFactory1" class="org.springframework.jms.connection.SingleConnectionFactory102">
    <property name="targetConnectionFactory">
        <bean class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
            <property name="username" value="LOGIN" />
            <property name="password" value="PASS" />
            <property name="targetConnectionFactory">
                <bean class="com.tibco.tibjms.TibjmsQueueConnectionFactory">
                    <constructor-arg value="URL" />
                    <constructor-arg value="CLIENT_ID" />
                </bean>
            </property>
        </bean>
    </property>
    <property name="reconnectOnException" value="true" />
</bean>

<bean id="connectionFactory2" class="org.springframework.jms.connection.SingleConnectionFactory102">
    <property name="targetConnectionFactory">
        <bean class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
            <property name="username" value="LOGIN" />
            <property name="password" value="PASS" />
            <property name="targetConnectionFactory">
                <bean class="com.tibco.tibjms.TibjmsQueueConnectionFactory">
                    <constructor-arg value="URL" />
                    <constructor-arg value="CLIENT_ID" />
                </bean>
            </property>
        </bean>
    </property>
    <property name="reconnectOnException" value="true" />
</bean>

通过在两个工厂中使用相同的客户端ID(CLIENT_ID),我确保从一个工厂创建连接时,无法从另一个工厂创建另一个连接(引发InvalidClientIDException,因此这是预期的)。 但是问题是,当我关闭从第一工厂获得的连接并尝试从第二工厂获得连接时,我仍然遇到异常。

使用以下Java代码:

Connection connection1 = connectionFactory1.createConnection();
connection1.close();

Connection connection2 = connectionFactory2.createConnection();

关闭第一个连接的正确方法是什么,以便它允许我使用第二个工厂创建连接?

另外,请注意,我在这里不使用队列。 我必须在没有队列的情况下实现这一目标。

我不推荐接受的答案。 让我来解决这个问题,以及这个问题的其他答案所提出的几点。

更好的方法类似于此示例(JavaEE6 JMS样式),该示例从无状态EJB内将ObjectMessage发送到队列:

@Stateless
public class SendEventsBean {

  private static final Logger log = Logger.getLogger(SendEventsBean.class);

  @Resource(mappedName = "jms/MyConnectionFactory")
  private ConnectionFactory jmsConnectionFactory;

  @Resource(mappedName = "jms/myApp/MyQueue"
  private Queue queue;

  public void sendEvent() {
    Connection jmsConnection = null;
    try {
        connection = jmsConnectionFactory.createConnection();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer producer = session.createProducer(queue);
        MyObj obj = new MyObj(1, "Foo");
        ObjectMessage myObjMsg = session.createObjectMessage(obj);
        producer.send(myObjMsg);
    } catch (JMSException jmxEx) {
        log.error("Couldn't send JMS message: ", jmsEx);
    }finally{
        if (jmsConnection != null) {
            try {
                jmsConnection.close();
            }catch(JMSException ex) {
               log.warn("Couldn't close JMSConnection: ", ex);
            }
        }
    }
  }

}

使用factory.resetConnection()实际上关闭单个连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM