Сохраняет ли верблюжий обменный орган после выполнения? - PullRequest
0 голосов
/ 27 марта 2019

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, который превращает этот экземпляр в List<Foobar>, а затем отправляет каждый Foobar в очередь analyze, по одному одним. По крайней мере, в этом и заключается смысл моего дизайна!

Что мне любопытно, так это: после разделения, чем становится тело обмена? «Возвращается» ли он обратно к Fizzbuzz (что я и хочу), или тело обмена теперь List<Foobar>, производимое FoobarResolver (что НЕ то, что я хочу)? Если тело теперь List<Foobar>, как я могу перенастроить вещи так, чтобы FizzbuzzProcessor получил вместо него Fizzbuzz?

1 Ответ

1 голос
/ 28 марта 2019

Это появляется , чтобы вернуться к предварительно разделенному телу:

@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
...