apache camel multicast将文本消息转换为字节消息

时间:2015-06-03 10:05:11

标签: java apache-camel activemq multicast

我正在尝试使用带有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 }

您能说明为什么多播将文本消息转换为字节格式吗?怎么做以文本格式发送消息?提前谢谢。

2 个答案:

答案 0 :(得分:0)

我不确定您使用的是什么版本的骆驼,但我看到了将jaxb dataformat转换为字节的类似问题。我建议打开一张jira票。与此同时,我之前使用的一种解决方法是在jms端点上强制执行文本类型。

activemq:topic:TestTopic?jmsMessageType=Text

参考: http://camel.apache.org/jms.html

答案 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)”获取正确的对象类型作为参数。 谢谢克劳斯! :)