1

メッセージを Jboss Queue に送信するときに、接続とセッションの作成を削減しようとすると、いくつかの問題が発生します。

<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);
        }

間違ったメソッドを呼び出していますか? 手に入らないものはありますか?

4

1 に答える 1

1

は、 を無視する接続のCachingConnectionFactoryプロキシ (ラッパー) を返しますclose()。同様にsession.close()、セッションは傍受され、実際にセッションを閉じる代わりにキャッシュに入れられます。

実際、次の使用のためにセッションを使用できるようにするには、セッションを「閉じる」必要があります。

キャッシュ サイズを構成する必要がある場合があります (デフォルトでは 1 のみです。javadocsを参照してください)。

于 2015-03-06T13:32:27.723 に答える