尝试将消息从 RabbitMQ <int-amqp:inbound-channel-adapter
传输到 MQSeries <int-jms:outbound-channel-adapter
。这工作正常。
实际上,MQSeries上的一些生产者使用这样的IBM JMS类:
MQMessage messageMQ = new MQMessage();
messageMQ.format = " ";
messageMQ.persistence = 1;
messageMQ.correlationId = MQ_MESSAGE_CORRELATION_ID;
messageMQ.write(message.getMessageData());
MQPutMessageOptions putMessageOption = new MQPutMessageOptions();
putMessageOption.options = 8194;
MQQueue queue = openQueue(destinataire, 8208);
queue.put(messageMQ, putMessageOption);
我尝试在amqp和jms之间使用变压器,如下所示:
<int:transformer id="testTransformer" ref="testTransformerBean" input-channel="fromRabbit"
method="transform" output-channel="toJms"/>
public MQMessage transform(Message<?> msg) throws Exception {
MQMessage result = new MQMessage();
result.format = " ";
result.persistence = 1;
result.correlationId = MQC.MQCI_NONE;
String test = "message to send ";
result.write(test.getBytes());
return result;
}
msg.getPayload(( 中存储的对象类型是什么?如何将其转换为字符串对象?
实现此方法时,我有一个例外,因为出站需要 JMS 消息而不是 com.ibm.mq.MQMessage!
Cannot convert object of type [com.ibm.mq.MQMessage] to JMS message
这种方式正确吗?
或者我应该删除出站通道并使用服务激活器来代替 IBM 的特定代码?
感谢您的帮助
问候
按照阿尔乔姆的回答编辑
遵循 jms 出站配置:
<bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">
<property name="queueManager" value="${queueManager}" />
<property name="hostName" value="${hostName}" />
<property name="port" value="${port}" />
<property name="channel" value="${channelName}" />
<property name="transportType" value="1" />
</bean>
<bean id="jmsQueue" class="com.ibm.mq.jms.MQQueue" depends-on="jmsConnectionFactory">
<property name="baseQueueManagerName" value="${queueManager}" />
<property name="baseQueueName" value="${queueName}" />
<property name="targetClient" value="1" />
</bean>
<bean id="jmsConnectionFactory_cred"
class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="jmsConnectionFactory" />
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<bean id="connectionFactoryCaching"
class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="jmsConnectionFactory_cred" />
<property name="sessionCacheSize" value="${BRIDGE_MQ_OUTBOUND_SESSION_CACHE}" />
</bean>
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice" id="requestHandler">
<property name="trapException" value="false"/>
<property name="onFailureExpressionString" value="#this"/>
<property name="failureChannel" ref="processChannel1"/>
</bean>
<int-jms:outbound-channel-adapter channel="channelRmqMQ"
id="jmsOut" destination="jmsQueue" connection-factory="connectionFactoryCaching" delivery-persistent="true"
explicit-qos-enabled="true" session-transacted="true" >
<int-jms:request-handler-advice-chain>
<ref bean="requestHandler" />
</int-jms:request-handler-advice-chain>
</int-jms:outbound-channel-adapter>
如果您的 AMQP 消息附带 text/*
contentType
,则其正文将通过AmqpInboundChannelAdapter
中的现成SimpleMessageConverter
自动转换为字符串:
if (contentType != null && contentType.startsWith("text")) {
String encoding = properties.getContentEncoding();
if (encoding == null) {
encoding = this.defaultCharset;
}
try {
content = new String(message.getBody(), encoding);
} catch (UnsupportedEncodingException var8) {
throw new MessageConversionException("failed to convert text-based Message content", var8);
}
否则,您需要在两者之间放置一个简单的转换器以将byte[]
转换为字符串:
<object-to-string-transformer>
该<int-jms:outbound-channel-adapter>
完全适用于JMS协议交互,因此,您的MQMessage
不会被接受。这就是为什么你会得到Cannot convert object of type [com.ibm.mq.MQMessage] to JMS message
例外。
是的,您可以直接在某些自定义service-activator
中使用 IBM MP API ,但是我建议看看 IBM WebSphere 上的 JMS 到 MQ 桥接。然后,您只需配置适当的连接工厂并从<int-jms:outbound-channel-adapter>
使用它:
<jee:jndi-lookup id="jndiMqConnectionFactory" jndi-name="${mqConnectionFactory}"/>
<bean id="jmsQueueConnectionFactory"
class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="jndiMqConnectionFactory"/>
<property name="username" value="${mqLogin}"/>
<property name="password" value="${mqPassword}"/>
</bean>
<jee:jndi-lookup id="myMqQueue" jndi-name="queue/myMqQueue"/>
<bean id="mqQueueJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsQueueConnectionFactory"/>
<property name="defaultDestination" ref="myMqQueue"/>
</bean>
<jms:outbound-channel-adapter channel="myMqChannel" jms-template="mqQueueJmsTemplate"/>