记一次web服务模块开发过程
一、前言
之前在分析WCS系统的过程中,也赶上要开发其中的一个模块,用于和AGV系统对接完成一些取货、配盘等任务;在这里将这次模块开发的全过程记录一下,以便自己以后开发时能够更加快速的明白流程。
二、需求
当时的需求是在WMS的系统之上创建一个独立的servlet来专门负责AGV的服务模块以及客户模块;其流程大概是我方AGV服务端在启动后定期从数据库读取来自MES系统推送的组盘信息,然后根据业务调出其中可以下发的任务,通过AGV服务的接口将请求下发给AGV服务;AGV服务完成任务后会调用我方提供的接口通知我们,最后协商后的流程如大致如下(商业原因,名称均已修改):

还有另一个区的更复杂的流程图,要改很多东西就不放了。
三、代码实现
代码实现上是模仿Struts1,通过一个抽象的AbstractManager类,以模板方法模式和命令模式构建一个框架,每个Manager都实现这个抽象的Manager;
然后通过dom4j来动态的配置需要生效的Manager,如配置
<services>
<service name="/manager1" class="com.wxzd.wms.agv.server.XXManager" method="GET" />
<service name="/manager2" class="com.wxzd.wms.agv.server.YYManager" method="POST" />
</services>
其中每个service都是一个实现了AbstractManager的子类,然后name表示相对于context路径的一级子路径,而class则是对应的命令对象;method则表示此manager支持
哪些类型的HTTP请求;
其中AbstractManager的实现方式为:
public abstract class AbstractManager
{
private String serviceName;
private String method; public String getServiceName()
{
return serviceName;
} public void setServiceName(String serviceName)
{
this.serviceName = serviceName;
} public String getMethod()
{
return method;
} public void setMethod(String method)
{
this.method = method;
} public void doManager(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
long startTime = System.currentTimeMillis();
handleRequest(request, response);
long elapsedTime = System.currentTimeMillis();
// TODO log elapsedTime
} protected abstract void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}
子类只需要实现handleRequest方法即可。然后子类里可以通过实现Resolver接口来细分对应的请求由哪个resolver来处理,在接口RequestResolver里提供support和resolve两个方法;这一步如果直接在handleRequest方法里用if判断实际上也是可以的,但是基于单一职责原则,Manager只负责去匹配符合要求的服务类,而具体由哪个方法处理则应该继续分层。
servlet的init方法实现:初始化时将配置文件的service构造出键值对,并存入map;然后有请求来了以后取出context下的一级路径,然后和map的key匹配,匹配成功则调用此manager的handleRequest进行处理;
四、服务端的处理流程图

五:总结
当时实现这个模块的时候还没看springmvc源码,现在再回过头来看,虽然实现了一定程度的插件式的开发,但粒度还是太大了,而且在数据处理方面
也没有提供切面来实现更深层次的解耦;如果再次实现的话其实可以直接模仿springmvc,提供handlermapping,handleradapter,handlermethodargumentresolver,handlermethodreturnvaluehandler,httpmessageconverter这些“插件”和相关的接口,因为有了这些预留的切面和对应的接口,使得模块能够动态的更新和取消功能。
记一次web服务模块开发过程的更多相关文章
- 记一次Web服务的性能调优
前言 一个项目在经历开发.测试.上线后,当时的用户规模还比较小,所以刚刚上线的项目一般会表现稳定.但是随着时间的推移,用户数量的增加,qps的增加等因素会造成项目慢慢表现出网页半天无响应的状况.在之前 ...
- python下的web服务器模块
python下的web服务模块有三种: BaseHTTPServer: 提供基本的Web服务和处理器类,分别是HTTPServer和BaseHTTPRequestHandler SimpleHTTPS ...
- 利用python httplib模块 发送Post请求测试web服务是否正常起来!
最近在学习python,恰好老大最近让我搞个基于post请求测试web服务是否正常启用的小监控,上网查了下资料,发现强大的Python恰好能够用上,所以自己现学现卖,顺便锻炼下自己. 由于本人也刚接触 ...
- Web服务端软件的服务品质概要
软件品质概述 提供同样功能.产品和服务的服务者中, 竞争力来自功能的多样化和服务品质的差异化, 无论是个体.企业还是国家. 这里的服务指功能.产品的实现程度和处理能力,以及研发/客服提供的技术支持程度 ...
- Apache web服务
1.apache 1> 世界上使用率最高的网站服务器,最高时可达70%:官方网站:apache.org 2> http 超文本协议 HTML超文本标记语言 3> URL 统一资源定位 ...
- Web服务
Web服务的相关信息 Apache服务器是web服务的重要应用 在这也是讲的apache 这里需要安装一个http服务软件才行! Apache的根文档在/var/www/html 主配置文件 /e ...
- 基于dubbo构建分布式项目与服务模块
关于分布式服务架构的背景和需求可查阅http://dubbo.io/.不同于传统的单工程项目,本文主要学习如何通过maven和dubbo将构建分布项目以及服务模块,下面直接开始. 创建项目以及模块 ...
- 利用OpenShift托管Node.js Web服务进行微信公众号开发
最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...
- web服务器之nginx与apache
最近准备架设php的web服务器,以下内容可供参考. 1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞 ...
随机推荐
- WP runtime post 请求, json 解析
https://monkeyweekend.wordpress.com/2014/10/23/how-to-send-text-json-or-files-using-httpclient-posta ...
- delegate() 事件绑定 事件委托
定义和用法 delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数. 使用 delegate() 方法的事件处理程序适用于当前或未来 ...
- 【OpenPose-Windows】OpenPose+VS2015+Windows+CUDA8+cuDNN5.1 官方配置教程(转载)
[我的电脑配置] 操作系统:Windows 10 CUDA版本:cuda_8.0.61_win10 cuDNN版本:cudnn-8.0-windows10-x64-v5.1 GPU model:Nvi ...
- subnet partition
例1:本例通过子网数来划分子网,未考虑主机数. 一家集团公司有12家子公司,每家子公司又有4个部门.上级给出一个172.16.0.0/16的网段,让给每家子公司以及子公司的部门分配网段. 思路:既然有 ...
- JDK5并发(1) Locks-AQS
AbstractQueuedSynchronizer @(Base)[JDK, locks, ReentrantLock, AbstractQueuedSynchronizer, AQS] 转载请写明 ...
- JSP复习(part 4)
3.5.2 重定向网页 使用response对象中的sendRedirect()方法实现一个重定向到另一个页面. 例如: response.sendRedirect(“”login_ok.jsp“”) ...
- CSS3 弹性盒模型 box-flex
说明:本文档兼容性测试基础环境为:windows系统:IE6-IE10, Firefox6.0, Chrome13.0, Safari5.1, Opera11.51 语法: box-flex:< ...
- topGO
前面我们讲过GO.db这个包,现在接着延伸topGO包,该包是用来协助GO富集分析 1)安装 if("topGO" %in% rownames(installed.packages ...
- HttpClient 4 和 HttpClient 3 超时
HttpClient 4: 连接超时: httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,6000 ...
- input radio 与label文字对齐
input{ vertical-align:middle; margin-bottom:2px; *margin-bottom:2px; } 原地址