[英]How can we close and clean properly JMS Connection, Session, Consumer and Producer from system after Exception?
[英]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.