我正在尝试使用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();
关闭第一个连接的正确方法是什么,以便它允许我使用第二个工厂创建连接?
另外,请注意我在这里没有使用队列。我必须在没有排队的情况下实现这一目标。
答案 0 :(得分:1)
我不推荐接受的答案。让我来解决这个问题以及对这个问题的其他答案提出的几点。
更好的方法看起来像这个示例(JavaEE6 JMS样式),它从无状态EJB中将ObjectMessage发送到Queue:
@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);
}
}
}
}
}
答案 1 :(得分:1)
使用factory.resetConnection()
实际关闭单个连接。