首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JmsTemplate和CachingConnectionFactory

JmsTemplate和CachingConnectionFactory
EN

Stack Overflow用户
提问于 2015-03-06 11:18:41
回答 1查看 3.5K关注 0票数 1

在向Jboss队列发送消息时,我发现在试图减少连接和会话创建方面存在一些困难。

代码语言:javascript
复制
<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发送消息:

代码语言:javascript
复制
<bean id="jbmCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
     <property name="targetConnectionFactory" ref="jbmConnectionFactory" />
</bean>

jbmConnectionFactory的定义如下:

代码语言:javascript
复制
<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发送消息:

代码语言:javascript
复制
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,连接和会话总是会终止的:

代码语言:javascript
复制
finally {
            JmsUtils.closeSession(sessionToClose);
            ConnectionFactoryUtils.releaseConnection(conToClose, getConnectionFactory(), startConnection);
        }

我打错电话了吗?有什么我不明白的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-06 13:32:27

CachingConnectionFactory为忽略close()的连接返回一个代理(包装器)。类似地,session.close()被拦截,会话被放入缓存中,而不是实际关闭它。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28897687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档