【问题标题】:Sending a BlobMessage using JmsTemplate with CachingConnectionFactory使用 JmsTemplate 和 CachingConnectionFactory 发送 BlobMessage
【发布时间】:2014-05-19 03:17:43
【问题描述】:

我使用 ActiveMQ 作为我的消息代理,并且我有一个 JMS 要求,即发送一个大文档作为输入流以供消费者处理。我遇到的问题是,如果我使用 Spring 的 org.springframework.jms.connection.CachingConnectionFactory 来包装 ActiveMQConnectionFactory,我必须将会话对象(javax.jms.Session)转换为 org.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>

【问题讨论】:

    标签: java spring session activemq jmstemplate


    【解决方案1】:

    SessionProxy sp = (SessionProxy)session;

    ActiveMQSession as = (ActiveMQSession)sp.getTargetSession();

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2013-05-04
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多