使用JmsTemplate和CachingConnectionFactory发送BlobMessage

时间:2014-04-07 03:05:06

标签: java spring session activemq jmstemplate

我使用ActiveMQ作为我的消息代理,并且我有一个JMS要求将大文档作为输入流发送以供消费者处理。我遇到的问题是,如果我使用Spring的org.springframework.jms.connection.CachingConnectionFactory来包装ActiveMQConnectionFactory,我必须将会话对象(javax.jms.Session)强制转换为组织。 apache.activemq.ActiveMQSession是这里建议的(Sending Files using Active MQ with BlobMessage)。

然后,如果我将通用Session对象转换为ActiveMQSession,则会出现异常,因为Spring仅为javax.jms.Session提供代理,而不是它代理的目标对象(即org.apache.activemq.ActiveMQSession)。所以我采用的解决方案是使用普通的ActiveMQConnectionFactory而不是使用CachingConnectionFactory。有没有办法让我保持CachingConnectionFactory而不从下面的示例代码中获取ClassCastException?

  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>

0 个答案:

没有答案