簡體   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