用SAAJ解决SOA集成问题
--SAAJ API证明了自身在SOA和集成领域中的价值
作者:Anbarasu Krishnaswamy 来自:dev2dev.bea.com.cn
面向服务的架构(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();
}
}
首先,创建一个SOAP连接。SAAJ客户机可以利用SOAP Connection Factory,通过创建SOAPConnection来建立点到点的同步连接。该连接提供了同步调用服务的方法。接下来,将利用MessageFactory.newInstance()创建一个消息工厂的新实例。然后利用消息工厂的createMessage()方法创建一条SOAPMessage。这样就创建了一条没有内容的消息。
SOAPMessage可以有一个SOAPPart,它包含XML SOAP消息和一个用于二进制/文本附件的AttachPart。通过调用消息的getSOAPPart()方法可以得到SOAPPart。利用消息的createAttachPart()方法可以创建附件部分。并且可以利用AttachPart的 setContent()方法设置附件。第1个参数是附件,第2个参数是内容类型。
现在,要利用采用一个Source 对象的setContent()方法来设置SOAPPart的内容。该示例展示了用StringReader 和 StreamSource对象设置String中的内容的方法,但其源对象可以是任何东西。例如,如果您正在从文件中读取输入,则可以使用FileInputStream设置该内容。
可以调用SOAPMessage 的saveChanges()方法,来保存对消息的更改。在调用连接的“call”方法时(这是下一步操作),这些更改也是被自动保存的。“call”方法把消息和端点作为参数(接受)。所有来自服务的同步响应将在SOAPMessage返回参数中返回。如果服务是异步服务,那么客户机应该忽略返回的SOAPMessage。
最后,检查由服务返回的所有错误。调用close()方法关闭连接。所有SOAP级异常都将作为SOAPException被抛出。
SOAP Fault处理
SOAP规范定义了一个利用SOAP Fault将异常传回消费者的标准方法。虽然SOAP 1.1和SOAP1.2的SOAP Fault 结构存在很大的差异,但所有这些版本确实有一些通用元素。有关SOAP Fault的更多信息,请参阅 www.w3.org/TR/2003/REC-soap12-part1-20030624/#soapfault。
SAAJ提供了查找是否出现SOAP错误的API,并且如果出现SOAP错误,那么它将提供访问错误元素的方法,比如fault code、fault string、fault actor和fault detail元素。SOAPBody有以下这些方法:
hasFault()——如果返回SOAP Fault,则返回true。
getFault()——返回SOAPFault对象。
SOAPFault有下面这些处理fault对象的方法:
getFaultCode()——返回SOAP错误中的错误代码。
getFaultString()——返回错误字符串。
getFaultActor()——返回指出错误来源的错误操作符。
getDetail()——返回fault detail元素。
清单 1给出了出现错误时记录错误元素所在之处的一个示例。
WebLogic Integration过程
图1展示了Get Temperature的组合过程。该过程将下述的服务有机地结合在一起,从而获得某一给定城市和国家的温度:
接收城市和州的位置信息,并将它放置在XML文档中。
使用U.S. Zip Web服务(www.xmethods.net)获取具有给定名称的所有城市的邮政编码和所在州的列表。
利用转换服务获取所提供的特定州中城市的邮政编码。
调用天气-温度服务,获取该邮政编码区域的温度(www.xmethods.net)。
将结果转换成位置输出文档,并返回它。
合理处理所有异常。
图 1.
以上是 WebLogic Integration Get Temperature 的组合过程。
清单 2展示了如何利用清单 1中给出的方法调用该服务。这个过程的端点URL是随输入的XML文档字符串一起传递给invokeService()方法的。
清单 2. 以下是利用SAAJ调用WebLogic Integration过程的一个例子。
String inputXml = "<env:Envelope xmlns:env=
\"http://schemas.xmlsoap.org/soap/envelope/\" " +
"xmlns:soapenc=\"http://schemas.xmlsoap.org/soapencoding/\"
xmlns:xsd=\"http://www.w3.org/001/XMLSchema\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">
<env:Header></env:Header>
<env:Body> " + "<getTemp xmlns=\"http://www.openuri.org/\">" + "<location xmlns=\"\">
<city>Barrington</city>
<state>IL</state>
</location>
</getTemp>" + " </env:Body>
</env:Envelope> ";
invokeService("http://localhost:7001/saajService/processes/TempService.jpd",inputXml);
SAAJ可能是SOA和集成领域中一种非常有用的API。SAAJ的一些应用程序包含测试框架的服务和服务调用的库。我们已经展示了如何利用SAAJ编写消费者,并创建了一个访问WebLogic Integration Get Temperature组合过程的示例客户机。将该示例应用到您自己的项目中,让SAAJ为您工作。
原文出处:
Solve SOA Integration Problems with SAAJ
The SAAJ API proves its mettle in the SOA and integration space
http://www.fawcette.com/weblogicpro/2004_11/magazine/features/akrishnaswamy/
分享到:
相关推荐
它不但提供了丰富的代码实例,还包括了具体问题的解决方案,为读者提供了深入理解和应用SOA概念的宝贵资源。通过阅读本书,读者将能够掌握如何使SOA在实际应用中发挥作用,并为企业的IT架构带来灵活性和可扩展性。
面向服务的架构(SOA)是一种设计理念,它倡导将应用程序的不同功能单元通过中立的契约联系起来,以便更好地集成和重用。这一理念的关键在于,功能单元(服务)之间的交互应该与硬件平台、操作系统、编程语言等无关...
SOA的核心目标是提高系统的灵活性和复用性,从而简化企业级应用程序的集成。 #### 三、Java中的Web服务规范 Java中有多种Web服务规范,这些规范覆盖了从传统的基于SOAP的服务到现代的RESTful服务。接下来将详细介绍...
`Bus`由`BusFactory`创建,默认情况下使用的是`SpringBusFactory`,这意味着CXF默认集成了Spring框架的支持。 综上所述,JAVA提供了多种不同的WebService规范和技术栈供开发者选择。每种规范都有其适用场景和特定...
Web Service的出现主要是为了解决异构系统之间集成的问题,使得不同技术平台和语言编写的应用程序能够通过标准化的Web协议进行交互。 SOA(Service-Oriented Architecture,面向服务的架构)是一种设计模式,它将...
CXF使用手册强调了CXF的主要特点,包括其核心组件Bus,以及与Spring框架的集成。手册中还提到了Apache CXF的设计理念和架构细节,让开发者可以更深入地理解如何使用CXF开发WebService。 在实现WebService时,开发者...
ServiceMix具备一系列强大的功能,这些功能共同构成了其作为SOA集成平台的核心能力: 1. **创建WebService服务**:用户可以轻松地在ServiceMix环境中创建WebService服务,并利用这些服务实现与其他系统的交互。 2...
通过XFIRE,这些问题都可以得到相对简单的解决方案,使得开发者可以专注于业务逻辑,而不是底层通信细节。 总的来说,面向服务的架构用XFIRE配置Web服务是一种高效且灵活的方式,能够促进系统的可扩展性和互操作性...
SOA是一种设计思想,它通过定义一组松耦合的、基于标准的服务契约来实现应用程序的不同组件之间的通信和集成。SOA的主要目标是提高业务的灵活性和可重用性。WebService通过HTTP作为通信协议,使用SOAP作为消息格式,...
2. **Jar包管理**:直接将所有CXF相关的jar包放置到项目lib目录下可能会导致冲突或问题,建议使用Maven等工具进行依赖管理。 3. **Spring集成**:默认情况下,CXF依赖于Spring框架,这意味着在没有Spring的环境中...
WebService是一种网络服务技术,它是面向服务架构(SOA)的一种实现方式,旨在提供不同硬件平台、操作系统和编程语言之间的一种中立的契约,从而实现各种功能单元的集成。WebService主要通过HTTP作为传输协议,使用...
SOA,即面向服务的架构,是一种设计思想,它允许将应用程序的不同功能单元通过中立的契约联系起来,从而实现更好的集成。SOA的核心是服务的发现、绑定和通信。一个典型的SOA环境包括服务提供者、服务消费者和服务...
JAXM是服务器端相关的规范,SAAJ则在服务器和客户端都可能使用。它们的API分别位于javax.messaging和javax.xml.soap包中。JAXM和SAAJ暴露了SOAP协议的更多底层细节,因此在开发时需要更细致地处理SOAP消息。 3. JAX...
MyEclipse是一款强大的Java集成开发环境,它集成了对Web服务的支持,包括创建、测试和调试Web服务。在这个场景中,我们关注的是MyEclipse中的Web Services Explorer组件,特别是其与WSDL(Web Services Description ...
SOA(Service-Oriented Architecture,面向服务架构)是一种设计模式,旨在通过中立的服务契约将应用程序的不同功能模块连接起来,这些契约独立于具体的硬件平台、操作系统和编程语言,促进了不同功能单元之间的无缝...