我使用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>