根据邮件正文或邮件头中的属性动态加载骆驼处理器
我正在寻找解决方案,通过在运行时动态决定的处理器发送邮件,具体取决于邮件头或主体上的某个属性。根据邮件正文或邮件头中的属性动态加载骆驼处理器
假设我有两个消息处理器(例如:Type1RequestProcessor
,Type2RequestProcessor
),如下所述。
我想要做的是在执行任一Type1RequestProcessor
Type2RequestProcesso
或中的R消息头OT体使用属性动态地决定的。(在这里,我不想创建每处理器类型的多个路由器。)
我试图如下所述(在标题中传递typeId)。但它显然给出了下面的错误说No bean could be found in the registry for: ${header.messageId}RequestProcessor of type: org.apache.camel.Processor
。
HTTPRouter.java
import javax.enterprise.context.ApplicationScoped;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.cdi.ContextName;
@ApplicationScoped
@ContextName("camel-cdi-context")
public class HTTPRouter extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:oneRouter")
.process("${header.typeId}RequestProcessor")
.to("direct:anotherRouter");
}
}
错误:
org.apache.camel.FailedToCreateRouteException: Failed to create route route19 at: >>> process[ref:${header.messageId}RequestProcessor] <<< in route: Route(route19)[[From[direct:oneRouter]] -> [process[ref:${he... because of No bean could be found in the registry for: ${header.messageId}RequestProcessor of type: org.apache.camel.Processor
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1298)
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:204)
at org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:1087)
at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:3540)
at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3271)
at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:202)
我试图与Bean组件还,但结果是一样的。
任何人都可以在这里举手吗? 如何动态加载处理器?
Type1RequestProcessor.java
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class Type1RequestProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
// Do Type1 process implementation
}
}
Type2RequestProcessor.java
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class Type2RequestProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
// Do Type2 process implementation
}
}
注:我在路由器本身的工艺方法中的动态加载这些实施B计划(匿名内部类)。但我仍然在寻找这个,因为它完全符合我的要求。
- 骆驼版本:2.19.2
- WildFly版本:10.1.0
- 骆驼补丁版本: wildfly-骆驼膜片4.9.0
动态表达式语言,不能使用内部处理方法,但您可以使用@Named
注释您的处理器,使其在CDI注册表中可用。然后用bean组件使用.toD(bean:${header.typeId}RequestProcessor)
或直接使用来调用它。.toD(${header.typeId}RequestProcessor)
请注意命名bean名称在camelCase中默认转换为类名称。您可以使用@Named("Type1RequestProcessor")
自定义此行为。
嗨贝德,豆:这是很好地按预期工作。我对它很接近。但让它对我可见。非常感谢!顺便说一句,直接调用没有bean:组件不起作用(错误:org.apache.camel.ResolveEndpointFailedException:无法解析端点:Type1RequestProcessor由于:uri:Type1RequestProcessor bean:[email protected]无法转换为端点 – namalfernandolk
查看这个FAQ:http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html –
Thanx克劳斯易卜生,但我正在寻找动态加载处理器。不能动态地调用URI。如果我需要动态调用URI,我也可以使用toD(),因为我使用的是骆驼2.19。 – namalfernandolk