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.

Zobacz kod na GitHubie i zapisz się na bezpłatny newsletter!

.

Leave a comment

Your email address will not be published.


*