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)。