本文不对jax-ws使用的细节进行讲解(只捞干货),请谅解。
采用的开发框架 : jax-ws
特点:服务端与客户端都是直接操作 SOAP 的全部消息内容。免去不必要的网络传输和xml的串行/解串行
约定的URI:http://[host]:[port]/[web-app-name]/service/[business-name]/[select|delete|update|insert]?[query-strings]
业务名称(business-name)在URI上体现(借用不合适的词汇--资源)
业务操作只规定四种: select(查询),delete(删除),update(更改),insert(新增) 。业务操作在URI体现出来(RPC形式)
实现的原理:根据约定的URI反射出业务的实现类(根据URI上的business-name) ;根据URI上的操作([select|delete|update|insert])定位到具体的业务实现类上的方法并执行
先来看服务的入口
@ServiceMode(value = Service.Mode.MESSAGE)
@WebServiceProvider(serviceName = "TimingSOAPWS", portName = "TimingSOAPWSPort", targetNamespace = "http://www.timing.com")
@BindingType(value = SOAPBinding.SOAP12HTTP_MTOM_BINDING)
@MTOM(enabled = true, threshold = 10 * 1024 * 1024)//10M的文件才启用MTOM
public final class TimingSOAPWS implements AsyncProvider<SOAPMessage> {
public void invoke(SOAPMessage request, AsyncProviderCallback<SOAPMessage> callback, WebServiceContext context) {
javax.servlet.ServletContext servletContext = (javax.servlet.ServletContext)context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
final Runnable processRunnable = new ProcessRunnable(request, callback, context);
//如果 servlet 环境里有线程池,则使用线程池
if (servletContext != null) {
Object o = servletContext.getAttribute(WSProviderThreadPoolListener.THREAD_POOL_ATTR);
if (o instanceof ExecutorService)
((ExecutorService)o).execute(processRunnable);
}
else//没有线程池,则启动新线程
new Thread(processRunnable).start();
}
}
接下来,抽象出业务的操作
import javax.xml.ws.*;
/**
* 抽象业务处理器。定义了 插入,更新,删除,查询
* @author Hardneedl
*/
public interface WSOperator <S, R> {
/**
* 插入数据的操作
* @param request 请求的报文
* @param context web 上下文环境 @return 将要向客户端打回的内容
*/
R insert(S request, WebServiceContext context) throws Exception;
/**
* 更新数据的操作
* @param request 请求的报文
* @param context web 上下文环境
* @return 将要向客户端打回的内容
*/
R update(S request, WebServiceContext context) throws Exception;
/**
* 删数据的操作
* @param request 请求的报文
* @param context web 上下文环境
* @return 将要向客户端打回的内容
*/
R delete(S request, WebServiceContext context) throws Exception;
/**
* 查数据的操作
* @param request 请求的报文
* @param context web 上下文环境
* @return 将要向客户端打回的内容
*/
R select(S request, WebServiceContext context) throws Exception;
}
最后来看关键的实现代码
final class ProcessRunnable implements Runnable {
private SOAPMessage request;
private AsyncProviderCallback<SOAPMessage> callback;
private WebServiceContext context;
ProcessRunnable(SOAPMessage request, AsyncProviderCallback<SOAPMessage> callback, WebServiceContext context) {
this.request=request;
this.callback=callback;
this.context=context;
}
public void run() {
MessageContext msgContext = context.getMessageContext();
String pathString=(String)msgContext.get(MessageContext.PATH_INFO);
if (pathString==null||pathString.isEmpty())return;
String pathInfos[] = pathString.split("/");
try {
WSOperator opt = ClzManagerFactory.getClzManager().getOperatorSingleInstance("com.timing.business."+pathInfos[1] + "Operator");
Method method = opt.getClass().getDeclaredMethod(pathInfos[2], SOAPMessage.class, WebServiceContext.class);
SOAPMessage soapMessage = (SOAPMessage)method.invoke(opt,request,context);
callback.send(soapMessage);
}catch (Exception e) {
callback.sendError(e);
}
}
}
相比 WSDL->java的方式有何优势?
1) 就四种操作方法,服务的操作简单清晰
2) 复杂业务情形下,客户端post大型内容到服务端的时候,直接操作xml,免去jax-ws runtime 对于 xml-> java 类型的解串行操作。解串行操作消耗了更多的cpu和内存
3) 简单业务需求的时候,直接在 URI 上用查询字符串提供参数,这也是免去jax-ws runtime 对于 xml-> java 类型的解串行操作
wsdl->java 的开发方式中,服务端即使返回一个Integer类型,都需要 java->xml,然后客户端 xml->java
WSOperator的一个示范实现
/*这是一个适配器,具体业务实现者继承自这个类*/ public class WSOperatorAdapter implements WSOperator<SOAPMessage, SOAPMessage> { public SOAPMessage insert(SOAPMessage request, WebServiceContext context) throws Exception {return request;} public SOAPMessage update(SOAPMessage request, WebServiceContext context) throws Exception {return request;} public SOAPMessage delete(SOAPMessage request, WebServiceContext context) throws Exception {return request;} public SOAPMessage select(SOAPMessage request, WebServiceContext context) throws Exception {return request;} }
final public class SiteInfoOperator extends WSOperatorAdapter{ static private final Config CONFIG = ConfigFactory.getTextConfig(); /** * 输出的 xml 结构 * <SiteInfo pollutantSourceCode="" * drainOutletCode="" * drainOutletName="" * equipmentName="" * deviceName="" * scales="" * groupType="" * isNormal="" * remarks="" * userId="" * itemClass=""/> * * * @param request * @param context * @return * @throws Exception */ public SOAPMessage insert(SOAPMessage request, WebServiceContext context) throws Exception { String xmlString = ConvertorFactory.createSOAPBodyStringConvertor("SiteInfo").convert(request); Map<String,String> param = new HashMap<>(1); param.put("xml", xmlString); DaoFactory.createInsertDao("siteinfo.insert").perform(param); return WSMessageTool.createSimpleTextMessage( ConfigFactory.getTextConfig().getString("db.insert.ok") ); } }
相关推荐
Web Service通常由三部分组成:服务提供者(Service Provider)、服务代理(Service Proxy)和服务消费者(Service Consumer)。服务提供者实现服务并将其暴露给网络;服务代理作为客户端与服务提供者之间的中介,...
**Web Service**是一种支持软件间通信的网络服务形式,它提供了一种标准化的方式使得一个应用程序可以通过HTTP等网络协议调用另一个应用程序的功能,就像本地调用一样。简单地说,Web Service就是一个应用向其他应用...
本文将详细介绍如何在仅安装了ABAP Stack的SAP系统中激活Web Service,确保其能够正常对外发布服务。 #### 二、激活步骤 ##### 1. 修改ICM参数 在激活Web Service之前,首先需要对Internet Communication Manager...
【ESB应用Web_Service_Consumer】是JBoss ESB中的一个重要应用场景,主要用于演示如何通过ESB的Action调用遵循JSR181注解规范的Web服务,即ESB作为一个Web服务的消费者。JSR181(JavaTM API for Web Services ...
- **服务提供者(Service Provider, SP)**:需要验证用户身份才能提供服务的应用程序。 - **信任关系(Trust Relationships)**:定义IdP和服务提供者之间的相互信任。 - **令牌(Tokens)**:安全地传输用户身份...
**JAX-RS方式的RESTful Web Service开发详解** RESTful Web Service是一种基于HTTP协议的、无状态的、客户端-服务器交互模式,它利用HTTP方法(GET、POST、PUT、DELETE等)来实现对资源的操作。JAX-RS是Java API ...
1) 服务提供者(Service Provider):这是 Web Service 的核心,它负责发布服务并处理来自客户端的请求。在港口信息化场景中,服务提供者可能是一个港口操作系统,如码头作业管理系统、货物跟踪系统等,它们通过 Web...
- **JSR-109标准**:支持POJO(Plain Old Java Object)和EJB(Enterprise JavaBeans)作为Web Service端点,简化了Web服务的创建与部署过程。 - **JSR-181标准**:进一步增强了Java的注解功能,使开发者能以声明式...
服务端点是服务定义的运行时表现形式,它包含了服务定义的运行时配置,并在提供者系统上有一个唯一的位置,即服务端点URL。对于Web服务客户端来说,服务端点就是可以访问该服务定义及其特定运行时设置的位置。 一个...
随着互联网技术的发展,Web Service作为一种标准的、基于XML的网络服务形式,在实现不同平台之间数据交换和应用集成方面扮演着重要角色。Axis作为Apache组织下的一个开源项目,为开发者提供了一种简单而强大的工具来...
UDDI数据模型由三个核心组件组成:提供商(Provider)、服务(Service)和绑定(Binding)。提供商是指提供服务的实体,服务描述了一组特定的技术服务,而绑定则包含服务接入点的详细技术信息。每个绑定可以引用一个...
Web服务是一种基于网络的、平台无关的交互方式,允许不同系统之间进行数据交换和功能调用。在ASP.NET框架下,开发Web服务是常见的实践,它利用SOAP(Simple Object Access Protocol)协议,使得应用程序能够通过HTTP...
在IT行业中,Web服务是一种基于网络的软件交互方式,它允许不同的系统之间通过标准协议进行通信。Axis是一个流行的Java开源工具,用于创建、部署和管理Web服务。本篇文章将深入探讨如何利用Axis和wsdd(Web Services...
Restful Web Service是一种基于HTTP协议构建的Web服务,它遵循REST(Representational State Transfer,表现层状态转移)架构约束,以简洁、可扩展的方式提供了丰富的网络应用接口。这种服务设计风格使得API易于理解...
1. **服务提供者(Service Provider)**:这是图书管理系统的核心,它通过Web服务接口公开其功能,如添加书籍、查询书籍、借阅和归还书籍等。这些功能以SOAP(简单对象访问协议)消息的形式暴露,便于远程调用。 2....
而Web Service则是一种通过XML标准在不同系统之间交换数据的服务模型,它允许不同平台的应用程序之间进行通信。 在"ASP.NET与Web Service实例剖析中文版"这本书中,我们可以期待深入学习这两项技术的实际应用和原理...
Java RESTful Web Service是现代Web应用开发中的一个重要概念,它基于Representational State Transfer(表述性状态转移)架构原则,提供了一种轻量级、高效且易于理解和实现的接口设计方式。在本PDF教程《Java ...
在现代软件开发领域,Web Services(网络服务)是一种让应用程序之间能够通过互联网进行通信的重要方式之一。本章节将通过一个具体的示例来介绍如何使用Axis进行WebService的开发。 #### 1.1.1 Axis1开发示例 ####...