我正在尝试使用带有activemq的apache camel向主题发布文本消息。 以下代码工作正常,我的客户端程序能够将消息转换为文本消息。
<route id="setText">
<from uri="restlet:///test/{testId}?restletMethod=POST" />
<setExchangePattern pattern="InOnly" />
<setBody>
<simple>${header.testId}:${body}</simple>
</setBody>
<to uri="activemq:topic:TestTopic" />
</route>
现在我添加了多播来执行多项操作。多播能够很好地执行并成功地向主题发送消息。
<route id="setText">
<from uri="restlet:///test/{testId}?restletMethod=POST" />
<setExchangePattern pattern="InOnly" />
<multicast>
<pipeline>
<!-- some operation -->
</pipeline>
<setBody>
<simple>${header.testId}:${body}</simple>
</setBody>
<to uri="activemq:topic:TestTopic" />
</multicast>
</route>
但是在向主题发送文本消息时,多播正在将消息转换为字节流。我的客户端程序无法将消耗的消息转换为TextMessage bcoz消息是再见格式,下面是为system.out.println显示的信息(在我的客户端程序中)
ActiveMQBytesMessage {commandId = 5, responseRequired = true, messageId = ID:R-014-49827-1433324560754-3:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:R-014-49827-1433324560754-3:1:1:1, destination = topic://TestTopic, transactionId = null, expiration = 0, timestamp = 1433324582980, arrival = 0, brokerInTime = 1433324582981, brokerOutTime = 1433324583731, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@10d42d49, marshalledProperties = org.apache.activemq.util.ByteSequence@59e91c40, dataStructure = null, redeliveryCounter = 0, size = 0, properties = {breadcrumbId=ID-R-014-49826-1433324557692-2-1, org_DOT_restlet_DOT_http_DOT_version=1.1, testId=3100026, org_DOT_restlet_DOT_startTime=1433324582521, CamelHttpMethod=PUT, CamelHttpUri=http://localhost:8080/service-bus/test/3100026}, readOnlyProperties = true, readOnlyBody = true, droppable = false} ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null }
您能说明为什么多播将文本消息转换为字节格式吗?怎么做以文本格式发送消息?提前谢谢。
答案 0 :(得分:0)
我不确定您使用的是什么版本的骆驼,但我看到了将jaxb dataformat转换为字节的类似问题。我建议打开一张jira票。与此同时,我之前使用的一种解决方法是在jms端点上强制执行文本类型。
activemq:topic:TestTopic?jmsMessageType=Text
答案 1 :(得分:0)
我遇到了与multicast和jaxb unmarshalling相同的问题。没有多播,unmarshal()工作正常,我收到预期的Object类型作为方法“Handler.received(Object)”的参数。 在多播后面添加unmarshal(),而“Handler.received(Object)”会改为使用Byte []。
// works - Handler.received(Object) receives correct object type:
from("test-jms:queue:test.queue").unmarshal(jaxb).to("class:com.test.Handler?method=received");
// doesn't work - Handler.received(Object) receives a byte array:
from("test-jms:queue:test.queue").multicast().unmarshal(jaxb).to("class:com.test.Handler?method=received");
我是Camel的全新手,这让我整天疯狂。 上面建议将jmsMessageType设置为“Text”的解决方案对我来说也不起作用。在这种情况下,Handler类接收一个包含XML的String,就像unmarshal()根本没有做任何事情一样。
编辑: 我查看了以下StackOverflow问题: Apache camel multicast FreeMarker
并将我的代码更改为使用“管道”,例如用户“Claus Ibsen”的示例:
from("test-jms:queue:test.queue").multicast()
.pipeline().to("file://targetdir/received").end()
.pipeline().unmarshal(jaxb).to("class:com.test.Handler?method=received").end()
.end();
现在它的效果就像我期望的那样。收到的XML文件被复制到“targetdir / received”,方法“Handler.received(Object)”获取正确的对象类型作为参数。 谢谢克劳斯! :)