2017-11-04 192 views
1

我正在寻找解决方案,通过在运行时动态决定的处理器发送邮件,具体取决于邮件头或主体上的某个属性。根据邮件正文或邮件头中的属性动态加载骆驼处理器

假设我有两个消息处理器(例如:Type1RequestProcessorType2RequestProcessor),如下所述。

我想要做的是在执行任一Type1RequestProcessorType2RequestProcesso或中的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
+0

查看这个FAQ:http://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html –

+0

Thanx克劳斯易卜生,但我正在寻找动态加载处理器。不能动态地调用URI。如果我需要动态调用URI,我也可以使用toD(),因为我使用的是骆驼2.19。 – namalfernandolk

回答

1

动态表达式语言,不能使用内部处理方法,但您可以使用@Named注释您的处理器,使其在CDI注册表中可用。然后用bean组件使用.toD(bean:${header.typeId}RequestProcessor)或直接使用.toD(${header.typeId}RequestProcessor)来调用它。

请注意命名bean名称在camelCase中默认转换为类名称。您可以使用@Named("Type1RequestProcessor")自定义此行为。

+0

嗨贝德,豆:这是很好地按预期工作。我对它很接近。但让它对我可见。非常感谢!顺便说一句,直接调用没有bean:组件不起作用(错误:org.apache.camel.ResolveEndpointFailedException:无法解析端点:Type1RequestProcessor由于:uri:Type1RequestProcessor bean:[email protected]无法转换为端点 – namalfernandolk