近期刚把手上的一个系统做完,项目背景不方便说,只把我这块的架构大概说一下,罗列一些实现的功能,做些总结。因为从0开始,做到现在再到测试上线,是花费了很大周折的。
我们的系统是一个通信系统,负责在各个地点之间传输相关数据,我这块负责人机交互,暂且称为人机模块。人机模块需要与传输模块交互,接受数据,展示数据,并且甲方坚持要通过人机界面控制传输过程,于是又有了传输暂停、取消、重传等一些功能。同时,要求保存两天的任务状态信息,这样用户可以在两天的任务间切换,对未完成的历史任务重新操作。同时要求对传输失败的数据,可以通过FTP从远端站传输到其他站。
项目开发环境Jdk1.6
功能如下:
任务状态显示
用户登录、管理。日志管理,查询。系统配置
任务暂停、重传、续传、取消
FTP传输
人机模块内部设计为单服务器,多客户端。对外部来说,人机模块与控制模块之间,人机模块又充当客户端的角色。
设计:
界面采用Java Swing设计(Java布局很纠结,JTableModel必不可少,各种不同的组件均用到了,前期知识准备工作相当痛苦,界面老是不按照自己设计的显示,现在好歹算入门了吧)
与控制模块之间使用Java Socket通信(Socket通信异常的处理十分重要,包括断开重连,消息发送失败导致通信一方死等等问题都比较常见,由于人机模块内部分服务器端和客户端,也使用Java Socket通信,常出现消息发送失败,消息丢失等问题,很是头痛,好在最终解决)
定时任务(定时保存历史数据,定时切换今天与昨天任务,传输超时定时扫描。一开始使用的Java Timer类,后来发现完全不能满足需要,于是转向第三方Quarze包,圆满完成任务)
人机界面显示与业务之间的结合(将传输任务列表映射到人机界面上,为实现这个功能,设计了很多全局的Hash表,今天的,昨天的,正在传输的 ,暂停的,取消的,完成的,等待的,任务包含的子任务等等)
FTP传输使用Apache的common-net包(本以为会很顺利,但最纠结的也在这里,首先是下载与上传要单独放到一个线程里,不能让系统死等在那里,其次,上传完成后,发现前后大小不一致,MD5校验失败,反复查问题,就是找不到原因,好在最终解决)
对我个人来说,实现过程中遇到大大小小的问题,最大的问题有3个,第一个就是JavaSwing的界面设计,第二个是Socket中的通信问题,因为一知半解,或者代码编写错误等导致的问题,第三个是FTP传输的大小不匹配问题。当然,除此之外很多较大的问题也都很纠结,比如由于设计上一开始人机模块并没有设计为服务端与客户端,所以后来代码重构,还有就是系统本身属于二期项目,对一期项目中的数据也要有支持,所以后来做了大量的与业务有关的工作。具体种种,就不向外人道也。
之后会分几篇具体说一下每个小的设计的得失,希望对有问题的朋友可以提供些有意义的信息。毕竟,这个系统还是涵盖了相当多的Java日常技术的,从文件操作,多线程,网络编程,容器使用,Swing编程等都有设计。是个很有意义的项目,而且项目本身的设计也是由我一人完成,很多类关系也一直在调整,设计模式的细节也多体现在代码内部。
由于现在多用python和shell等环境工作,Java已渐渐退出我个人的技术舞台,所以有些问题还是要整理出来,把解决方案写出来,才能算对这个项目有个交代。而且项目经验本身可以作为日后从事其他项目的有益参考,不论使用C++还是Java,其实技术理论是相通的,可以用来做些有意义的思考。
日志管理,人员管理,系统配置等功能自然没有必要细说