项目总结:每隔5分钟从数据库拉取数据转为Json格式通过WebService从客户端传送至服务端

   第一次接手需求写的小项目,过程也有点坎坷,以此记录总结编码过程中遇到的问题。

   项目背景:本次写的是一个小模块,主要为客户端,作用是每隔5分钟从数据库拉取数据传送至服务端。本次项目采用的是spring3+Quartz+JdbcTemplate+JSONArray+RPCService。以下分为几个模块详述。

   项目思路:将本次需求分为三个模块:定时器+查询数据+客户端发送。

   一、定时器

由于本项目整体采用的spring的框架,所以本次定时器采用的是Spring+Quartz的模式。Quartz配合cron表达式,能够执行每隔一段时间/定点执行等强大的定时功能。好了,我们来看定时器的编写。Quartz分为配置+任务方法两块,配置在spring的xml文件中编写,具体的任务写在具体类的execute方法中。

首先,我们创建一个spring的配置文件:applicationContext.xml,在里面写好定时器的要执行的任务、触发器等内容;

applicationContext.xml

Task.java

以上Quartz的编写就完成了,接下来是运行中可能出现的问题:

1.无法执行定时器任务

1)可能整个项目是个Web项目,需要Tomcat启动后载入spring容器才能执行定时器任务;

2)可能需要需要先启动其他方法才能执行定时器任务;

3)可能IDEA的Server配置有问题,打开Run/DebugConfigurations,TomcatServer-Deployment,将下面war exploded文件改为External Source下项目target的项目.war文件;

2.定时器多次执行

1)可能是Tomcat的配置问题,需要更改其server.xml将AutoDeploy改为false(详情可百度)

2)在定时器执行的具体任务中误使用了加载应用上下文(ApplicationContext ctx=new ClassPathXmlApplicationContext("ApplicationContext.xml"),导致执行的时候反复加载上下文,陷入递归循环,重复执行任务。

二、查询数据

查询数据这边的工作包括数据库设计、数据库连接、查询方法。本次使用了Mysql 和Oracle两种数据库,下面会一一介绍。

1.数据库设计

本次的数据包括很多属性,简化后大约是一个设备里有很多属性,每个属性随时间产生数据,有多个设备。目前采用的设计方法是建一张表,表的字段包括设备ID,属性1,属性2....时间,然后ID1的几十条记录随时间变化,接着添加ID2的几十条记录随时间变化....这样设计比较简单。但是考虑健壮性的话,比如后续添加其他设备,与现有设备属性并不一致怎么办?可以建一张属性大表,后续设备属性引用这张大表.....在此不做过多表述,以后遇到再写。

属性表

2、数据查询

数据库采用了mysql和oracle,但是实现的思路是一样的,采用的是JdbcTemplate和C3P0。在这里先说总体的,后续再说两者的差异。

首先,在spring配置文件里写JdbcTemplate和C3P0的配置。

applicationContext.xml

然后,写一个pojo,也就是跟数据库对应的实体类,在此不做过多表述。

接着,写Dao方法,因为spring已经帮你实例化好了,所以可以直接利用注解获取(JdbcTemplate的使用方法不过多说,网上有很多介绍,这里只取了查询说明)

最后,就可以随便调用这个Dao中的方法啦(可以通过@Resource注解获取Dao的实例)。

这里说一下mysql和Oracle的一些差异:

1)驱动

需要c3p0、connector等一些必要的jar包就不说了,这里的差异有,在IDEA的maven项目中,mysql的这些jar包可以通过maven直接获取,但是oracle由于商业原因,需要添加到maven的本地仓库才能获取(具体操作可见手动将本地jar包添加至maven仓库),其中可能遇到的问题有:

a)    cmd执行命令时提示mvn不是内部或外部命令

win10的path变量直接写maven安装的绝对路径

b)    cmd提示安装成功但是项目引用仍报错

系统默认安装到默认的maven仓库中,而你的项目使用的是自定义的maven仓库地址。修改安装的maven的conf/settings:将<localRepository>改为你自定义Respository的路径

c)  cmd提示安装成功Repository地址也正确但是项目引用仍报错

注意引用的groupId是否和安装时的一致,比如下图,有时会写com.oracle

2)查询语句的差别

Mysql:SELECT * FROM ammeter WHERE currentTime = "03:55"

所以程序中可以写成:String sql="select * from ammeter where currentTime = "+"?";

oracle:SELECT * FROM "ammeter" WHERE "currentTime" = '03:55'

所以程序中可以写成:String sql="select * from \"ammeter\" where \"currentTime\" = "+" ? "+ " ORDER BY \"tabNumber\" ";

3)Oracle中没序号自动递增的功能

三、客户端发送

1、将查询到的数据转化为Json格式

转化为Json有现成的方法,只要应用相关的jar包就行了,我是直接引用的JSONArray.fromObject的方法,不做过多表述,详情请见Json和java对象的互转

需要注意的一点是JsonArray的maven jar包使用的是jdk 1.5的

2、调用WebService发送数据(RPC方式)

这一块参考的调用WebService的三种方式,在此不做过多表述

引用jar包如下

四、关于web.xml的配置

由于整个项目用了Spring3,所以需要在web.xml里配置ContextLoaderListener。ContextLoaderListener的作用是在启动Web容器时,自动装配Spring applicationContext.xml的配置信息。如果applicationContext.xml文件没有在/WEB-INF/下,或文件名不一致,或存在多个Spring配置文件,需要搭配context-param进行修改applicationContent.xml的位置信息。而<listener>Listener 的作用非常类似于load-on-startup Servlet,用于在Web 应用启动时,启动某些后台程序,这些后台程序负责为系统运行提供支持。

        以上就是本次项目总结的一些点,第一次写项目的时候无从下手,这时候就学着把一个需求慢慢拆解,依次寻找突破口,慢慢就好解决了。其中由于基础尤其是spring不熟,踩了很多坑,也幸亏有导师的协助,因此把这次经验写下来,以作后续警示。总的来说写出程序成就感还是很高的,希望以后能成长为理想中的Java大神。

猜你喜欢

转载自blog.csdn.net/aliyacl/article/details/83573545