4

私は 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>
4

1 に答える 1