Java 使用ApacheCamel将MyObject传递给bean路由的可能性?
我正在使用ApacheCamel JAVA DSL使用来自ApacheKafka的消息。 我通过将对象转换为卡夫卡上的Java 使用ApacheCamel将MyObject传递给bean路由的可能性?,java,apache-camel,Java,Apache Camel,我正在使用ApacheCamel JAVA DSL使用来自ApacheKafka的消息。 我通过将对象转换为卡夫卡上的字节[]来编写对象。当我使用它时,我会收到一条带有字节[]的消息。我反序列化它并得到一个对象 我检查它是否是MyObject的对象,然后需要使用JavaDSL.to()将其传递给bean。我的代码如下: public class KafkaRouter extends RouteBuilder { private MessageBean msgBean;
字节[]
来编写对象。当我使用它时,我会收到一条带有字节[]
的消息。我反序列化它并得到一个对象
我检查它是否是MyObject
的对象,然后需要使用JavaDSL.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
,而不想使用typeconverter
。我不想在方法中获取Exchange/body,我将在进程中处理我的流,如果读取无效消息并且不将其转发给bean,则抛出异常
另一方面,我的方法是:
private void callTransformerService(MessageBean msgObj){
// Got my object here ;-)
}
在函数参数前添加
@Body
:
import org.apache.camel.Body;
private void callTransformerService(@Body MessageBean msgObj){
}
在函数参数前添加
@Body
:
import org.apache.camel.Body;
private void callTransformerService(@Body MessageBean msgObj){
}
您可能需要编写一个自定义回退类型转换器,该转换器可以从kafka字节[]转换为POJO
然后您可以在bean中定义pojo类型,Camel将使用回退类型转换器尝试转换为pojo类型。您可能需要编写一个自定义回退类型转换器,该转换器可以从kafka字节[]转换为pojo
然后您可以在bean中定义pojo类型,Camel将使用回退类型转换器尝试转换为pojo类型。您可以在处理器中设置Exchange主体,如下所示:
msgBean = (MessageBean)obj;
exchange.getIn().setBody(msgBean, MessageBean.class);
void callTransformerService(@Body MessageBean msgObj) {}
您可以在处理器中设置Exchange主体,如下所示:
msgBean = (MessageBean)obj;
exchange.getIn().setBody(msgBean, MessageBean.class);
void callTransformerService(@Body MessageBean msgObj) {}
以及如何编写这段代码“bean(ptftTransformerService.class,“callTransformerService(msgBean)”;“顺便说一句,更改为您所说的不起作用。请尝试不使用括号,只使用方法名称:bean(ptftTransformerService.class,“callTransformerService”);或bean(新的ptftTransformerService(),“callTransformerService”);这也行不通。如果我将exchange body设置为一个可以工作的对象,但我不希望这样做。只需要将对象传递给一个方法。好的,我以前不理解你的代码。我认为这样做是行不通的,因为您只能从exchange传递给bean方法somethink,所以必须设置body或header(如果您不想更改body),并使用简单的语言将该header传递给您的方法:exchange.getIn().setHeader(“headerName”,msgBean)。bean(ptftTransformerService.class,“callTransformerService(${header.headerName})”或exchange.getIn().setBody(msgBean)。bean(ptftTransformerService.class,“callTransformerService”)以及您如何编写这段代码“bean(ptftTransformerService.class,“callTransformerService(msgBean)”;“顺便说一句,更改为您所说的不起作用。尝试不使用括号,只使用方法名称:bean(ptftTransformerService.class,“callTransformerService”);或bean(新的ptftTransformerService(),“callTransformerService”);这也行不通。如果我将exchange body设置为一个可以工作的对象,但我不希望这样做。只需要将对象传递给一个方法。好的,我以前不理解你的代码。我认为这样做是行不通的,因为您只能从exchange传递给bean方法somethink,所以必须设置body或header(如果您不想更改body),并使用简单的语言将该header传递给您的方法:exchange.getIn().setHeader(“headerName”,msgBean)。bean(ptftTransformerService.class,“callTransformerService(${header.headerName})”或exchange.getIn().setBody(msgBean)。bean(ptftTransformerService.class,“callTransformerService”),但这涉及到在某些路径上添加一个TypeConverter文件,并在META-INF文件中提供我觉得不舒服的包列表。。为什么camel不提供一种简单地将对象传递给bean方法的方法呢?当然可以,只需使用java.lang.object作为类型。我建议您学习更多关于Camel的知识,例如关于bean组件/bean参数绑定。你可以阅读CiA2书的免费第4章或浏览骆驼网站文档-谢谢克劳斯,我明白你的意思了。但若你们看到我的代码,我希望传递我在从exchange中读取Body后创建的myObject。现在,如果不使用类型转换器,我可以像“bean(ptftTransformerService.class,“callTransformerService(myObject)”;”那样传递它了吗我知道我可以使用Body并设置任何类型的对象,然后在另一部分使用@Body。但这涉及到在某个路径上添加一个TypeConverter文件,并在META-INF文件中提供我感觉不舒服的包列表。。为什么camel不提供一种简单地将对象传递给bean方法的方法呢?当然可以,只需使用java.lang.object作为类型。我建议您学习更多关于Camel的知识,例如关于bean组件/bean参数绑定。你可以阅读CiA2书的免费第4章或浏览骆驼网站文档-谢谢克劳斯,我明白你的意思了。但若你们看到我的代码,我希望传递我在从exchange中读取Body后创建的myObject。现在,如果不使用类型转换器,我可以像“bean(ptftTransformerService.class,“callTransformerService(myObject)”;”那样传递它了吗我知道我可以使用Body并设置任何类型的对象,然后在另一个部分上使用@Body。您需要在上面的处理方法中使用msgBean替换旧的Body,例如exchange.getIn().setBody(msgBean);谢谢这就是我最后所做的。在上面的处理方法中,您需要用msgBean替换旧的主体,例如exchange.getIn().setBody(msgBean);谢谢这就是我最后做的。