ClearWork力求为基于Web Service技术的SOA架构整合完善的工具和框架,并提供全面的支持。
ClearWork Web Service框架的全局配置为
spring-webservice.xml
,其中的配置包括:Web Service事务资源池、Web Service事务模版、Web Service for
JDBC事务管理器、Web Service事务服务的客户端配置。
Axis2 是新一代Apache Axis。Axis2具有更强的灵活性并可扩展到新的体系结构。Axis2 基于新的体系结构进行了全新编写。Axis2的特性包括:
采用名为 AXIOM( AXI s2 O bject M odel,Axis 对象模型)的新核心 XML 处理模型
支持 In-Only 和 In-Out 消息交换模式 (MEP)
阻塞和非阻塞客户端 API(应用程序编程接口)
支持内置的 Web 服务寻址 (WS-Addressing)
支持 XML Beans 数据绑定
新部署模型
支持超文本传输协议 (HTTP)、简单邮件传输协议 (SMTP) 、传输控制协议 (TCP)等传输协议和REST (Representational State Transfer)结构
具体信息可以访问 Axis2官方网站 获取。
在第一代的 Axis 中,服务的暴露和加载主要是依赖WSDD (Web Service Define Document)文档进行的。 Axis2本身支持以 aar 存档的形式部署和加载Web服务(支持热部署)。
现在,ClearWork将Axis通过WSDD服务描述文件部署加载Web服务的特性带入了Axis2!
您只需在特定的目录(默认为:
classpath:config/wsdd/
)中利用
*.wsdd
描述您的业务服务类型,即可将其暴露为Web Service,其描述规范完全遵循Axis2 aar存档中
META-INF/services.xml
的规范。通过这种机制可以自动的将您应用中任何符合Service规范的类型暴露为Web Service。
相应的,您需要在
web.xml
中预置ClearWork的Axis2ServiceServlet(它继承自
org.apache.axis2.transport.http.AxisServlet
)
<servlet> <servlet-name>AxisServlet</servlet-name> <display-name> Apache-Axis2 and ClearWork-Contribute Servlet </display-name> <servlet-class> net.sf.clearwork.service.axis2.server.web.deployment.Axis2ServiceServlet </servlet-class> <init-param> <param-name>axis2.xml.path</param-name> <param-value>classpath*:config/axis2.xml</param-value> <!--<param-name>axis2.xml.url</param-name>--> <!--<param-value>http://localhot/myrepo/axis2.xml</param-value>--> <!--<param-name>axis2.repository.path</param-name>--> <!--<param-value>/WEB-INF</param-value>--> <!--<param-name>axis2.repository.url</param-name>--> <!--<param-value>http://localhot/myrepo</param-value>--> <!--<param-name>axis2.wsdd.path</param-name>--> <!--<param-value>classpath*:config/**/wsdd/*.wsdd.xml</param-value>--> </init-param> <load-on-startup>1</load-on-startup> </servlet>
默认的,您的WSDD服务描述文件都应位于
classpath*:config/**/wsdd/*.wsdd.xml
,WSDD文件的扩展名应遵循
*.wsdd.xml
规则。
如何验证您的服务定义(WSDD)是否正确?如何验证您的业务服务类是否完全符合Web Service标准而能被预期的访问?这两个问题的异常如果在Runtime(运行时)被强制抛出将是很令人迷惑的, 特别是后者,有时候它并不表现为“异常”,而是给您无法预期的返回结果。
现在,ClearWork提供了 net.sf.clearwork.service.axis2.server.ServiceValidater 工具,它可以精密的验证您的服务描述(WSDD)、服务类(Class)、甚至服务类的输入输出数据类型(POJO原则), 如果发现了可能问题,将会在加载时抛出相应的异常或打印明确的Log4j Debug提示。
ServiceValidater工具的用法非常简单:
new ServiceValidater(new FileInputStream(Your_WSDD_File)).validate();
验证通过返回true,否则返回false。
ClearWork系统默认对所有定义的Web Service服务采用此工具进行加载时的验证,具体情况可以参见 第 8.2 节 “ClearWork对Axis2的扩展 - 基于WSDD描述文件的服务部署” 。
net.sf.clearwork.service.axis2.client.support.CallbackSupport - 我们知道Aixs2提供的令人激动的新特性之一就是它可以很方便的支持客户端的异步Web Service回调,这是通过继承 org.apache.axis2.client.async.Callback 回调抽象类实现的,现在ClearWork提供了进一步的抽象—— CallbackSupport 。它使用execute()抽象方法替代了原来的onComplete()抽象方法,来执行异步Web Service调用的后续处理,与onComplete()方法不同的是,execute()方法提供的参数 Object[] returnObjects 是经过反序列化处理生成的真正的应答对象。
同时,CallbackSupport简化了错误情况(onError())的处理; execute()抽象方法支持一个布尔型的返回值以确认业务逻辑的正确执行。
net.sf.clearwork.service.axis2.client.support.RPCServiceClientSupport - 这个类通过继承 org.apache.axis2.rpc.client.RPCServiceClient 为您提供更加简单清晰的 动态执行 Web Service的客户端工具, 它增强了“无返回值同步执行”、“异步执行”、“有返回值同步执行”等常用的动态客户端操作方法。
大部分情况下,Web Service的SOAP消息是通过Http协议来传送的,正如我们所知的, 由于Http协议的无状态特性,基于其的SOAP消息很容易的穿过防火墙,但一个副作用就是无法保证Web Service客户端和服务端的一致性,即Web Service事务不可控制。
现在,ClearWork提供了一套简单有效的基于Spring配置的Web Service事务控制框架,可以在一定范围内解决Web服务客户端与服务端事务不可控制的问题。 基本原理就是扩展Spring的JDBC及Hibernate事务管理框架:在服务端执行完毕后,不立即提交事务, 而是将只支持同一线程的Spring事务资源放入一个“事务资源池”中(这个事务资源池需要实现 net.sf.clearwork.service.axis2.server.transaction.IWSTransactionSynchronizationPool 接口。可以由用户自己实现,当然,ClearWork也提供默认的实现 DefaultWSTransactionSynchronizationPool ),相当于远程“挂起”事务,然后,利用Axis2的异步执行Web Service客户端的特性,执行回调方法中客户端部分的事务,那么,将会有以下几种情况出现:
客户端事务提交成功 - 则客户端会自动通知服务端提交“事务资源池”中相应的事务,两方面事务成功提交。
客户端事务提交失败 - 无论是由于异常爆发或业务逻辑未通过,ClearWork都会自动的通知服务端“回滚”事务,以保证一致性。
客户端与服务端失去联系 - 这种场景最常见的情况就是网络瞬断,那么,由于接收不到客户端的消息, 服务端被“挂起”的事务在指定的等待时间后,则会触发 事务超时策略 ,根据配置对相应的事务进行“回滚”或“提交”的补偿处理。
事务超时策略
:作为
spring.xml
中全局配置“Web服务事务模板”
webServiceTransactionTemplate
的
serviceTimeout
属性被配置,格式为
rollback
_
[second]
或
commit
_
[second]
。例如:rollback_4表示,4秒后执行回滚事务的超时策略。
客户端事务成功提交
可以想象,如果在服务端的事务操作一开始就失败了,那么服务端会自动的立刻通知客户端,保证客户端的事务根本不会被执行。
从应用实现方面来说,如果需要ClearWork框架对您的Web Service事务进行控制,在开发中需要做到以下几点:
服务端实现类需要继承 net.sf.clearwork.service.axis2.server.service.AbstractTransactionServiceSupport 。
服务端返回的应答类型必须为 net.sf.clearwork.service.axis2.dto.AbstractTransactionDTO 的子类,ClearWork有两个默认实现: StringTransactionDTO 和 VoidTransactionDTO 。
根据持久化实现的不同,选择配置
WSDataSourceTransactionManager
for JDBC 或
WSHibernateTransactionManager
for Hibernate,可以参考ClearWork Sample Resource -
spring-sample.xml
。
需要在
spring-webservice.xml
中正确配置
transactionServiceClient
,告知事务客户端正确的服务端地址和端口。
客户端必须是异步执行模式,同时必须使用Web Service事务支持的回调抽象类型 net.sf.clearwork.service.axis2.client.support.CallbackTransactionSupport 。
具体的,如何实现ClearWork Web Service事务控制,建议您参考ClearWork Sample:
服务端示范 - net.sf.clearwork.sample.webservice.server.SampleUserTransactionService 和 net.sf.clearwork.sample.webservice.server.SampleUserHibernateTransactionService
客户端示范 -
net.sf.clearwork.sample.webservice.client.SampleUserTransactionClient
配置示范 - 位于
spring-sample.xml
中
一般来说,一个普通的业务服务类型(Business Service)暴露为Web Service供他人访问, 通过诸如Axis2之类的“Web服务引擎”是很容易做到的,但仍然需要配置一些服务描述等等,而且, 并没有一种强验证机制能在部署时检测原始的业务服务类型是否完全适合暴露为Web Service,例如:
请求/应答(Request/Response)参数是否符合POJO原则。
服务描述的XML是否符合“Web服务引擎”定义的规范。
对于 第 8.5 节 “ClearWork对Axis2的扩展 - 基于自定义策略的Web Service事务控制” 的验证。
……
现在,ClearWork框架提供了基于元数据(Annotation)描述的Web Service服务注册机制以解决上述问题,简化Web服务开发,强化Web服务验证。 通过元数据接口 net.sf.clearwork.service.axis2.annotation.AsWebService 将特定的业务服务类型暴露。
AsWebService的参数: description 参数为服务描述,必需; schemaNamespace 如果不指定,则为包名的倒序;其余的参数均有默认值,可参考示例或Java Doc。
同时,需要在Spring中配置 net.sf.clearwork.service.axis2.server.ServiceRegister ,在其属性中声明暴露的服务类型,例如:
<!-- web service Register --> <bean id="serviceRegister" class="net.sf.clearwork.service.axis2.server.ServiceRegister" lazy-init="true"> <property name="services"> <map> <entry key="SampleHelloWorldService"> <value> net.sf.clearwork.sample.webservice.server.SampleHelloWorldService </value> </entry> </map> </property> </bean>
具体的使用,可以参考ClearWork示例
spring-sample.xml
以及
net.sf.clearwork.sample.webservice.server.SampleHelloWorldService
和
net.sf.clearwork.sample.webservice.server.SampleUserTransactionService
。