我使用apache camel JAVA DSL从Apache kafka消费消息。 我正在通过将其转换为kafka上的byte []来编写对象。当我使用它时,我有一个带有byte []的消息,我反序列化它并获取一个对象。 我检查它是否是MyObject的对象然后需要使用java DSL .to()将它传递给bean。我的代码如下:
public class KafkaRouter extends RouteBuilder {
private MessageBean msgBean;
@Override
public void configure() throws Exception {
from("{{kafka.cons.uri}}").process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Object obj = SerializationUtils.deserialize(exchange.getIn().getBody(byte[].class)); //TODO cast to specific class as returned after deserialization.
if(obj !=null && obj instanceof MessageBean){
msgBean = (MessageBean)obj;
}
else {
throw new PTFException("Invalid Message read in Kafka Consumer");
}
}
}).bean(PTFTransformerService.class,"callTransformerService(msgBean)"); ;
}
现在问题是我只想在相应的被调用方法中使用MyObject,我不想使用TypeConvertors。我不想在方法中获取Exchange / body我将处理我的流进程并在读取无效消息时抛出异常并且不将其转发给bean。
另一端的方法是:
private void callTransformerService(MessageBean msgObj){
// Got my object here ;-)
}
答案 0 :(得分:2)
在函数参数@Body
之前添加MessageBean msgObj
:
import org.apache.camel.Body;
private void callTransformerService(@Body MessageBean msgObj){
}
答案 1 :(得分:1)
您可能需要编写可以从kafka byte []转换为POJO的自定义回退类型转换器
然后你可以在bean中定义pojo类型,Camel将使用fallback类型转换器尝试转换为pojo类型。
答案 2 :(得分:0)
您可以按如下所示在处理器中设置Exchange正文:
msgBean = (MessageBean)obj;
exchange.getIn().setBody(msgBean, MessageBean.class);
void callTransformerService(@Body MessageBean msgObj) {}