如何避免null body分多步进入下一个processor
How to avoid null body from entering into next processor in multiple steps
如何限制空主体在一个公共位置进入多个处理器。在下面的代码中,我如何才能在一个地方定义它,而不是在每个处理器上进行空体检查?
<choice>
<when>
<simple>${body} != null</simple>
<process ref="processor1" />
<choice>
<when>
<simple>${body} != null</simple>
<process ref="processor2" />
<!-- Splitter -->
<split>
<simple>body</simple>
<process ref="processor3" />
</split>
</when>
</choice>
</when>
</choice>
评论里的代码会显示的很烂,所以我post一个答案。
在处理器中做它是一个简单的空检查,没有哲学
public class SomeProcessor implements Processor {
public void process(Exchange exchange) {
if(exchange.getIn().getBody() != null){
// Your processing here
// Is only performed
// When body is not null
// Otherwise null body is being resent
}
}
}
编辑(回复评论):
这是不可能的 AFAIK,也不是正确的方法。
Router 你已经在使用的是它应该如何执行。
如果你想丢弃你的消息,我认为这可行(不过我没有检查):
<choice>
<when>
<simple>${body} == null</simple>
#<stop />
# OR
#<to uri="wherever-you-want-to-send-nonvalid-messages" />
</when>
<otherwise>
<camel:process ref="processor1" />
<camel:process ref="processor2" />
<camel:process ref="processor3" />
<to uri="where-you-want-to-send-valid-messages" />
</otherwise>
</choice>
它只会在第一个处理器之前检查空值,显然,所以如果第二个处理器给出空值消息,它不会被丢弃。
我建议您将根全部保留在一起,从而使进一步的空检查变得过时。停止对当前消息进行路由处理的一种快速简便的方法是在 exchange
对象上设置 Exchange.ROUTE_STOP
属性 AND return null
:
exchange.getProperty(Exchange.ROUTE_STOP, Boolean.TRUE)
通过添加 <stop>
标签,您可以做到这一点。
<choice>
<when>
<simple>${body} != null</simple>
<stop></stop>
</when>
<otherwise>
<process ref="processor2" />
<!-- Splitter -->
<split>
<simple>body</simple>
<process ref="processor3" />
</split>
<otherwise>
</choice>
如何限制空主体在一个公共位置进入多个处理器。在下面的代码中,我如何才能在一个地方定义它,而不是在每个处理器上进行空体检查?
<choice>
<when>
<simple>${body} != null</simple>
<process ref="processor1" />
<choice>
<when>
<simple>${body} != null</simple>
<process ref="processor2" />
<!-- Splitter -->
<split>
<simple>body</simple>
<process ref="processor3" />
</split>
</when>
</choice>
</when>
</choice>
评论里的代码会显示的很烂,所以我post一个答案。 在处理器中做它是一个简单的空检查,没有哲学
public class SomeProcessor implements Processor {
public void process(Exchange exchange) {
if(exchange.getIn().getBody() != null){
// Your processing here
// Is only performed
// When body is not null
// Otherwise null body is being resent
}
}
}
编辑(回复评论): 这是不可能的 AFAIK,也不是正确的方法。 Router 你已经在使用的是它应该如何执行。 如果你想丢弃你的消息,我认为这可行(不过我没有检查):
<choice>
<when>
<simple>${body} == null</simple>
#<stop />
# OR
#<to uri="wherever-you-want-to-send-nonvalid-messages" />
</when>
<otherwise>
<camel:process ref="processor1" />
<camel:process ref="processor2" />
<camel:process ref="processor3" />
<to uri="where-you-want-to-send-valid-messages" />
</otherwise>
</choice>
它只会在第一个处理器之前检查空值,显然,所以如果第二个处理器给出空值消息,它不会被丢弃。
我建议您将根全部保留在一起,从而使进一步的空检查变得过时。停止对当前消息进行路由处理的一种快速简便的方法是在 exchange
对象上设置 Exchange.ROUTE_STOP
属性 AND return null
:
exchange.getProperty(Exchange.ROUTE_STOP, Boolean.TRUE)
通过添加 <stop>
标签,您可以做到这一点。
<choice>
<when>
<simple>${body} != null</simple>
<stop></stop>
</when>
<otherwise>
<process ref="processor2" />
<!-- Splitter -->
<split>
<simple>body</simple>
<process ref="processor3" />
</split>
<otherwise>
</choice>