`
hardneedl
  • 浏览: 31603 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Web Service 的 Provider 服务形式

阅读更多

本文不对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")
        );
    }
}

 

1
0
分享到:
评论

相关推荐

    服务计算与大数据.pdf

    服务提供者(service provider):接受和执行服务使用者的请求的可寻 址的网络实体。 服务中介(service broker):包含一个可用服务库并且为感兴趣的服务 使用者提供服务提供者接口的查找。 Publish 发布:一个服务...

    Web2.0社区平台源码

    借助SpaceBuilder平台的服务(用户、朋友、私信、邀请、权限、审核、隐私、积分、通知、动态、标签、分类、附件…),二次开发者可以快速的增加新的应用模块或者对现有的应用模块进行修改。SpaceBuilder采用世界领先...

    sharepoint2010 Beta安装步骤

    以前的共享服务Shared Service Provider不复存在,取而代之的是独立的Shared Service Application。不同服务之间既可以互相依存,也可以独立存在,用户应用可以根据需求选择调用哪些服务,从而最大限度节省系统资源...

    Android手机天气预报项目报告.docx

    Web Service使用基于XML技术的消息处理,作为基本的数据通讯方式。Web Service建立在一些通用协议的基础上,如HTTP、SOAP、XML、WSDL、UDDI等。各应用程序通过网络协议和规定的一些标准数据格式(HTTP、XML、SOAP)来...

    OAuth协议 介绍

    服务提供方 Service Provider: 一个允许通过OAuth访问的web应用程序。 用户 User: 在服务提供方处拥有帐号的个人。 消费方 Consumer: 一个代表用户以OAuth形式访问服务提供方的网站或应用程序。 受保护资源 ...

    (完整)Android手机天气预报项目报告.doc

    2.2 技术支持 本软件使用基于SOAP(简单对象访问协议)的Web Service技术来实现与服务器端的信息交互,获取网络上的数据.Web Service使用基于XML技术的消息处理,作为基本的数据通讯方式.Web Service建立在一些通用...

    Android手机天气预报项目报告(1).docx

    Web Service使用基于XML技术的消息处理,作为基本的数据通讯方式。Web Service建立在一些通用协议的基础上,如HTTP、SOAP、XML、WSDL、UDDI等。各应用程序通过网络协议和规定的一些标准数据格式(HTTP、XML、SOAP)来...

    SAML2.0 基础理论

     SSO对于使用应用服务提供商(Application Service Provider,ASP)软件服务的企业特别有用。ASP在自己的服务器上宿主应用程序,出售其访问权作为服务。公司可以在它的标准目录服务器里管理自己的用户和口令,然后...

    Android手机天气预报项目报告(2).docx

    Android的开发组Activity、Intent Receiver、Service、Content Provider等,可以实现不同页面之间的跳转;数据的获取和实现与数据库的实时交互;不同页面和进程间数据的共享. 2.3 数据库设计 本软件中有两部分数据...

    一、SAP对外发布WebService.实施步骤

    STEP1: 【创建WEB服务】-【来自函数模块】 方式一:从SE37进入操作 方式二:从SE80进入操作,选择需要对外发布WebService的函数-&gt;检查-&gt;企业服务,选择服务提供者:Service,Provider ,*Abap*,Function Module

    ASP.NET3.5典型模块开发源代码

    24.2.1 创建Web Service天气服务 329 24.2.2 在程序中使用Web Service 330 24.3 小结 332 第25章 在线随机考试模块 333 25.1 随机考试的技术要点 333 25.1.1 随机性 333 25.1.2 防止重复 334 25.2 ...

    Spring Security 中文教程.pdf

    16. acegi到spring security的转换方式 16.1. Spring Security是什么 16.2. 目标 16.3. 步骤 16.4. 总结 V. 高级话题 17. 领域对象安全(ACLs) 17.1. 概述 17.2. 关键概念 17.3. 开始 18. 预认证...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    Android开发与应用——张荣,原书配套课件

    8.4 Web Service访问 8.5 小结 练习 第9章 多媒体应用 9.1 音频与视频的播放 9.1.1 MediaPlayer 9.1.2 SoundPool 9.1.3 VideoView 9.1.4 SurfaceView 9.2 摄像头的使用 9.2.1 摄像头意图Intent ...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    YLReactiveCocoa:MVVM的ReactiveCocoa演示

    android : 四大组件(activity、service、broadcase receiver、content provider)和五大布局(LinearLayout、FrameLayout、RelativeLayout、AbsoluteLayout、TableLayout) 还有 java iOS : xib/storyboard + oc web...

    Spring Security-3.0.1中文官方文档(翻译版)

    16. acegi 到spring security 的转换方式 16.1. Spring Security 是什么 16.2. 目标 16.3. 步骤 16.4. 总结 V. 高级话题 17. 领域对象安全(ACLs) 17.1. 概述 17.2. 关键概念 17.3. 开始 18. 预...

    疯狂Android讲义源码

     13.5.2 Web Service平台概述 510  13.5.3 使用Android应用调用  Web Service 512  13.6 本章小结 524  第14章 管理Android手机桌面 525  14.1 管理手机桌面 526  14.1.1 删除桌面组件 526  14.1.2 添加桌面...

Global site tag (gtag.js) - Google Analytics