代码之家  ›  专栏  ›  技术社区  ›  jbabu

ApacheCamel通用路由器-将交换属性传递给静态类方法

  •  0
  • jbabu  · 技术社区  · 4 年前

    我正在尝试创建一个通用路由器,它的处理器和其他属性是从静态类填充的。这是示例代码。

    public class GenericRouter  extends RouteBuilder( {
         @Override 
         public void configure() throws Exception {
             from("direct:generic-route")
             .process(Util.getProcesss(“${exchangeProperty[processKey]"))
             .ToD(Util.getUrl(“${exchangeProperty[urlKey]"));
         }
    }
    
    Public class Util{
        Map<String,Object> routerResources;
        static {
         //load routerResources
        }
    
        public static Processor getProcessor(String processorKey){
           return (Processor)routerResources.get(processorKey);
        }
        public static Processor getUrl(String urlKey){
           return (String)routerResources.get(urlKey);
        }
    
     }
    

    通用路由器应发出一个休息呼叫。属性“urlKey”和“processorUrl”已在交换中可用。我发现很难将交换属性传递给静态Util类方法。

    0 回复  |  直到 4 年前
        1
  •  0
  •   Pasi Österman    4 年前

    如果你想用纯java访问交换的属性,你可以使用 .process .exchange 。如果需要访问正文或页眉,可以使用 e.getMessage().getBody() e.getMessage().getHeader()

    from("direct:generic-route")
        .process( e -> {
            String processKey = e.getProperty("processKey", String.class);
            Processor processor = Util.getProcessor(processKey);
            processor.process(e);
        })
        .setProperty("targetURL").exchange( e -> {
            String urlKey = e.getProperty("urlKey", String.class);
            return Util.getUrl(urlKey);
        })
        .toD("${exchangeProperty.targetURL}");
    

    还要确保修复了此方法的返回类型:

    public static Processor getUrl(String urlKey){
        return (String)routerResources.get(urlKey);
    }
    

    附带说明一下,您实际上可以通过简单的语言使用存储在body、header或property中的map。

    public class ExampleTest extends CamelTestSupport {
        
        @Test
        public void example(){
    
            template.sendBodyAndHeader("direct:example", null, "urlKey", "urlA");
        }
    
        @Override
        protected RoutesBuilder createRouteBuilder() throws Exception {
            return new RouteBuilder() {
    
                @Override
                public void configure() throws Exception {
                 
                    Map<String, String> urlMap = new HashMap<>();
                    urlMap.put("urlA", "direct:pointA");
                    urlMap.put("urlB", "direct:pointB");
    
                    from("direct:example")
                        .setProperty("urlMap").constant(urlMap)
                        .log("url: ${exchangeProperty.urlMap['${headers.urlKey}']}");
                }
            };
        }
    }
    
    推荐文章