JmsTemplate 和 CachingConnectionFactory
JmsTemplate and CachingConnectionFactory
我发现在向 Jboss 队列发送消息时尝试减少连接和会话创建时遇到了一些困难。
<bean name="jbmTemplate-${jbmQueue}" class="org.springframework.jms.core.JmsTemplate" lazy-init="true">
<property name="sessionTransacted" value="true" />
<!-- connection factory -->
<property name="connectionFactory">
<ref bean="jbmCachingConnectionFactory"/>
</property>
<property name="pubSubDomain">
<value>false</value>
</property>
<property name="receiveTimeout">
<value>${jmsReceiveTimeout}</value>
</property>
</bean>
我正在使用 JmsTemplate 发送消息:
<bean id="jbmCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="jbmConnectionFactory" />
</bean>
jbmConnectionFactory 定义如下:
<jee:jndi-lookup id="jbmConnectionFactory" jndi-name="XAConnectionFactory"
resource-ref="true" lookup-on-startup="false" proxy-interface="javax.jms.ConnectionFactory"
cache="false">
<jee:environment>
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=${jbmURL}
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
</jee:environment>
</jee:jndi-lookup>
我正在使用这段代码向 Jboss:
发送消息
public void send(final Serializable payload, final String correlationId) {
log.debug("payload: {}", payload);
try {
jmsQueueTemplate.send(destinationName, new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
ObjectMessage msg = session.createObjectMessage(payload);
msg.setJMSType(payload.getClass().getCanonicalName());
msg.setJMSCorrelationID(correlationId);
return msg;
}
});
} catch (Exception e) {
log.error("Couldn't send message");
throw new BlockingException(e);
}
}
我试图通过使用 CachingConnectionFactory 来做的是避免在我发送的每条消息中创建和关闭连接和会话,但据我所知,在使用 JmsTemplate 时,无论我使用哪种类型的 connectionFactory,连接和会话将始终终止:
finally {
JmsUtils.closeSession(sessionToClose);
ConnectionFactoryUtils.releaseConnection(conToClose, getConnectionFactory(), startConnection);
}
我是不是调用错了方法?有什么我不明白的吗?
CachingConnectionFactory
returns 忽略 close()
的连接的代理(包装器)。同样,session.close()
被拦截,会话被放入缓存而不是实际关闭它。
事实上,它要求 会话 "closed" 以便下次使用该会话。
您可能需要配置缓存大小(默认情况下仅为 1;请参阅 javadocs)。
我发现在向 Jboss 队列发送消息时尝试减少连接和会话创建时遇到了一些困难。
<bean name="jbmTemplate-${jbmQueue}" class="org.springframework.jms.core.JmsTemplate" lazy-init="true">
<property name="sessionTransacted" value="true" />
<!-- connection factory -->
<property name="connectionFactory">
<ref bean="jbmCachingConnectionFactory"/>
</property>
<property name="pubSubDomain">
<value>false</value>
</property>
<property name="receiveTimeout">
<value>${jmsReceiveTimeout}</value>
</property>
</bean>
我正在使用 JmsTemplate 发送消息:
<bean id="jbmCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="jbmConnectionFactory" />
</bean>
jbmConnectionFactory 定义如下:
<jee:jndi-lookup id="jbmConnectionFactory" jndi-name="XAConnectionFactory"
resource-ref="true" lookup-on-startup="false" proxy-interface="javax.jms.ConnectionFactory"
cache="false">
<jee:environment>
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=${jbmURL}
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
</jee:environment>
</jee:jndi-lookup>
我正在使用这段代码向 Jboss:
发送消息public void send(final Serializable payload, final String correlationId) {
log.debug("payload: {}", payload);
try {
jmsQueueTemplate.send(destinationName, new MessageCreator() {
public Message createMessage(Session session)
throws JMSException {
ObjectMessage msg = session.createObjectMessage(payload);
msg.setJMSType(payload.getClass().getCanonicalName());
msg.setJMSCorrelationID(correlationId);
return msg;
}
});
} catch (Exception e) {
log.error("Couldn't send message");
throw new BlockingException(e);
}
}
我试图通过使用 CachingConnectionFactory 来做的是避免在我发送的每条消息中创建和关闭连接和会话,但据我所知,在使用 JmsTemplate 时,无论我使用哪种类型的 connectionFactory,连接和会话将始终终止:
finally {
JmsUtils.closeSession(sessionToClose);
ConnectionFactoryUtils.releaseConnection(conToClose, getConnectionFactory(), startConnection);
}
我是不是调用错了方法?有什么我不明白的吗?
CachingConnectionFactory
returns 忽略 close()
的连接的代理(包装器)。同样,session.close()
被拦截,会话被放入缓存而不是实际关闭它。
事实上,它要求 会话 "closed" 以便下次使用该会话。
您可能需要配置缓存大小(默认情况下仅为 1;请参阅 javadocs)。