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)。所以我采用的解决方案是只使用普通的 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>
4

1 回答 1

0

SessionProxy sp = (SessionProxy) 会话;

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

于 2022-02-09T17:42:44.280 回答