среда, августа 08, 2012

Calling Web Services with Apache Camel

Казалось бы, такая простая задача для интеграционной системы как вызов внешнего webservice, для Apache Camel вызывает затруднения. Прольем немного света. Вызов внешнего webservice на Apache Camel реально занимает одну строчку! Возьмем доступный всем открытый сервис погоды:
http://www.webservicex.com/globalweather.asmx?WSDL
Вот как вызвать этот сервис на Camel:
from("file:c:/data/inbox3").to("cxf:bean:calculatorWSEndpoint?defaultOperationName=GetWeather").to("file:c:/data/outbox");

Подробности под катом!

Подготовим spring-config.xml, в нем нам необходимо зарегистрировать cxf-endpoint для вызываемого webservice
<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor 
 license agreements. See the NOTICE file distributed with this work for additional 
 information regarding copyright ownership. The ASF licenses this file to 
 You under the Apache License, Version 2.0 (the "License"); you may not use 
 this file except in compliance with the License. You may obtain a copy of 
 the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required 
 by applicable law or agreed to in writing, software distributed under the 
 License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
 OF ANY KIND, either express or implied. See the License for the specific 
 language governing permissions and limitations under the License. -->

<!-- Configures the Camel Context -->

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://camel.apache.org/schema/cxf"
 xsi:schemaLocation="
       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
 
 <cxf:cxfEndpoint xmlns:tns="http://www.webserviceX.NET" 
  id="calculatorWSEndpoint"
  endpointName="tns:GlobalWeatherSoap"
  address="http://www.webservicex.com/globalweather.asmx"
  wsdlURL="http://www.webservicex.com/globalweather.asmx?WSDL">
  <cxf:properties>
   <entry key="dataFormat" value="PAYLOAD" />
  </cxf:properties>
 </cxf:cxfEndpoint>

 <camelContext xmlns="http://camel.apache.org/schema/spring">
  <package>com.bssys.fileid</package>
 </camelContext>

</beans>

Напомню что взамодествие с webservice может происходить в двух режимах
  • MESSAGE
  • PAYLOAD
Для получения информации о погоде будем использовать объявленый метод GetWeather

В режиме MESSAGE сообщение представляет из себя полный SOAP-запрос.
В режиме PAYLOAD сообщение из body SOAP-запроса.

 Запрос в PAYLOAD-режиме
<ns1:GetWeather xmlns:ns1="http://www.webserviceX.NET">
 <ns1:CityName>Moscow</ns1:CityName>
 <ns1:CountryName/>
</ns1:GetWeather>

Запрос в MESSAGE-режиме
<s11:Envelope xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/">
  <s11:Body>
    <ns1:GetWeather xmlns:ns1="http://www.webserviceX.NET">
      <ns1:CityName>Moscow</ns1:CityName>
      <ns1:CountryName/>
    </ns1:GetWeather>
  </s11:Body>
</s11:Envelope>

Запустив наш маршрут увидим в папке ответ от webservice:
<GetWeatherResponse xmlns="http://www.webserviceX.NET" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><GetWeatherResult>&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;CurrentWeather&gt;
  &lt;Location&gt;Moscow / Vnukovo , Russia (UUWW) 55-39N 037-16E&lt;/Location&gt;
  &lt;Time&gt;Aug 08, 2012 - 04:00 AM EDT / 2012.08.08 0800 UTC&lt;/Time&gt;
  &lt;Wind&gt; from the W (270 degrees) at 9 MPH (8 KT):0&lt;/Wind&gt;
  &lt;Visibility&gt; greater than 7 mile(s):0&lt;/Visibility&gt;
  &lt;SkyConditions&gt; mostly clear&lt;/SkyConditions&gt;
  &lt;Temperature&gt; 73 F (23 C)&lt;/Temperature&gt;
  &lt;DewPoint&gt; 50 F (10 C)&lt;/DewPoint&gt;
  &lt;RelativeHumidity&gt; 43%&lt;/RelativeHumidity&gt;
  &lt;Pressure&gt; 29.94 in. Hg (1014 hPa)&lt;/Pressure&gt;
  &lt;Status&gt;Success&lt;/Status&gt;
&lt;/CurrentWeather&gt;</GetWeatherResult></GetWeatherResponse>

Комментариев нет: