2013-12-10 2 views
0

Мы имеем следующий маршрут верблюд в нашем приложении:Асинхронное изменение активатора обслуживания EIP?

from(webServiceUri).routeId("webServiceRoute") 
     .unmarshal(jaxb) 
     .process(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       final Message in = exchange.getIn(); 
       final DataRequest body = in.getBody(DataRequest.class); 
       final DataRequest.Items items = body.getItems(); 
       itemValidator.validate(items.getItem()); 
       getContext().createProducerTemplate().sendBody(importUri, body); 
       DataResponse response = new DataResponse(); 
       response.setReturnCode(ReturnCode.SUCCESS); 
       in.setBody(response); 
      } 
     }) 
     .marshal(jaxb); 

Мы хотим «webServiceRoute», чтобы вернуть пользователю ответ, как только процессор проверены данные и переслал сообщение «importUri». Но сейчас кажется, что ответ не возвращается вызывающему абоненту до тех пор, пока обмен «importUri» не будет завершен. Итак, мой вопрос заключается в том, что такое «правильный» способ асинхронной пересылки полученного запроса в другую очередь? От «importUri» не будет никакого ответа (т. Е. Он должен быть InOnly).

ответ

1

Вы можете заменить .sendBody (importUri, body) на .asyncSendBody (importUri, body).

Тем не менее, я считаю, что ваш маршрут выглядит странно для меня, почему вы используете процессор для пересылки своего сообщения. Я бы написал что-то вроде:

DataResponse successResponse = new DataResponse(); 
response.setReturnCode(ReturnCode.SUCCESS); 

from(webServiceUri).routeId("webServiceRoute") 
    .unmarshal(jaxb) 
    .bean(WebServiceRouteHelper.class,"validate") 
    .to(importUri) 
    .setBody(constant(sucessResponse)) 
    .marshal(jaxb); 

class WebServiceRouteHelper { 
    public DataRequest validate(DataRequest dataRequest) throws Exception { 
     final DataRequest.Items items = body.getItems(); 
     itemValidator.validate(items.getItem()); 
     return dataRequest; 
    } 
} 
+0

Согласитесь, что маршрут выглядит странно. Причина для процессора заключалась в том, что параметры itemValidator не были самим запросом, а элементом внутри него, поэтому я «разворачивал» эти данные. Но в конце я решил просто реорганизовать itemValidator, чтобы принять запрос в качестве параметра. – GaZ

+0

Но я не уверен, что то, что вы предложили, решает, что я имел в виду в моем первоначальном вопросе, то есть у нас есть два маршрута (webservice -> import и import -> finish), но даже после того, как обмен был передан импорт, результат не возвращается вызывающему абоненту webservice до тех пор, пока обмен не достигнет «завершения». Я хотел бы, чтобы вызывающий абонент получил сообщение об успешности, как только сообщение было отправлено в importUri. – GaZ

+1

Тогда ваш importUri должен иметь тип [SEDA] (http://camel.apache.org/seda.html) с waitForTaskToComplete = Никогда или JMS с disableReplyTo = true Подробнее о [API верблюда Асин) (http: // camel .apache.org/async.html) –

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