2014-12-02 2 views
1

Я хочу построить маршрут Camel, который делает 3 HttpRequests, но в каждом запросе он должен быть только частью тела.Обработка Apache Camel с подстрокой сообщения

В моем Message Body это XML:

<part1> 
... 
</part1> 
<part2> 
... 
</part2> 
<part3> 
... 
</part3> 

Теперь каждая часть должна послать REST-сервис. Ответ Rest-Service с некоторыми данными, эти данные я должен положить в тело следующей части. Как я могу это решить?

Маршрут должен нравится:

from("activemq:inMsg") 
.setBody(xpath("//part1")).inOut("http4://localhost/workingPart1") 
.choice() 
    .when() 
    .replay().isEqual("ok") 
    .setBody("<responsePart1>"+replay()+"</responsePart1>" + xpath("//part2")).inOut("http4://localhost/workingPart2") 
    .choice() 
     .when() 
      .replay().isEqual("ok") 
      .setBody("<responsePart2>"+replay()+"</responsePart2>" + xpath("//part3")).inOut("http4://localhost/workingPart3") 
     .otherwiese().to("activemq:error") 
    .end() 
    .otherwiese().to("activemq:error") 
    .end() 

Можете ли вы помочь мне найти правильный синтаксис?

Спасибо

ответ

1

Я предполагаю, что есть более чем один из возможных решений для этого:

ModelCamelContext context = new DefaultCamelContext(); 
context.addRoutes(new RestBuilder("direct:rest1", "http4://localhost/workingPart1")); 
context.addRoutes(new RestBuilder("direct:rest2", "http4://localhost/workingPart2")); 
context.addRoutes(new RestBuilder("direct:rest3", "http4://localhost/workingPart3")); 
context.addRoutes(new MainRouteBuilder()); 

ProducerTemplate template = context.createProducerTemplate(); 
template.sendBody("direct:start", XML); 

RestBuilder класс:

public class RestBuilder extends RouteBuilder { 
    private final String endpoint; 
    private final String uri; 
    public RestBuilder(final String endpoint, final String uri) { 
     this.endpoint = endpoint; 
     this.uri = uri; 
    } 
    @Override 
    public void configure() { 
     from(endpoint) 
      .setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http4.HttpMethods.POST)) 
      .to(uri) 
      .choice() 
      .when(header(Exchange.HTTP_RESPONSE_CODE).isNotEqualTo(Integer.valueOf(200))) 
      .throwException(new IllegalStateException()); 
    } 
} 

MainRouteBuilder класс:

public class MainRouteBuilder extends RouteBuilder { 
    @Override 
    public void configure() { 
     onException(IllegalStateException.class) 
      .log("Hm, no good") 
      .to("activemq:error") 
      .handled(true); 

     from("direct:start") 
      .setProperty("part1").xpath("/parts/part1/*") 
      .setProperty("part2").xpath("/parts/part2/*") 
      .setProperty("part3").xpath("/parts/part3/*") 
      .setBody(simple("${property.part1}")) 
      .to("direct:rest1") 
      .setBody(simple("<responsePart1>${body}</responsePart1>${property.part2}")) 
      .to("direct:rest2") 
      .setBody(simple("<responsePart2>${body}</responsePart2>${property.part3}")) 
      .to("direct:rest3"); 

    } 
} 
+0

Большое спасибо! Это было то, что я ищу! И спасибо за отличный ответ! – Burner

Смежные вопросы