2015-09-24 2 views
1

Я построил веб-сервис в верблюде apache, который работает как пакет на karaf, который берет запросы и сохраняет информацию в базе данных.Apache camel blueprint ответ веб-службы на другом маршруте

После этого еще один комплект принимает эту вставленную запись, изменяет данные и сохраняет их обратно в db.

Теперь мне нужен ответ на первоначальный запрос, чтобы содержать измененные данные так, кроме маршрута для веб-сервиса, который выглядит как этот

<route id="cxf"> 
    <from uri="cxf:bean:getHopEndpoint" /> 
    <recipientList> 
     <simple>direct:${header.operationName}</simple> 
    </recipientList> 
</route> 
<route id="getHop"> 
    <from uri="direct:getHop" /> 
    <process ref="getHopToDbProcessor" /> 
    <to 
     uri="sql:INSERT INTO myTable (field1, field2) VALUES (:#field1, :#field2)"/> 
</route> 

мне нужно еще один, как этот

<route id="cxfResponse"> 
    <from uri="sql:SELECT * FROM myTable"/> 
    <!-- to web service response in any way --> 
</route> 

Есть ли способ сделать это?

ответ

1

Вам нужно будет установить тело на требуемый ответ в качестве последнего шага на первом маршруте. Невозможно установить ответ за пределами этого маршрута.

Так что я думаю, что есть два пути решения вашей проблемы.

  1. ли все, что вам нужно сделать внутри первого маршрута синхронным образом
  2. Изменение службы, чтобы быть полностью асинхронным

Для варианта 2 вы можете использовать обмен сообщениями, как JMS или вы даете сначала вызовите webservice uri, чтобы перезвонить.

Если у вас высокая нагрузка на услугу, полностью асинхронный подход может улучшить работу вашей системы.

+0

Для варианта 1: обязательным является то, что операция других пучков остается в другом комплекте, а не синхронно в одном. Для варианта 2: я не могу ничего сделать на стороне, которая вызывает веб-службу, поэтому я также не могу настроить uri для перезвона. Когда я использую jms, можно ли ждать по маршруту, пока я не получу ответ от другого пакета? – Milla

+0

Так вариант 1 в порядке. Вы можете использовать услуги direct-vm, OSGi или любой другой синхронный вызов, чтобы сделать часть работы кем-то еще. Ответ просто должен быть возвращен в тот же поток –

1

Я нашел другое решение: я использую Direct VM Component. Мои маршруты выглядят, как это сейчас:

Bundle запрос веб-служба 1 ПРИИХ и сохранить данные в базе данных:

<route id="cxf"> 
    <from uri="cxf:bean:getHopEndpoint" /> 
    <recipientList> 
      <simple>direct:${header.operationName}</simple> 
    </recipientList> 
</route> 
<route id="getHop"> 
    <from uri="direct:getHop" /> 
    <process ref="getHopToDbProcessor" /> 
    <to uri="sql:INSERT INTO myTable (field1, field2) VALUES (:#field1, :#field2)" /> 
    <to uri="direct-vm:processHop" /> 
</route> 

В пачке 2, который обрабатывает данные, которые я только что вставленные:

<route> 
    <from uri="direct-vm:processHop"/> 
    <to uri="sql:SELECT * FROM myTable WHERE processed = false" /> 
    <process ref="getHopComputopUrlProcessor" /> 
    <to uri="sql:UPDATE webshop_gethop_requests SET new_data = :#newData, processed = true WHERE some_id = :#someId" /> 
    <to uri="direct-vm:response"/> 
</route> 

Затем снова вернитесь к пакету 1, чтобы отправить ответ с обработанными данными:

<route> 
    <from uri="direct-vm:response" /> 
    <to uri="sql:SELECT some_id,new_data FROM myTable WHERE some_id = :#someId AND processed = true" /> 
    <process ref="getHopResponseProcessor" /> 
</route> 

T его работы просто прекрасны для меня :)

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

  • Нет связанных вопросов^_^