2016-07-19 5 views
0

Я испытываю интересную дилемму с Apache Camel и CXF.Как явным образом определить Apache Camel CXF Потребитель и производитель

Я стараюсь строить следующие маршруты.

from("servlet://proxy?matchOnUriPrefix=true") .to("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE");

`from("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE").to("file:/META-INF/data/test.xml");` 

Мое желание на самом деле получить запрос с Servlet компонента, сделать что-то с (процессор, преобразование, и т.д., но я исключил здесь по соображениям простоты) перенаправить это мой реализации WebService и файл компонент возвращает содержимое файла в результате в WebService.

Проблема в том, что если я делаю из конечной точки from("servlet://proxy?matchOnUriPrefix=true") «Маршрутизация до конечной точки» to("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE") «Верблюд считает, что это должен быть CXF Consumer, но я хочу, чтобы он был продюсером.

Так что я нахожусь на маршруте от from("servlet://proxy?matchOnUriPrefix=true") до 'from("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE")', но я не мог понять, как это сделать.

Если я сконфигурировал как первую конфигурацию, компонент сервлета получит запрос, маршрутизирует его в CXF: потребитель, тогда он запускает TCP-вызов CXF: Производитель, определенный в 'from("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE")', работает, но это странно, я не знаю, хотите запустить TCP-вызов, я просто хочу, чтобы сообщение перешло на 'from("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE")'.

Есть ли способ достичь того, что я хочу? Могу ли я определить потребителя или поставщика CXF, а затем использовать «от», «до»?

Смешно Я сделал что-то подобное с ServiceMix/Fuse.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:osgiRouter="http://osgi.salgar.org/osgirouter" 
    xmlns:http="http://servicemix.apache.org/http/1.0" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://servicemix.apache.org/http/1.0 http://servicemix.apache.org/http/1.0/servicemix-http.xsd"> 

    <http:consumer service="http:FindOrders" endpoint="httpEndpoint" locationURI="http://localhost:8088/MockB2BService" 
     defaultMep="http://www.w3.org/2004/08/wsdl/in-out" targetService="osgiRouter:mediation" /> 

    <bean class="org.apache.servicemix.common.osgi.EndpointExporter" /> 
</beans> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:eip="http://servicemix.apache.org/eip/1.0" 
    xmlns:osgiRouter="http://osgi.salgar.org/osgirouter" 
    xmlns:orderProvider_v1="http://v1.salgar.org/B2BService" 
    xmlns:orderProvider_v2="http://v2.salgar.org/B2BService" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://servicemix.apache.org/eip/1.0 http://servicemix.apache.org/eip/1.0/servicemix-eip.xsd"> 

    <eip:content-based-router endpoint="osgiRouterMediation" 
     service="osgiRouter:mediation"> 
     <eip:rules> 
      <eip:routing-rule> 
       <eip:predicate> 
        <eip:xpath-predicate id="wsdl_version_predicate_v1" 
         xpath="(//namespace::*[.='http://v1.salgar.org/B2BService']) = 'http://v1.salgar.org/B2BService'" /> 
       </eip:predicate> 
       <eip:target> 
        <eip:exchange-target service="orderProvider_v1:findOrders" /> 
       </eip:target> 
      </eip:routing-rule> 
      <eip:routing-rule> 
       <eip:predicate> 
        <eip:xpath-predicate id="wsdl_version_predicate_v2" 
         xpath="(//namespace::*[.='http://v2.salgar.org/B2BService']) = 'http://v2.salgar.org/B2BService'" /> 
       </eip:predicate> 
       <eip:target> 
        <eip:exchange-target service="orderProvider_v2:findOrders" /> 
       </eip:target> 
      </eip:routing-rule> 
     </eip:rules> 
    </eip:content-based-router> 

    <bean class="org.apache.servicemix.common.osgi.EndpointExporter" /> 
</beans> 




<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:cxfbc="http://servicemix.apache.org/cxfbc/1.0" 
    xmlns:orderProvider_v1="http://v1.salgar.org/B2BService" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
         http://servicemix.apache.org/cxfbc/1.0 http://servicemix.apache.org/cxfbc/1.0/servicemix-cxf-bc.xsd"> 
    <cxfbc:provider endpoint="findOrdersProviderEndpoint" 
     useJBIWrapper="false" wsdl="classpath:v1/B2BService.wsdl" service="orderProvider_v1:findOrders" 
     locationURI="http://localhost:8989/MockB2BService" /> 

    <bean class="org.apache.servicemix.common.osgi.EndpointExporter" /> 
</beans> 

Который работает, как ожидалось, но там я мог бы определить конечную точку явным образом в качестве поставщика CXF, у меня такую ​​же возможность здесь?

ответ

0

Если я правильно понимаю вашу проблему правильно, это будет работать (и идеальным решением в верблюд)

Route A

from("servlet://proxy?matchOnUriPrefix=true") 
.to("direct:webservice-business-logic") 
.to("direct:process-to-file"); 

Маршрут B

from("direct:webservice-business-logic") 
.to("actual-processors-to-do-webservice-business-logic"); 

Route C

from("cxf:/incident?wsdlURL=wsdl/OrderInfoService.wsdl&dataFormat=MESSAGE") 
.to("direct:webservice-business-logic); 

В принципе, маршрут C w могут использоваться только внешними сторонами, которые хотят использовать веб-сервис.

Маршрут B будет использоваться только по маршруту A, поэтому маршрут B предназначен для внутренней обработки верблюдов. Потому что нет смысла звонить в веб-сервис, где логика webservice также находится на верблюжьем пути.

Надеюсь, это поможет!

+0

если я использую «из ("сервлета: // прокси matchOnUriPrefix = истина") .to ("CXF:?/Инцидент wsdlURL = WSDL/OrderInfoService.wsdl & DataFormat = MESSAGE") .to (" Файл:/META-INF/data/test.xml ");' и 'to ("cxf:/accident? WsdlURL = wsdl/OrderInfoService.wsdl & dataFormat = MESSAGE ") 'пытается использовать web-сервис (делает TCP-вызов), а не производить его (обеспечить логику реализации веб-службы). По крайней мере, он работает на моем тестовом стенде. – posthumecaver

+0

Ваши объяснения не ясны, но Я добавила ответ: надеюсь, что это поможет. Дайте мне знать, если это все еще не помогает. – gnanagurus

+0

К сожалению, мой вариант использования намного более странный. Вы делаете предположение, что вызов веб-сервиса внутри не имеет никакого смысла, но я хочу, когда я получил вызов из конечной точки сервлета и маршрутизируюсь до конечной точки веб-службы, я все еще хочу проверить соответствие wsdl и, кроме того, у меня есть некоторые заголовки веб-серверов в вызове, которые они также должны интерпретировать в конечной точке веб-службы. Поэтому мне понадобится внутренняя веб-служба endpoint. – posthumecaver

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