<%@ page contentType="text/html; charset=gb2312"%> 用SAAJ解决SOA集成问题
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
用SAAJ解决SOA集成问题
     发布者: 发布时间:2007-09-23
面向服务的架构(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 的组合过程。
(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
J2EE基础:Struts框架的初学者入门知识
J2EE新手入门:“Hibernate”名词解释
J2EE新手入门篇:“Spring”的名词解释
穿透Socks5 代理的UDP编程
对等计算实践:基于 IP 多播的发现
从socket中读取数据时使用超时
 
最近评论:
        
鍥炲
        
如果真的有来生!
四川旅游,九寨沟旅游,稻城亚丁旅游,四姑娘山旅游,海螺沟旅游,西藏旅游, max(3173)
        
春暖花开
world of warcraft power leveling,arena power leveling,wow power leveling,honor power leveling,wow power leveling,wow powerleveling,skill power leveling,Reputation power leveling,Professions power leveling,lotro power leveling,lotro powerleveling,world of warcraft leveling,wow gold,world of warcraft gold, k7y6w7nj
        
那天的情景!
Maple Story mesos,MapleStory mesos,ms mesos,mesos,SilkRoad Gold, max(4084)
        
轻轻走过你的窗前!
world of warcraft gold,cheap world of warcraft gold,warcraft gold,world of warcraft gold,cheap world of warcraft gold,warcraft gold max(4150)
        
快乐情人节!
wow gold,wow gold,wow gold,wow gold,wow gold,wow gold,wow gold buy wow gold for cheap. max(7242)
        
没有情人的情人节!
wow gold,wow power leveling.wow power leveling,wow power leveling, max(3104)
        
回复:用SAAJ解决SOA集成问题
guild wars gold gw gold Maple Story Mesos Maple Mesos cheap guild wars gold guild wars money buy guild wars gold gw money cheap guild wars money cheap gw money MapleStory Mesos Maple Story Meso buy Maple Story Mesos cheap Maple Story Mesos buy Maple Meso cheap MapleStory Mesos cheap Maple Story Meso
        
见到你的笑!
maplestory mesos,maplestory mesos,maplestory mesos, maple story mesos, max(9576)
        
天天思念你!
guildwars gold,guild wars gold,guild wars gold,lotro gold, max(170)
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号