我有一个使用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;
为什么能够在接收路由中自动键入转换器,而不是在发送路由中?
答案 0 :(得分:0)
将Java类编组到protobuf有效负载只能在实现com.google.protobuf.Message
接口的Java类中正常工作,可以看到挖掘org.apache.camel.dataformat.protobuf.ProtobufDataFormat
(here)的源代码:
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类。