【问题标题】:Camel Multicast not working骆驼组播不工作
【发布时间】:2014-02-01 03:47:38
【问题描述】:

这里是骆驼 2.11.0。我有以下骆驼路线:

<route id="main-route"> 
    <from uri="timer://runOnce?repeatCount=1&amp;delay=10" /> 

    <to uri="bean:loggingBean?method=main" />

    <to uri="bean:processorBean?method=doSomething" />

    <to uri="bean:loggingBean?method=afterProcessing" />

    <multicast> 
        <to uri="direct:validator" />
        <to uri="direct:rejector" /> 
    </multicast> 
</route>

<route id="validator-route"> 
    <from uri="direct:validator" />
    <to uri="bean:loggingBean?method=validator" />
</route>

<route id="rejector-route"> 
    <from uri="direct:rejector" /> 
    <to uri="bean:loggingBean?method=rejector" />
</route>

...loggingBean 的样子:

public class LoggingBean {
    public void main(Exchange e) {
        System.out.println("Starting main route...");
    }

    public void afterProcessing(Exchange e) {
        System.out.println("Processing input...");
    }

    public void validator(Exchange e) {
        System.out.println("In validator route...");
    }

    public void rejector(Exchange e) {
        System.out.println("In rejector route...");
    }
}

当我运行这段代码时,我得到以下控制台输出:

Starting main route...
Processing input...
In validator route...

因为我们在这里是 multi-casting,所以我希望它还包括拒绝器的输出,看起来像:

Starting main route...
Processing input...
In validator route...
In rejector route...

因此,Multicaster 似乎只发送到嵌套在其中的第一个元素(在 Spring XML 中),而不是第二个。嗯,有趣。因此,我将&lt;multicast&gt; 元素更改为如下所示:

<multicast> 
    <to uri="direct:rejector" /> 
    <to uri="direct:validator" />
</multicast> 

这一次,控制台输出如下:

Starting main route...
Processing input...
In rejector route...

所以这得到了证实:&lt;multicast&gt; 只是将交换广播到它下面列出的第一个子元素。 为什么,我该如何解决?

【问题讨论】:

  • 您想同时发送给两者,您应该更改为异步通道。如果第一个频道出错,我不知道多播中会发生什么
  • 我会尝试升级到 2.11 发布分支 (2.11.2) 的最新稳定版本,然后重试。

标签: java apache-camel routes multicast


【解决方案1】:

【讨论】:

  • 谢谢@boday (+1) - 为了节省时间,有没有办法让我定义我自己的 Java Processor impl 并让它做我正在尝试的同样的事情让多播器做什么?我需要将exchange.getIn() 发送到direct:validator,然后发送到direct:rejector。想法?你可以发布一个代码示例吗?再次感谢!
  • 或者,如果不是这样,也许还有另一种方法可以将交换发送到两个端点?他们没有必须同时发送;如果需要,我可以将消息发送到 direct:validatorthen direct:rejector...
  • direct:validator 是否更改邮件正文?因为,如果没有,我认为您根本不需要使用多播...
【解决方案2】:

我测试了您的路线,一切正常:

<multicast>
    <to uri="direct:rejector" />
    <to uri="direct:validator" />
</multicast>

这个日志

Starting main route...
Processing input...
In rejector route...
In validator route...

还有

<multicast>
    <to uri="direct:validator" />
    <to uri="direct:rejector" />
</multicast>

这个日志

Starting main route...
Processing input...
In validator route...
In rejector route...

也许,你看错了 Camel 配置?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    相关资源
    最近更新 更多