技术开发 频道

用SAAJ解决SOA集成问题

【IT168 技术文章】

    面向服务的架构(SOA)和面向服务的集成(SOI)得到了广泛的应用,并且有一种需求变得越来越明显:业务需要集成系统,并允许消费者利用基于标准的方法访问服务。SOA是一种架构范例。在这种架构中,可重用的业务逻辑表现为包含基于标准的、定义良好的接口的服务集,并且可以以松散耦合方式访问它。因为Web Service标准的供应商的支持,以及利用基于这种标准的软件集成不同的系统相对容易,所以在解决企业集成问题方面,SOA得到了普遍的认可。

    基于Java的中间件和企业应用程序集成(EAI)产品已经被使用了一段时间,现在,许多公司在以不同的方式使用这项技术。虽然一些服务是在Java平台上开发和提供的,但来自基于Java的应用程序的服务消费还有其他灵活的需求。SOAP with Attachments API for Java (SAAJ)通过提供访问服务的标准API来帮助这些服务的消费。

    有几个基于Java的API可以用来访问服务。这些服务包括SAAJ、基于Java API for XML 的RPC(JAX-RPC)和Web服务调用框架(WSIF)。SAAJ提供了构建服务消费者以及提供者的API。让我们看一看如何利用SAAJ在SOA中开发Web Service的消费者。我们将举例说明WebLogic Integration的组合过程,该过程有机地结合了获取城市邮政编码的服务、获取邮政分区的温度的服务,以及消费该服务的一个示例SAAJ客户机。

    什么是SAAJ?

    SAAJ是在松散耦合软件系统中利用SOAP协议实现的基于XML消息传递的API规范。顾名思义,SAAJ支持带附件的SOAP消息。

    对于Java API for XML Messaging (JAXM),您已经了解很多,并且可能感到奇怪,究竟JAXM发生了什么事?JAXM 1.0的理念是通过提供消息传递和SOAP API,允许开发人员根据SOAP编写支持消息传递标准的业务应用程序。随着JAXM 1.1版的推出,SOAP API (javax.xml.soap)被分割成了SAAJ1.1规范和JAXM1.1,JAXM1.1只包含基于消息传递的API(javax.xml.messaging)。目前,正在使用的SAAJ版本是1.2。WebLogic Server 8.1 SP2 支持SAAJ 1.1规范。

    SAAJ 1.2 API主要由javax.xml.soap包组成,它为带有多用途互连网邮件扩展协议(MIME)附件的SOAP消息提供抽象。该API提供了创建到端点的点到点连接的方法、创建并处理SOAP消息和附件的方法,以及接收和处理SOAP错误的方法。

    虽然在开发企业应用程序的时候,有几种技术供您选择,但对于不同的问题,某些技术可能更合适。选择正确的工具非常重要。

    选择SAAJ的理由是什么呢?SAAJ无疑很适合基于文档的同步或者异步Web Service。SAAJ使用简单,有助于您在Java环境中集成各种Web Service,它扩展了对文档风格的Web Service通信的自然支持(natural support)。SAAJ还支持基于标准接口上的XML消息传递,并且这一点得到了供应商的广泛支持。

    编写客户机

    清单 1显示了一个用SAAJ编写的简单的消费者,它访问了一个同步WebLogic Integration过程,来获得给定城市的温度。完整的项目可以从www.WebLogicPro.com下载。下面将讨论完成该项目所必需的步骤。

    清单 1. 用SAAJ编写的这个简单的消费者访问了一个同步WebLogic Integration过程,来获得给定城市的温度。

private static void invokeService(
          String serviceUrl, String inputXml)
{
          SOAPMessage reply = null;
          try
          {
                    //Create Soap Connection
                    SOAPConnectionFactory scf =  SOAPConnectionFactory.newInstance();
                    SOAPConnection con = scf.createConnection();
 
                    //Create Message
                    MessageFactory mf = MessageFactory.newInstance();
                    SOAPMessage msg = mf.createMessage();
 
                    // Get the SOAPPart from the message
                    SOAPPart soapPartInput = msg.getSOAPPart();
                    // Creating an attachment Part
                    AttachmentPart attachPart = msg.createAttachmentPart();
                    attachPart.setContent( "This is a text attachment", "text/plain");
 
                    // Create and set the content from the
                    // input XML document
                    StringReader stringReaderInput = new StringReader(inputXml);
                    StreamSource ssInput = apPartInput.setContent(ssInput);
 
                    // Save the changes to the message
                    msg.saveChanges();
 
                    // Invoke the service synchronously and
                    // get the reply
                    reply = con.call(msg, serviceUrl);
 
                    // Get the SOAP body from the response
                    SOAPBody outSoapBody = reply.getSOAPPart().getEnvelope().getBody();
 
                    // Check to see if there is any SOAP Fault
                    if (outSoapBody.hasFault())
                    {
                         // Take any actions for the exception scenario
                         SOAPFault fault = outSoapBody.getFault();
 
                         // Log the fault details
                         System.out.println("SOAP Fault occurred");
                         System.out.println("Fault Code is " + fault.getFaultCode());
                         System.out.println("Fault String is " + fault.getFaultString());
                    }
                    else
                    {
                         // Print the output SOAP envelope
                         System.out.println( reply.getSOAPPart().getEnvelope());  
                    }
 
                    // Close the connection
                    con.close();
          }
          catch (SOAPException e)
          {   
                    // Print the stack trace if there are any
                    // SOAPExceptions
                    e.printStackTrace();
          }
}

0
相关文章