私は ActiveMQ をメッセージ ブローカーとして使用しており、コンシューマーによって処理される入力ストリームとして大きなドキュメントを送信するという JMS 要件があります。私が抱えている問題は、Spring の org.springframework.jms.connection.CachingConnectionFactory を使用して ActiveMQConnectionFactory をラップする場合、セッション オブジェクト (javax.jms.Session) を org.apache.activemq.ActiveMQSession にキャストする必要があることです。ここで提案されたものです(BlobMessage を使用して Active MQ を使用してファイルを送信する)。
次に、一般的な Session オブジェクトを ActiveMQSession にキャストすると、例外が発生します。Spring は javax.jms.Session のプロキシのみを提供し、プロキシ先のターゲット オブジェクト (つまり、org.apache.activemq.ActiveMQSession) は提供しないためです。したがって、私が頼った解決策は、CachingConnectionFactory を使用する代わりに、単純な ActiveMQConnectionFactory を使用することでした。以下のサンプル コードから ClassCastException を取得せずに CachingConnectionFactory を保持する方法はありますか?
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
org.apache.activemq.ActiveMQSession activeMQSession = ((org.apache.activemq.ActiveMQSession) session);
BlobMessage message = activeMQSession.createBlobMessage(inputStream);
LOGGER.debug("created a blob message");
return message;
}
});
そして、ClassCastException がスローされないようにするアプリケーション コンテキストに現在あるものを次に示します。コメント付きのブロックも参照してください。これは、例外をスローする古い構成を示しています。
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="defaultDestination" ref="gtJobRequestQueue"/>
</bean>
<!-- <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> -->
<!-- <property name="targetConnectionFactory" ref="activeMqConnectionFactory" /> -->
<!-- <property name="sessionCacheSize" value="3"/> -->
<!-- <property name="cacheProducers" value="true"/> -->
<!-- </bean> -->
<!-- <bean id="activeMqConnectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory"> -->
<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name="brokerURL" value="${aurin.data-provider.broker.url}"/>
<property name="prefetchPolicy" ref="prefetchPolicy" />
</bean>