Apache camel 来自直接路由的驼峰返回消息以供重用
我对从Camel中由Apache camel 来自直接路由的驼峰返回消息以供重用,apache-camel,Apache Camel,我对从Camel中由to()调用的子路由返回“body”感到非常困惑。从我对直接路由的发现来看,它们鼓励路由重用,并用于复杂路由上的逻辑拆分。但我似乎做不到一个最简单的“拆分”: 处理器实例的类如下所示: public class RequestProcessor { @Handler public void update(@Body MyModelRequest request) { // do stuff } } 问题是,用于解组请求的路由(第二
to()
调用的子路由返回“body”感到非常困惑。从我对直接路由的发现来看,它们鼓励路由重用,并用于复杂路由上的逻辑拆分。但我似乎做不到一个最简单的“拆分”:
处理器实例的类如下所示:
public class RequestProcessor {
@Handler
public void update(@Body MyModelRequest request) {
// do stuff
}
}
问题是,用于解组请求的路由(第二个路由)的结果不会传播回调用路由。抛出一个异常,说明它无法将字符串(进入队列的JSON)转换为MyModelRequest类。因此,第一条路由中的JSON主体似乎没有被解组路由的结果所取代。这确实是我希望的一条很好的路线
我偶然发现了InOut消息,但文档非常不清楚,我的实验也以同样的方式失败了
我需要做什么才能真正将一条路线的一部分提取到另一条路线以供重用?如果没有一个可运行的示例来报告错误,很难判断出哪里出了问题,但它应该(并且确实如此!在2.17.2和2.15.3上进行了测试)工作: 以下是输出: 2016-08-30 13:48:34.337信息16240---[main]com.example.DemoApplication:在5.859秒内启动了DemoApplication(JVM运行6.587) 标题是《指环王》,作者是《J.R.R.托尔金》 2016-08-30 13:48:44.298信息16240---[timer://sender]路线1:标题为《指环王》,作者为《J.R.R.托尔金》 标题是《指环王》,作者是《J.R.R.托尔金》 2016-08-30 13:48:47.232信息16240---[timer://sender]路线1:标题为《指环王》,作者为《J.R.R.托尔金》
所以问题就出在OneException条款中(原来的问题没有提到,我认为这不是问题所在)。我把
end()
调用与stop()
调用混淆了,因此路由很快就停止了,返回了未解析的JSON字符串。正确答案是:
from("direct:createRequest")
.onException(Exception.class).bean(requestErrorHandler).end()
.unmarshal().json(JsonLibrary.Jackson, MyModelRequest.class);
我可能只是在json方法调用中错误地删除了一个参数。更新问题。奇怪的是,这对我不起作用。它尝试将带有JSON的字符串强制转换为@Body MyModelRequest类。版本为2.15.3。是否不可能使用更新的版本?这可能是Camel中的一个bug。在2.15.3上试用过,效果非常好。你能发布一个可运行的代码示例并给出示例JSON吗?所以问题出在别处,我认为它是正确的,所以我把它排除在外了。看看我的答案。谢谢您的时间。:)啊,就是这样,我知道它不应该是直接的路线:)是的,我还认为它应该返回身体。谢谢你的帮助!你能接受这个答案吗,这样问题就不会显示为没有答案了?谢谢哟。我等了几个小时,然后就忘了。谢谢提醒
@Component
public class DemoRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
from("timer:sender?delay=10s&period=3s")
.setBody(constant("{\"title\":\"Lord of the Rings\",\"author\":\"J.R.R. Tolkien\"}"))
.to("direct:unmarshal")
.bean(new RequestProcessor())
.log("${body}!");
from("direct:unmarshal")
.unmarshal().json(JsonLibrary.Jackson, Book.class);
}
public static class RequestProcessor {
@Handler
public void update(@Body Book book) {
System.out.println("Got " + book);
}
}
public static class Book {
private final String title;
private final String author;
private Book() {
this(null, null);
}
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
@Override
public String toString() {
return "title='" + title + "', author='" + author + '\'';
}
}
}
from("direct:createRequest")
.onException(Exception.class).bean(requestErrorHandler).end()
.unmarshal().json(JsonLibrary.Jackson, MyModelRequest.class);