【问题标题】:Use a method as producer in camel route在骆驼路线中使用方法作为生产者
【发布时间】:2018-01-27 07:58:48
【问题描述】:

我有一个不时生成字符串的方法。我想将方法​​注册为 uri 并生成一个交换方法,该方法将用作路由的输入。

方法被不同的类调用

SampleClass sc = new SampleClass();
sc.sampleMethod("Hello");

例如:

public class SampleClass{
    @Produce(uri = "direct:consumerMethod")
    ProducerTemplate producer;
    public sampleMethod(Object obj){
          producer.sendBody(object);
    }
}

路由定义如下:

@Override
    public void configure() {
        from("direct:consumerMethod").process(new GenerateD());
    }

但是当我使用 sampleMethod 生成时,路由不会调用 GenerateD 类。这不可行还是我做错了什么?

【问题讨论】:

  • 我相信.process(...) 的参数需要是Processor 或继承/实现它 - 在你的处理器内部,你可以调用你的方法。我离我的示例代码还很远,但这可能会让你朝着正确的方向前进。
  • 你得到什么错误?
  • 我在 producer.sendBody() 周围进行了尝试,发现 producer 为空。那么这是否意味着direct:consumerMethod没有启动呢?

标签: java apache-camel


【解决方案1】:

在您拥有sampleMethod(Object) 的班级中添加以下字段:

@Produce(uri = "direct:consumerMethod")
ProducerTemplate template;

在您的sampleMethod(Object) 中,您可以像这样使用之前添加的template

public sampleMethod(Object obj){
      template.sendBody(object);
}

它应该向direct:consumerMethod 路由发送一条消息。

【讨论】:

  • 如果你看到我的代码,它已经在这样做了。但是这个过程没有被调用。
  • 您确定direct:consumerMethod 路由已启动吗?你在 Spring 中使用 Camel 吗?
【解决方案2】:

如果你想调用某个方法,请使用类似的东西

@Override
public void configure() {
    from("direct:consumerMethod").log(simple("${bean:generateD?method=generateDMethod}"));
}

上述表达式将调用generateD 对象(bean)的generateDMethod 并将方法输出记录到控制台(默认日志写入器)。 要使上述表达式起作用,您必须将generateD bean 存储在注册表中,这将进一步与您的应用程序的 CamelContext 关联。你也可以这样做

@Autowired
private GenerateD generateD;

@Override
protected CamelContext createCamelContext() throws Exception {
    SimpleRegistry registry = new SimpleRegistry(); 
    registry.put("generateD", generateD); //the generateD bean,which can be used anywhere in the camelcontext
    SpringCamelContext camelContext = new SpringCamelContext();
    camelContext.setRegistry(registry); //add the registry
    camelContext.setApplicationContext(getApplicationContext());
    camelContext.start();
    return camelContext;
}

这会将 bean 添加到 camelContext。请在link 上查看我的答案以获取完整示例。

【讨论】:

    【解决方案3】:

    最后这对我的用例有用。

    开始camelcontext如下:

    CamelContext camelContext = new DefaultCamelContext();
    camelContext.addRoutes(new SampleRoute());
    camelContext.start();
    

    我的路由构建器类:

        class SampleRoute extends RouteBuilder {
    
        @Override
        public void configure() {
            try
            {
                from("direct:consumerMethod").process(new DDT());
            }catch(Exception e)
            {
                e.printStackTrace();
            }
    
        }
    }
    

    然后我创建一个具有 sendMessage 方法的接口。

    public interface DDTConsumer {
    
        public String sendMessage(Object object);
    
    }
    

    现在我实现这个方法来创建这个接口的端点并向端点发送消息。

    DDTConsumer ddt;
    try {
        ddt = new ProxyBuilder(camelContext).endpoint("direct:consumerMethod").build(DDTConsumer.class);
        ddt.sendMessage(msg.getValue());
        } catch (Exception e) {
            e.printStackTrace();
        }
    

    这解决了我的问题,路线现在运行良好。希望它也对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2014-10-04
      • 2014-08-22
      • 2018-09-05
      • 2018-07-28
      • 2017-07-06
      相关资源
      最近更新 更多