Wywołanie usługi SOAP z użyciem Apache Camel i Apache CXF component
Wywołanie usługi SOAP z użyciem Apache Camel i Apache CXF component
Ten artykuł ma na celu zobrazowanie w jaki sposób wywołać usługę SOAP z użyciem Apache Camel i Apache CXF component. Na początek zainstalować z użyciem Apache Service Mix (szyny integracyjnej) przykładową usługę. Jak to zrobić znajdziesz w tym wpisie: https://javaleader.pl/2019/12/20/apache-servicemix-wprowadzenie/. Po prawidłowym zainstalowaniu przykładowej usługi powinieneś po przejściu na adres: http://localhost:8181/cxf/ zobaczyć następujący widok:
Naszym zadaniem jest wywołanie usługi w oparciu o Apache Camel i Apache CXF component. W tym celu pobieramy projekt z tego wpisu https://javaleader.pl/2020/01/08/narzedzie-wsdl2java/. Jest to wpis w którym pokazałem jak wygenerować z użyciem narzędzia wsdl2java niezbędne klasy na podstawie dostarczonego pliku WSDL. Plik WSDL czyli plik który opisuje wystawione usługi znajdziesz tutaj http://localhost:8181/cxf/calcService?wsdl. Do pliku pom.xml dodajemy niezbędne zależności:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring</artifactId> <version>2.21.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-cxf</artifactId> <scope>provided</scope> <version>2.21.0</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>2.21.0</version> <scope>provided</scope> </dependency>
camel-cxf – jest to zależność która pozwala wysyłać/odbierać komunikaty SOAP, uchwyt na Apache CXF.
Potrzebujemy dwa pliki konfiguracyjne:
Plik ./resources/META-INF/spring/beans.xml w którym definiujemy context Apache Camel.
<?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:camel="http://camel.apache.org/schema/spring" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.10.3.xsd"> <camelContext xmlns="http://camel.apache.org/schema/spring"> <package>camel</package> <contextScan/> </camelContext> </beans>
Plik ./resources/META-INF/cxf/cxf.xml w którym rejestrujemy niezbędne beany:
<bean id="cxf" class="org.apache.cxf.bus.spring.SpringBus" />
rejestrowanie wywołań SOAP (trzeba dodać przestrzeń nazw – xmlns:cxf=”http://cxf.apache.org/core”):
<cxf:bus> <cxf:inInterceptors> <ref bean="loggingInInterceptor"/> </cxf:inInterceptors> <cxf:outInterceptors> <ref bean="logOutInterceptor"/> </cxf:outInterceptors> </cxf:bus>
W pakiecie camel definiujemy klasę:
public class GetAdditionRequestBuilder { public List<Integer> getSubstraction() { List<Integer> list = new ArrayList(); list.add(1); list.add(28); return list; } }
oraz definiujemy routing:
public class InvokeSoapServiceRouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { from("timer:foo?period=1000").routeId("myRoute") .bean(GetAdditionRequestBuilder.class, "getSubstraction") .setHeader(CxfConstants.OPERATION_NAME, constant("subtraction")) .setHeader(CxfConstants.OPERATION_NAMESPACE, constant("http://ws.javaleader.pl/")) .to("cxf://http://localhost:8181/cxf/calcService" + "?serviceClass=pl.javaleader.ws.Calculator" + "&wsdlURL=http://localhost:8181/cxf/calcService?wsdl") .log(">>> ${body}"); } }
Projekt instalujemy na szynie, w tym celu należy dodać plik MANIFEST.MF w którym definiujemy niezbędne klasy do komponentu:
Manifest-Version: 1.0 Bundle-Name: wsdl-camel-bundle Bundle-SymbolicName: wsdl-camel-bundle Bundle-Version: 1.0.5 Bundle-Description: Camel Bundle 1 Bundle-Vendor: IT-eye Import-Package: org.apache.cxf.bus.spring,org.osgi.framework, org.apache.commons.logging, org.apache.camel.builder, org.apache.camel.model,org.apache.camel,pl.javaleader,javax.xml,javax.xml.namespace,javax.xml.bind
Proponuję dodać plik ./resources/log4j.properties (nie jest to konieczne ale ułatwia pracę z logami):
log4j.rootLogger=INFO, out log4j.logger.org.apache.camel=DEBUG,INFO,ERROR log4j.appender.out=org.apache.log4j.ConsoleAppender log4j.appender.out.layout=org.apache.log4j.PatternLayout log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n
Instalacja projektu na platformie Service Mix:
install mvn:pl.javaleader/cxf-wsdl-to-java/1.10-SNAPSHOT
Po tej operacji sprawdzamy logi:
2020-04-11 02:43:29,815 | INFO | ault-workqueue-2 | myRoute | 43 - org.apache.camel.camel-core - 2.16.5 | >>> -27
wniosek – udało się prawidłowo wykonać usługę bez użycia dodatkowe programu np. SoapUI.
Leave a comment