【问题标题】:Do Camel Splitters preserve exchange body after they execute?Camel Splitters 执行后是否保留交换体?
【发布时间】:2019-03-27 20:36:21
【问题描述】:

Java 8 和 Apache Camel 2.19.5 在这里。我有以下 bean 处理器:

@Component("foobarResolver")
public class FoobarResolver {
  public List<Foobar> resolve(Fizzbuzz fizzbuzz) {
    List<Foobar> foobars = new ArrayList<Foobar>();

    // Use some logic in here to make the fizzbuzz populate the foobars list.

    return foobars;
  }
}

@Component("fizzbuzzProcessor")
public class FizzbuzzProcessor {
  public FizzbuzzOutput process(Fizzbuzz fizzbuzz) {
    // Blah whatever
  }
}

还有以下骆驼路线:

<route id="fizzbuzzHandler">
  <!-- XML '<fizzbuzz>' messages get sent here by an upstream process -->
  <from uri="activemq:fizzbuzzes"/>

  <!-- Use XStream to deserialize the XML into a 'Fizzbuzz' POJO instance -->
  <unmarshal ref="xs"/>

  <split>
    <method ref="bean:foobarResolver"/>
    <to uri="activemq:analyze"/>
  </split>

  <!-- Now assuming our body is once again the Fizzbuzz we can just continue as normal... -->

  <!-- Process the fizzbuzz -->
  <to uri="bean:fizzbuzzProcessor"/>

  <!-- Send fizzbuzzProcessor's output to 'output' queue -->
  <to uri="activemq:output"/>
</route>

如您所见,反序列化的Fizzbuzz 实例被发送到FoobarResolver bean 处理器,该处理器将该实例转换为List&lt;Foobar&gt;,然后将每个Foobar 发送到analyze 队列,一个一个。至少这就是我的设计意图!

我很好奇的是:分裂之后,交换体变成了什么?它是“还原”回Fizzbuzz(这是我想要的),还是现在是FoobarResolver 产生的List&lt;Foobar&gt;(这不是我想要的)?如果正文现在是List&lt;Foobar&gt;,我该如何重新配置​​,让FizzbuzzProcessor 接收Fizzbuzz

【问题讨论】:

    标签: java apache-camel integration-patterns


    【解决方案1】:

    似乎恢复到分裂前的身体:

    @SpringBootApplication
    public class SocamelApplication extends RouteBuilder implements ApplicationRunner {
        @Autowired
        private FooProcessor fooProcessor;
    
        public static void main(String[] args) {
            SpringApplication.run(SocamelApplication.class, args);
        }
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            Thread.sleep(5000);
        }
    
        @Override
        public void configure() throws Exception {
            from("timer://foo?period=100&repeatCount=1").setBody()
                                                        .constant(Arrays.asList("Hello", "World"))
                                                        .log("1 >>> ${body} ")
                                                        .split(body())
                                                        .log("2 >>> ${body}")
                                                        .bean(fooProcessor)
                                                        .log("3 >>> ${body}")
                                                        .end()
                                                        .log("4 >>> ${body}");
    
        }
    
        @Bean
        public FooProcessor fooProcessor() {
            return new FooProcessor();
        }
    
    }
    
    class FooProcessor implements Processor {
    
        @Override
        public void process(Exchange exchange) throws Exception {
            String reverseMe = exchange.getIn()
                                       .getBody(String.class);
    
            String reversed = new StringBuilder(reverseMe).reverse()
                                                          .toString();
    
            exchange.getOut()
                    .setBody(reversed);
        }
    
    }
    

    产量:

    1 >>> Hello,World 
    2 >>> Hello
    3 >>> olleH
    2 >>> World
    3 >>> dlroW
    4 >>> Hello,World
    

    【讨论】:

      猜你喜欢
      • 2015-05-30
      • 2017-02-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      相关资源
      最近更新 更多