Java 如果定义了自定义处理器(非空),如何使用该处理器?

Java 如果定义了自定义处理器(非空),如何使用该处理器?,java,apache,apache-camel,Java,Apache,Apache Camel,我想要一个基本的RouteBuilder类,它允许使用可选的自定义处理器。如果指定了子类,则将其添加到路由,否则不添加 我一直在尝试使用choice()when()otherwise()构造,但不用说没有成功。我刚刚使用ApacheCamel,因此不确定如何解释/修复错误消息。如果定义了自定义处理器,它可以正常工作,但是如果它为null,我会得到下面的错误消息 封装测试; 导入org.apache.camel.CamelContext; 导入org.apache.camel.LoggingLev

我想要一个基本的RouteBuilder类,它允许使用可选的自定义处理器。如果指定了子类,则将其添加到路由,否则不添加

我一直在尝试使用
choice()when()otherwise()
构造,但不用说没有成功。我刚刚使用ApacheCamel,因此不确定如何解释/修复错误消息。如果定义了自定义处理器,它可以正常工作,但是如果它为null,我会得到下面的错误消息

封装测试;
导入org.apache.camel.CamelContext;
导入org.apache.camel.LoggingLevel;
导入org.apache.camel.Predicate;
导入org.apache.camel.Processor;
导入org.apache.camel.builder.PredicateBuilder;
导入org.apache.camel.impl.DefaultCamelContext;
公共类SimpleApp{
公共静态最终长五分钟=5*60*1000;
公共SimpleApp(){
试一试{
CamelContext ctx=新的DefaultCamelContext();
addRoutes(新的SimpleRouteBuilder());
ctx.addRoutes(新org.apache.camel.builder.RouteBuilder(){
@凌驾
public void configure()引发异常{
处理器进程=新的SimpleProcessor();
//proc=null;
谓词useProc=PredicateBuilder.isNotNull(常量(proc));
从(”timer://myTimer?period=3000")

.simple(“在${header.firedTime}创建新消息”)
.log(LoggingLevel.WARN,“在${header.firedTime}生成的消息”)
.至(“流出:流出”)
.choice()
.when(useProc)
.log(LoggingLevel.WARN,“使用自定义处理器(不为空)”)
.过程(proc)
.至(“流出:流出”)
.endChoice()
.否则()
.log(LoggingLevel.WARN,“跳过自定义处理器(为空)”)
.endChoice()
(完)
.log(LoggingLevel.WARN,“结束选择构造”)
。至(“流出”);
}
});
ctx.start();
System.out.println(“已启动…”);
睡眠(五分钟);
System.out.println(“完成等待,退出”);
ctx.stop();
}
捕获(例外e){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
新的SimpleApp();
}
}
处理器是一个虚拟的占位符,但下面是代码

封装测试;
导入org.apache.camel.Exchange;
导入org.apache.camel.Processor;
公共类SimpleProcessor实现处理器{
公共SimpleProcessor(){
System.out.println(“运行简单处理器”);
}
@凌驾
公共作废进程(Exchange)引发异常{
System.out.println(“处理交换”);
}
}
即使我设置了
proc=null
,我也希望能够工作,但是我收到了以下错误消息:

19-10-08 11:30:15.710] test.SimpleProcessor:14 [INFO  ] => Running Simple Processor
org.apache.camel.FailedToCreateRouteException: Failed to create route route2 at: >>> Choice[[When[{null is not null} -> [Log[Using Custom Processor (is not null)], process[Processor@0x0], To[stream:out]]]] Otherwise[[Log[Skipping Custom Processor (is null)]]]] <<< in route: Route(route2)[[From[timer://myTimer?period=3000]] -> [SetBod... because of ref must be specified on: process[Processor@0x0]
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1352)
    at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:212)
    at org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:1140)
    at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:3735)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3440)
    at org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3248)
    at org.apache.camel.impl.DefaultCamelContext$4.call(DefaultCamelContext.java:3244)
    at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3267)
    at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3244)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:72)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3160)
    at test.SimpleApp.<init>(SimpleApp.java:47)
    at test.SimpleApp.main(SimpleApp.java:61)
Caused by: java.lang.IllegalArgumentException: ref must be specified on: process[Processor@0x0]
19-10-08 11:30:15.710]测试SimpleProcessor:14[INFO]=>运行简单处理器
org.apache.camel.FailedToCreateRouteException:未能在以下位置创建路由route2:>>>Choice[[当[{null不为null}->[Log[使用自定义处理器(不为null)],进程[Processor@0x0],发送到[stream:out]]]],否则[[Log[跳过自定义处理器(为空)]]]]用于组件,创建路由时,它需要类的java实例来实现。显然,
null
不符合要求

要解决此问题,请创建两个函数来返回RouteBuilder,一个不带处理器,另一个带处理器(传递变量)。然后有一个函数来选择要使用的RouteBuilder

// Sample code - function with processor (pass by variable)
protected static RouteBuilder createRouteBuilder(final Processor myProcessor) throws Exception{

    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from("timer://myTimer?period=3000")
                // omit steps
                .process(myProcessor)
                // omit steps
                .to("stream:out");
        }
    };
}

@hk6279的评论是有效的,但不是我所需要的方法,因为如果我想要/需要多个处理器,那么就需要太多的if条件来定义不同的方法

我更改了应用程序,并使用XML文件和Spring来钩住所有组件。它使用命名组件,应用程序按名称获取它们。在我的RouteBuilder配置方法中,我获取对象并创建谓词

Processor reqProc=
this.getContext().getRegistry().lookupByNameAndType(“requestProcessor”,Processor.class);
谓词useReqProc=PredicateBuilder.isNotNull(常量(reqProc));
无论出于何种原因,如果我从XML中定义的bean中获取处理器,我可以使用我需要的
choice()when()
构造。如果我像问题中显示的那样直接尝试,我就不能。从上面得到谓词后,我可以执行以下操作:

from(sources.toArray(新字符串[0]))
.split()方法(RequestSplitter.class,“splitMessage”)
.choice()
.when(useReqProc)
.log(LoggingLevel.INFO,“找到使用它的请求处理器”)
.to(“bean:“+”请求处理器”)
.endChoice()
.否则()
.log(LoggingLevel.ERROR,“找不到requestProcessor,正在停止路由”)
.停止
.endChoice()
(完)
.log(“将请求发送到战神URI”)
.recipientList(标题(Constants.HDR_TARGET_URI));

我希望这对其他人有用。

谢谢你的回答。您是对的,null不是处理器,这是谓词的目的。根本的问题是(如果可行的话)如何使用choice()when()测试处理器是否为null,如果为null,则将其添加到路由中,如果为null,则跳过它null@OegBizzCamel RouteBuilder要求在创建路由时定义好处理器,而谓词只有在exchange通过时才有效解决方法是建议您将控制权从Camel RouteBuilder移动到java函数。