Links: Table of Contents | Single HTML | Single PDF

Chapter 8. Message Optimization

Table of Contents

8.1. Creating a MTOM Web Service
8.2. Configuring Message Optimization in a Web Service
8.3. Deploying and Testing a Web Service with Message Optimization Enabled
8.4. Creating a Client to Consume a Message Optimization-enabled Web Service
8.5. Message Optimization and Secure Conversation

8.1. Creating a MTOM Web Service

The starting point for developing a web service to use WSIT is a Java class file annotated with the javax.jws.WebService annotation.

For detailed instructions for how to use NetBeans IDE to create a web service, see Creating a Web Service.

8.2. Configuring Message Optimization in a Web Service

To use the IDE to configure a web service for message optimization, perform the following steps.

To Configure Message Optimization in a Web Service

  1. In the IDE Projects window, expand the Web Services node, right-click the CalculatorWSService node, and choose Edit Web Service Attributes.

    The Web Service Attributes editor appears.

  2. Select the Optimize Transfer of Binary Data (MTOM) check box, as shown in Enabling MTOM, and click OK.

    This setting configures the web service to optimize messages that it transmits and to decode optimized messages that it receives.

    Figure 8.1. Enabling MTOM

    Enabling MTOM

8.3. Deploying and Testing a Web Service with Message Optimization Enabled

Now that you have configured the web service to use message optimization, you can deploy and test it.

To Deploy and Test a Web Service with Message Optimization Enabled

To deploy and test the web service, perform the following steps.

  1. Right-click the project node and select Properties, then select Run.

  2. Type /CalculatorWSService?wsdl in the Relative URL field and click OK.

  3. Right-click the project node and choose Run.

    The IDE starts the web container, builds the application, and displays the WSDL file page in your browser.

    The following WSIT tags related to message optimization display in the WSDL file:

    Example 8.1. 

    <ns1:Policy wsu:Id="CalculatorWSPortBindingPolicy"/>
      <ns1:ExactlyOne>
        <ns1:All>
          <ns2:OptimizedMimeSerialization/>
            <ns3:RMAssertion/>
              <ns4:UsingAddressing ns1:Optional="true"/>
        </ns1:All>
      </ns1:ExactlyOne>
    </ns1:Policy>

8.4. Creating a Client to Consume a Message Optimization-enabled Web Service

Now that you have built and tested a web service that uses the WSIT Message Optimization technology, you can create a client that accesses and consumes that web service. The client will use the web service's WSDL to create the functionality necessary to satisfy the interoperability requirements of the web service.

To Create a Client to Consume a WSIT-enabled Web Service

To create a client to access and consume the web service, perform the following steps.

  1. Choose FileNew Project, select Java Web from the Web category and click Next.

  2. Name the project, for example, CalculatorWSServletClient, and click Finish.

  3. Right-click the CalculatorWSServletClient node and select NewWeb Service Client.

    The New Web Service Client window displays.

    Note

    NetBeans submenus are dynamic, so the Web Service Client option may not appear. If you do not see the Web Service Client option, select NewFile\FolderWebservicesWeb Service Client.

  4. Select the WSDL URL option.

  5. Cut and paste the URL of the web service that you want the client to consume into the WSDL URL field.

    For example, here is the URL for the CalculatorWS web service:

    Example 8.2. 

    http://localhost:8080/CalculatorApplication/CalculatorWSService?wsdl

    When JAX-WS generates the web service, it appends Service to the class name by default.

  6. Type org.me.calculator.client in the Package field, and click Finish.

  7. Right-click the CalculatorWSServletClient project node and choose NewServlet.

  8. Name the servlet ClientServlet, specify the package name, for example, org.me.calculator.client and click Finish.

  9. To make the servlet the entry point to your application, right-click the CalculatorWSServletClient project node, choose Properties, click Run, type /ClientServlet in the Relative URL field, and click OK.

  10. If ClientServlet.java is not already open in the Source Editor, open it.

  11. In the Source Editor, remove the line that comments out the body of the processRequest method.

    This is the start-comment line that starts the section that comments out the code:

    Example 8.3. 

    /* TODO output your page here

  12. Delete the end-comment line that ends the section of commented out code:

    Example 8.4. 

    */


  13. Add some empty lines after the following line:

    Example 8.5. 

    out.println("<h1>Servlet ClientServlet at " +
            request.getContextPath () + "</h1>");


  14. Right-click in one of the empty lines that you added, then choose Web Service Client ResourcesCall Web Service Operation.

    The Select Operation to Invoke dialog box appears.

  15. Browse to the Add operation and click OK.

    The processRequest method is as follows, with bold indicating code added by the IDE:

    Example 8.6. 

    protected void processRequest(HttpServletRequest request, 
                                  HttpServletResponse response) throws 
            ServletException, IOException {
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet ClientServlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet ClientServlet at " + request
                .getContextPath() + "</h1>");
        try { // Call Web Service Operation
            org.me.calculator.client.CalculatorWS port = service
                    .getCalculatorWSPort();
            // TODO initialize WS operation arguments here
            int i = 0;
            int j = 0;
            // TODO process result here
            int result = port.add(i, j);
            out.println("Result = " + result);
        } catch (Exception ex) {
            // TODO handle custom exceptions here
        }
        out.println("</body>");
        out.println("</html>");
        out.close();
    }

  16. Change the values for int i and int j to other numbers, such as 3 and 4.

  17. Add a line that prints out an exception, if an exception is thrown.

    The try/catch block is as follows (new and changed lines from this step and the previous step are highlighted in bold text):

    Example 8.7. 

    try { // Call Web Service Operation
        org.me.calculator.client.CalculatorWS port = service
                .getCalculatorWSPort();
        // TODO initialize WS operation arguments here
        int i = 3;
        int j = 4;
        // TODO process result here
        int result = port.add(i, j);
        out.println("<p>Result: " + result);
    } catch (Exception ex) {
        out.println("<p>Exception: " + ex);
    }

  18. Save ClientServlet.java.

  19. Right-click the project node and choose Run.

    The server starts (if it was not running already), the application is built, deployed, and run. The browser opens and displays the calculation result.

8.5. Message Optimization and Secure Conversation

The Web Services Secure Conversation technology has message optimization benefits. While providing better message-level security it also improves the efficiency of multiple-message exchanges. It accomplishes this by providing basic mechanisms on top of which secure messaging semantics can be defined for multiple-message exchanges. This feature allows for contexts to be established so that potentially more efficient keys or new key material can be exchanged. The result is that the overall performance of subsequent message exchanges is improved.

For more information on how to use Secure Conversation, see Using WSIT Security.