Library Link To Toggle Frames Print Feedback

Generating the Stub Code

The asynchronous style of invocation requires extra stub code for the dedicated asynchronous methods defined on the SEI. This special stub code is not generated by default, however. To switch on the asynchronous feature and generate the requisite stub code, you must use the mapping customization feature from the WSDL 2.0 specification.

Defining the customization

Customization enables you to modify the way the wsdl2java generates stub code. In particular, it enables you to modify the WSDL-to-Java mapping and to switch on certain features. Here, customization is used to switch on the asynchronous invocation feature. Customizations are specified using a binding declaration, which you define using a jaxws:bindings tag (where the jaxws prefix is tied to the http://java.sun.com/xml/ns/jaxws namespace). There are two alternative ways of specifying a binding declaration:

  • External binding declaration — the jaxws:bindings element is defined in a file separately from the WSDL contract. You specify the location of the binding declaration file to wsdl2java when you generate the stub code.

  • Embedded binding declaration — you can also embed the jaxws:bindings element directly in a WSDL contract, treating it as a WSDL extension. In this case, the settings in jaxws:bindings apply only to the immediate parent element.

This section considers only the external binding declaration. The template for a binding declaration file that switches on asynchronous invocations is shown in Example 7.2, “Template for an Asynchronous Binding Declaration”.

Example 7.2. Template for an Asynchronous Binding Declaration

<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
          wsdlLocation="AffectedWSDL"
          xmlns="http://java.sun.com/xml/ns/jaxws">
  <bindings node="AffectedNode">
    <enableAsyncMapping>true</enableAsyncMapping>
  </bindings>
</bindings>

Where AffectedWSDL specifies the URL of the WSDL contract that is affected by this binding declaration. The AffectedNode is an XPath value that specifies which node (or nodes) from the WSDL contract are affected by this binding declaration. You can set AffectedNode to wsdl:definitions, if you want the entire WSDL contract to be affected. The jaxws:enableAsyncMapping element is set to true to enable the asynchronous invocation feature.

For example, if you want to generate asynchronous methods only for the GreeterAsync interface, you could specify <bindings node="wsdl:definitions/wsdl:portType[@name='GreeterAsync']"> in the preceding binding declaration.

Running wsdl2java

Assuming that the binding declaration is stored in a file, async_binding.xml, you can generate the requisite stub files with asynchronous support by entering the following command:

          
            wsdl2java -ant -client -d ClientDir -b async_binding.xml hello_world.wsdl
          
        

When you run wsdl2java, you specify the location of the binding declaration file using the -b option.

Generated code

After generating the stub code in this way, the GreeterAsync SEI (in the file GreeterAsync.java) is defined as shown in Example 7.3, “Service Endpoint Interface with Methods for Asynchronous Invocations”.

Example 7.3. Service Endpoint Interface with Methods for Asynchronous Invocations

/* Generated by WSDLToJava Compiler. */
package org.apache.hello_world_async_soap_http;

import org.apache.hello_world_async_soap_http.types.GreetMeSometimeResponse;
...

public interface GreeterAsync
{
  public Future<?> greetMeSometimeAsync(
        java.lang.String requestType,
        AsyncHandler<GreetMeSometimeResponse> asyncHandler
    );

    public Response<GreetMeSometimeResponse> greetMeSometimeAsync(
        java.lang.String requestType
    );

    public java.lang.String greetMeSometime(
        java.lang.String requestType
    );
}

In addition to the usual synchronous method, greetMeSometime(), two asynchronous methods are also generated for the greetMeSometime operation:

  • public Future<?> greetMeSomtimeAsync(java.lang.String requestType,
                                         AsyncHandler<GreetMeSomtimeResponse> asyncHandler);

    Call this method for the callback approach to asynchronous invocation.

  • public Response<GreetMeSomeTimeResponse> greetMeSometimeAsync(java.lang.String requestType);

    Call this method for the polling approach to asynchronous invocation.