Apache Camel自动类型在路线中转换Protobuf

时间:2014-04-09 15:49:06

标签: java apache-camel protocol-buffers

我有一个使用Camel和ActiveMQ设置的主题,它接收消息作为protobuf的字节数组。

接收路线如下所示:

    <route>
        <from uri="jmsComponent:topic:{{heartbeat}}" />
        <unmarshal>
            <protobuf instanceClass="protobuf.HeartbeatProto" />
        </unmarshal>
        <to uri="bean:heartbeatConsumer" />
    </route>

heartbeatConsumer只有一个方法可以获取心跳的POJO版本。为了实现这一点,我有一个转换为POJO /从POJO转换为protobuf的类型转换器。

这非常有效,Camel能够获取字节数组并将其作为POJO传递给heartbeatConsumer。

我的问题是发件人。我将发送路由设置为:

    <route>
        <from uri="quartz2://heartbeatJob?cron=0/30+*+*+*+*+?" />
        <to uri="bean:heartbeat?method=sendHeartbeat" />
        <marshal>
            <protobuf instanceClass="protobuf.HeartbeatProto" />
        </marshal>
        <to uri="jmsComponent:topic:{{heartbeat}}" />       
    </route>

它给了我例外: &#39; java.lang.ClassCastException:protobuf.HeartbeatProto无法转换为com.google.protobuf.Message&#39;

为什么能够在接收路由中自动键入转换器,而不是在发送路由中?

1 个答案:

答案 0 :(得分:0)

将Java类编组到protobuf有效负载只能在实现com.google.protobuf.Message接口的Java类中正常工作,可以看到挖掘org.apache.camel.dataformat.protobuf.ProtobufDataFormathere)的源代码:

public void marshal(Exchange exchange, Object graph, OutputStream outputStream) throws Exception {
    ((Message)graph).writeTo(outputStream);  // <- here the ClassCastException occurs!
}

正如Camel doc所述,您应该从使用.proto编译的protoc --java_out=. ./protobuf.HeartbeatProto定义文件开始,到实现所需接口的Java类。