Java 基于查询的驼峰路由策略

Java 基于查询的驼峰路由策略,java,spring-boot,apache-camel,Java,Spring Boot,Apache Camel,我有几个位于计时器上的camel进程和一些轮询JMS端点的路由。我想实现一个RoutePolicy来运行DB查询,以确定它是否应该继续路由。如果“OneXchangeBeagin”方法的位置正确,则可能会使用该方法 我知道我可以在路由的开始处进行检查,这在计时器端点中可能就足够了,但这种方法在JMS轮询中不起作用,因为它将拉动JMS负载。此外,我想在多个路由中共享此路由策略 如果有人能告诉我示例代码或方法,我将不胜感激 谢谢为了创建路由策略,您必须实现RoutePolicy接口,或者使用came

我有几个位于计时器上的camel进程和一些轮询JMS端点的路由。我想实现一个RoutePolicy来运行DB查询,以确定它是否应该继续路由。如果“OneXchangeBeagin”方法的位置正确,则可能会使用该方法

我知道我可以在路由的开始处进行检查,这在计时器端点中可能就足够了,但这种方法在JMS轮询中不起作用,因为它将拉动JMS负载。此外,我想在多个路由中共享此路由策略

如果有人能告诉我示例代码或方法,我将不胜感激


谢谢

为了创建路由策略,您必须实现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一节中的更多内容