记一次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 处理请求是异步非阻塞 ...
随机推荐
- ubuntu 安装MySQLdb
ubuntu运行sudo pip install MySQL-python安装MySQLdb时报错:Command "python setup.py egg_info" faile ...
- JAVA NIO学习记录1-buffer和channel
什么是NIO? Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不 ...
- lftp命令详解
lftp.sh自动上传脚本: #!/bin/bash echo -e "\nScript start at \033[43;35m `date "+%H:%M:%S"` ...
- eclipse 自动生成json格式的toString()方法
文本代码 {"${member.name()}":"${member.value}", "${otherMembers}"}
- Boost.Hana
Boost.Hana Boost.Hana 是一个元编程的库.它为不同种类数据的集合以及类型的集合提供了容器和算法. #include <boost/hana.hpp> namespace ...
- 吴裕雄 数据挖掘与分析案例实战(5)——python数据可视化
# 饼图的绘制# 导入第三方模块import matplotlibimport matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['S ...
- docker 入門
http://dockone.io/article/277 我的碎碎念:Docker入门指南 [编者的话]之前曾经翻译过很多Docker入门介绍的文章,之所以再翻译这篇,是因为Anders的角度很独特 ...
- referer null
Referer表示超链接源的URL!你想看到实验效果,要从a-->(能过<a href="b.jsp")b页面,然后在B里可以取得Refere参数! String ur ...
- sysbench——服务器cpu性能测试
一.前言 最近在工作中需要测试cpu占用率.内存占用率,我想要寻找一种合适的能提高cpu占用率的工具及方法.先尝试了使用 echo "scale=5000; 4*a(1)" | b ...
- android笔记:BroadcastReceiver
android允许应用程序自由地发送和接收广播. 广播是通过Intent进行数据传递的.接收广播则通过Broadcast Receiver(广播接收器)实现. 广播分为:标准广播和有序广播. 标准广播 ...