Typesafe Activator

Akka-camel / CXF / Weather web services integration

Akka-camel / CXF / Weather web services integration

June 6, 2014
scala akka cxf weather ws camel scaladays2014

This is an example of how to integrate Weather WS with a powerful ESB such as Camel via its akka module.

How to get "Akka-camel / CXF / Weather web services integration" on your computer

There are several ways to get this template.

Option 1: Choose akka-camel-cxf-weather in the Typesafe Activator UI.

Already have Typesafe Activator (get it here)? Launch the UI then search for akka-camel-cxf-weather in the list of templates.

Option 2: Download the akka-camel-cxf-weather project as a zip archive

If you haven't installed Activator, you can get the code by downloading the template bundle for akka-camel-cxf-weather.

  1. Download the Template Bundle for "Akka-camel / CXF / Weather web services integration"
  2. Extract the downloaded zip file to your system
  3. The bundle includes a small bootstrap script that can start Activator. To start Typesafe Activator's UI:

    In your File Explorer, navigate into the directory that the template was extracted to, right-click on the file named "activator.bat", then select "Open", and if prompted with a warning, click to continue:

    Or from a command line:

     C:\Users\typesafe\akka-camel-cxf-weather> activator ui 
    This will start Typesafe Activator and open this template in your browser.

Option 3: Create a akka-camel-cxf-weather project from the command line

If you have Typesafe Activator, use its command line mode to create a new project from this template. Type activator new PROJECTNAME akka-camel-cxf-weather on the command line.

Option 4: View the template source

The creator of this template maintains it at https://github.com/JSantosP/akka-camel-cxf-weather#master.

Option 5: Preview the tutorial below

We've included the text of this template's tutorial below, but it may work better if you view it inside Activator on your computer. Activator tutorials are often designed to be interactive.

Preview the tutorial


This template encourages to use akka-camel module for supporting EIP(Enterprise Integration Patterns).

In this example It will be shown how to request weather information to CDYNE weather public web service

It mainly has 3 methods:

  • GetCityForecastByZIP: Allows you to get your City Forecast Over the Next 7 Days, which is updated hourly. U.S. Only
  • GetCityWeatherByZIP: Allows you to get your City's Weather, which is updated hourly. U.S. Only
  • GetWeatherInformation: Gets Information for each WeatherID

The way to interact with these services is available at its WSDL document

JAXB annotated classes

Due to the interaction with the web server must be done with XML, and just to avoid writing a lot of boilerplate, we will use the support that JAXB gives us. With CXF wsdl2java tool we are able to generate JAXB annotated Java classes using the WSDL document we talked about before

This can be achieved by executing this:

			wsdl2java -client -d  -p  -autoNameResolution `

Once these classes are generated, we're able to use them as sendable objects to camel endpoint.

Camel producer

Akka allows to integrate very easily with its camel module. In this example we're going to show how to implement an akka actor that receives 'weather objects' (let's call that way to the instances of the earlier generated classes) as requests and it will respond with some other 'weather objects'.

Main parts of this actor are:

  • Camel extension: It should be called only once, to start camel module in our Akka system
  • URI: The endpoint uri where the target web service can be found
  • Receive method: This actor will wait for `WheatherMessage`s, that are mainly composed by a body and some headers. Once a message of this kind is received, it will be decomposed and forwarded to camel endpoint, waiting syncrhonously for the result, that will be sent to some responseMail we've declared before (like a sink).

The code looks like this:

class MyProducerActor(responseMail: ActorRef) extends Actor {
  import helpers._

  val camel = CamelExtension(context.system)

  val uri = "cxf:http://wsf.cdyne.com/WeatherWS/Weather.asmx?" +

  def receive = {

    case WeatherMessage(body, headers) =>
      camel.template.requestBodyAndHeaders(uri, body, headers) match {

        case Response(List(awd: ArrayOfWeatherDescription)) => responseMail ! awd

        case Response(List(wr: WeatherReturn)) => responseMail ! wr

        case Response(List(fr: ForecastReturn)) => responseMail ! fr



comments powered by Disqus