Java 如何正确关闭JMS连接?

Java 如何正确关闭JMS连接?,java,jms,spring-jms,Java,Jms,Spring Jms,我尝试使用Spring的SingleConnectionFactory,其中有两个连接工厂,一次只能连接其中一个 <bean id="connectionFactory1" class="org.springframework.jms.connection.SingleConnectionFactory102"> <property name="targetConnectionFactory"> <bean class="org.spring

我尝试使用Spring的SingleConnectionFactory,其中有两个连接工厂,一次只能连接其中一个

<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>
关闭第一个连接的正确方法是什么,以便允许我使用第二个工厂创建连接


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

我不推荐接受的答案。让我谈谈这一点以及对这一问题的其他答复提出的几点

更好的方法类似于以下示例(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);
            }
        }
    }
  }

}

我不推荐公认的答案。让我谈谈这一点以及对这一问题的其他答复提出的几点

更好的方法类似于以下示例(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()
实际关闭单个连接。

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

检测到打开第一个连接以抛出错误的逻辑是什么?
factory.resetConnection()
@MinhKieu,我在两个工厂中使用相同的客户端ID,因此尝试从其他工厂创建另一个连接将导致异常。检测到您打开第一个连接以抛出错误的逻辑是什么?
factory.resetConnection()
@MinhKieu,我在两个工厂中使用相同的客户端ID,因此,尝试从其他工厂创建另一个连接将导致异常。在哪里有resetConnection()方法?我检查了一下,SingleConnectionFactory102中没有这样的方法。您使用的是哪个版本的Spring?那家工厂在3.2之后就不存在了。至少在3.2版中,
resetConnection()
位于屏幕上。如果您的版本中没有
resetConnection()
,请尝试
destroy()
。我的spring版本是2.5。我可以尝试更高版本。
resetConnection()
存在于2.5中。对,它在2.5版本中可用。我查过了,问题解决了。谢谢在哪里有resetConnection()方法?我检查了一下,SingleConnectionFactory102中没有这样的方法。您使用的是哪个版本的Spring?那家工厂在3.2之后就不存在了。至少在3.2版中,
resetConnection()
位于屏幕上。如果您的版本中没有
resetConnection()
,请尝试
destroy()
。我的spring版本是2.5。我可以尝试更高版本。
resetConnection()
存在于2.5中。对,它在2.5版本中可用。我查过了,问题解决了。谢谢但是,我需要它,而不需要排队。对于我来说,在我的公司基础设施中请求创建一个新的EMS队列是不可行的。但是,我需要它而不涉及队列。为此,我请求在公司基础设施中创建一个新的EMS队列是不可行的。