JmsTemplate和CachingConnectionFactory

时间:2015-03-06 11:18:41

标签: jboss jms spring-jms jmstemplate

我发现在向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);
        }

我说的是错误的方法吗?有没有我得不到的东西?

1 个答案:

答案 0 :(得分:1)

CachingConnectionFactory返回忽略close()的连接的代理(包装器)。同样,session.close()被截获,会话被放入缓存而不是实际关闭它。

事实上,要求会话“关闭”,以便会话可供下次使用。

您可能需要配置缓存大小(默认情况下只有1;请参阅javadocs)。