Java 基于查询的驼峰路由策略
我有几个位于计时器上的camel进程和一些轮询JMS端点的路由。我想实现一个RoutePolicy来运行DB查询,以确定它是否应该继续路由。如果“OneXchangeBeagin”方法的位置正确,则可能会使用该方法 我知道我可以在路由的开始处进行检查,这在计时器端点中可能就足够了,但这种方法在JMS轮询中不起作用,因为它将拉动JMS负载。此外,我想在多个路由中共享此路由策略 如果有人能告诉我示例代码或方法,我将不胜感激Java 基于查询的驼峰路由策略,java,spring-boot,apache-camel,Java,Spring Boot,Apache Camel,我有几个位于计时器上的camel进程和一些轮询JMS端点的路由。我想实现一个RoutePolicy来运行DB查询,以确定它是否应该继续路由。如果“OneXchangeBeagin”方法的位置正确,则可能会使用该方法 我知道我可以在路由的开始处进行检查,这在计时器端点中可能就足够了,但这种方法在JMS轮询中不起作用,因为它将拉动JMS负载。此外,我想在多个路由中共享此路由策略 如果有人能告诉我示例代码或方法,我将不胜感激 谢谢为了创建路由策略,您必须实现RoutePolicy接口,或者使用came
谢谢为了创建路由策略,您必须实现RoutePolicy接口,或者使用camel提供的类org.apache.camel.support.RoutePolicySupport作为方便。所以你的政策课一定是
class MyRoutePolicy extends RoutePolicySupport{...}
正如您在描述中所说,OneXchangeBeagin
在JMS情况下不起作用,因为它将使用您的消息,因此消息将丢失
我认为一种可行的方法是禁用/启用侦听JMS队列的相应路由
所以,您可以从计时器开始创建一个新路由,比如说每10秒,它将运行您想要的DB查询。在此路径中,您将应用您的策略,并使用onExchangeDone
。因此,如果结果正常,那么启用JMS路由,或者禁用它。大概是这样的:
public void onExchangeDone(Route route, Exchange exchange) {
//check the result of the query
... exchange.getIn().getBody() ...
// If result is ok (enable JMS route)
CamelContext context = exchange.getContext();
if(ok){
try {
context.startRoute("JMSRoute");
} catch (Exception e) {
getExceptionHandler().handleException("Exception occured during staring route ", e);
}
}
// If result is not ok (disable JMS route)
else{
try {
context.getInflightRepository().remove(exchange, "JMSRoute");
context.stopRoute("JMSRoute");
} catch (Exception e) {
getExceptionHandler().handleException("Exception occured during stoping route ", e);
}
}
}
如果您希望在许多路由中添加相同的路由策略,则只需在路由中添加routePolicyRef(XML DSL)或routePolicy(Java DSL)。比如说
<bean id="myRoutePolicy" class="com.xxx.MyRoutePolicy"/>
<route id="route1" routePolicyRef="myRoutePolicy"> ... </route>
<route id="route2" routePolicyRef="myRoutePolicy"> ... </route>
<route id="route3" routePolicyRef="myRoutePolicy"> ... </route>
...
...
...
或者使用RoutePolicyFactory,请参阅使用RoutePolicyFactory一节中的更多内容