Camel动态构建处理器bean调用

时间:2017-08-31 18:59:37

标签: spring apache-camel javabeans processor

所以这是一个关于一个主题的bean设置示例。请记住,有多个bean ...每种消息类型一个

                       

我已经能够通过每个消息类型的路由成功接收和处理我的所有消息类型,但我想简化上下文文件,因此我只有一条接收的路由我的所有主题。

以下是我的路线设置......

    <route id="Netty7001Route">
       <from uri="netty4:tcp://192.168.200.3:7001…"/>
       <to uri=”seda:ProcessRoute”/>
    </route>

    <route id=”ProcessRoute”/>
      <from uri=”seda:ProcessRoute”/>
           <setHeader headerName="LOGMESSAGE"><simple>A10::Entering endpoint for track message ${in.header.MSGNAME} via netty4</simple></setHeader>
           <to uri="log:messageLogger?level=ERROR"/>
           <setHeader headerName="LOGMESSAGE"><simple>A11::Leaving endpoint for track message ${in.header.MSGNAME}</simple></setHeader>
           <to uri="log:messageLogger?level=ERROR"/>
           <setHeader headerName="LOGMESSAGE"><constant>A14::Entering Mediation</constant></setHeader>
           <to uri="log:messageLogger?level=ERROR"/>
           **<process ref="DDS_C2_NewSystemReferencePointMediationBean"/>**
       <setHeader headerName="MSGNAME"><constant>C2_TM_NewSystemReferencePoint</constant></setHeader>
       <setHeader headerName="MSGTYPE"><constant>C2_NewSystemReferencePoint</constant></setHeader>
           <setHeader headerName="LOGMESSAGE"><constant>A15::Leaving Mediation</constant></setHeader>
           <to uri="log:messageLogger?level=ERROR"/>
           <setHeader headerName="LOGMESSAGE"><constant>A17::Sending message to DDS domain 4</constant></setHeader>   
           <to uri="log:messageLogger?level=ERROR"/>
       <to uri="dds://4/C2_TM_NewSystemReferencePoint?typeName=C2_NewSystemReferencePoint"/>
    </route>

因此,上面的进程ref = line是我想要动态的,因为在查看标题中的MSGNAME之前我不知道要调用哪个bean处理器。我已经尝试使用了因为它们不是端点而不是处理器bean而失败的recipList,我尝试仅使用ref:DDS_C2 _ {$ in.header.MSGNAME} MediationBean,但是camel将无法启动并在此处抱怨简单标记。有没有办法在驼峰弹簧配置中做到这一点?

我尝试使用检查MSGNAME的标记然后调用相应的处理器bean来解决方法,但我需要为每种消息类型设置条件。这有效,但与每个主题的路由相比,效率极低。

我已经考虑过编写一个可以在java代码中调用适当的bean处理器的处理器,但我不确定这是否是正确的方法来完成我需要的东西以及它是否会更多高效使用标签。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

最好的方法是使用描述为here的ProcessorEndpoint创建一个新的组件。

工作示例(带处理器)

  1. 创建自定义组件:

    package com.mgyongyosi.sample.component;
    
    // imports
    
    public class SpecifiedProcessor extends DefaultComponent {
    
    @Override
    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
        Object registryObj = getCamelContext().getRegistry().lookupByName(remaining);
    
        if(!(registryObj instanceof Processor))
            throw new IllegalArgumentException("The Processor with the specified name was not found in the Registry.");
    
        return new ProcessorEndpoint(uri, this, (Processor)registryObj);
    }
    
  2. 通过在specified-processor目录中创建名为META-INF/services/org/apache/camel/component的文件(这将是组件的uri方案)来注册您的组件,其中包含以下内容(full documentation ):

    class=com.mgyongyosi.sample.component.SpecifiedProcessor
    
  3. Java DSL的示例用法:

    from("timer:helloworld?period=5000")
            .setHeader("MSGNAME", constant("NewSystemReferencePoint"))
            .toD("specified-processor://DDS_C2_${in.header.MSGNAME}MediationBean")
            .log("${body}");
    
  4. 在XML中:

    <toD uri="specified-processor://DDS_C2_${in.header.MSGNAME}MediationBean"/>
    

    如果是豆

    Java DSL:.toD("bean:DDS_C2_${in.header.MSGNAME}MediationBean")

    XML:<toD uri="bean:DDS_C2_${in.header.MSGNAME}MediationBean"/>