制作windows服务(java)

前言

在之前我写了篇如何调用微信扫码支付接口的博客http://blog.csdn.net/qq_32574435/article/details/78952325,但是这个存在一个问题,就是在用户支付成功之后系统如何通知用户,说白了就是给用户一个反馈。人家给了钱你不管是网页自动跳转,还是发送支付成功的短信,总得通知人家,这样起码不会让用户担心我们是不是没收到钱,业务是否订购成功。对于支付成功之后的通知用户的方式,常见的就是当前网页跳转,不过我听说这个对服务器有一定的要求,然后我最终选择了制作一个windows服务的形式,不断去查询数据库,将满足条件的用户发送短信,比如说有个标志flag字段,当值为0时,发送短信,然后将值改为1。其实制作这个windows服务并不难,网上教程也很多,只不过我当时在这里花了好长的时间,所以我得把这个过程记下来,纪念一下自己跳过的坑。

开发语言:java
开发工具:eclipse
数据库:oralce
架构:spring + mybatis

实现过程

一、方案的选择
以下是我当时考虑的两种方案:

1、新建一个web项目,使用监听器的方法,web.xml中注册一个监听器,然后利用项目的启动调用监听器的初始化方法,去启动一个线程,这个线程的作用就是不断去查询数据库,然后将满足条件的用户发送成功短信。

2、新建一个普通的java maven项目,制作成windows服务,然后将项目制作成jar包,再将jar包制作成windows服务,随着服务器的启动去调用main方法启动线程,也是不断去查询数据库,然后将满足条件的用户发送成功短信。如果是部署到windows服务器的话,可以写成windows服务,如果是部署到linux服务器的话,建议写成一个定时任务。后面这个我没做过,请大家自行去百度。

第一个方案是我百度了好久,是我想用的方案,因为这些组成因素对于我来说还是比较熟悉的。不过后来这个方案被否决了,主要是听说当时web有个延迟的东西在里面,当然我也不是很理解,老大推荐我做成一个windows服务的形式,因为他说这个方案比方案一较好,而且制作windows服务是java程序员的必修课,最终,我选择了方案二。

二、开发流程

1、第一步当然是新建一个普通的java maven项目,注意不要是web项目。
2、架构的选择,我这里选择的是spring + mybatis 。
3、首先是配置mybatis,然后写curd的代码,这些都没啥好说的。然后就到了spring操作mybatis这个了,以前我一般是使用springmvc mybatis spring 这三个架构组合,然后使用注解的形式,按照依赖关系,比如说@Controller @Resource(name = “UserService”) dao 的方式来实现service 调用dao 。但是现在这个不是web项目,这个方法在这里不适用啊。然后我就想到了我之前测试mybatis的代码

public class TestMybatis {

    private ApplicationContext ctx = null;
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp() throws Exception {
        try {
            ctx = new ClassPathXmlApplicationContext("classpath:META-INF/spring/applicationContext.xml");
            sqlSessionFactory = (SqlSessionFactory)ctx.getBean("sqlSessionFactory");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    @Test
    public void testOneLevelCache() throws Exception {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        String account = "1827758888";
        String password = "700cac7c";
        User user = userMapper.findByAccount(account, password);
        System.out.println(user);
        sqlSession.close();*87
    }   
    }

我之前都是通过这样的单元测试来测试代码是否正常的,我将上面的代码简单改写之后(具体怎么写我也忘了),然后每次通过创建session会话的方式从而来实现对数据库的操作,但是当时被否决了。我用这种方式打成jar包,然后进入cmd ,到达你放jar包的路径,执行 java -jar xxx.jar 执行,发现是可以执行的,但是执行一段时间之后,就会报异常,好像是获取session失败还是获取bean失败(具体没记录下来),这么说这种方式应该是行不通的。(感兴趣的朋友可以探究下,然后给我留言分享)

后面我选用了下面获取bean这样的方式,一直执行,都未报错。
这里写图片描述

这里写图片描述

使用getBean的方式避开了每次都要创建session,也避免了运行一段时间产生异常情况。

4、写一个线程,使用死循环的方式,不断的执行代码
5、启动线程方式,main方法

public class SendMsgTask {

    public static void main(String[] args) {

        SendMsgThread  sendMsg = new SendMsgThread();
        sendMsg.start();
    }
}

6、接下来先将代码打成jar包,注意我这个是maven项目,大家可以参考下这个链接
http://blog.csdn.net/xiao__gui/article/details/47341385 写的很好,我是在pom.xml配置文件中配置,然后左键选中项目,然后右键 run as —— maven install ,如果项目正常的话,那么就会在target文件夹下生成你所需要的jar包(其实就是一些class文件)
这里写图片描述

图中箭头的sendmsgtask.jar就是你需要的jar包,有兴趣的朋友可以点开看看,里面就是class文件和maven的配置信息,然后旁边的sendmsgtask-sources.jar里面放置的是源文件java代码。
打成jar包的时候,建议大家复制出来,右键解压,点开文件夹查看文件是否齐全,有时候打包的时候会少了conf这个包,解决方法:选中当前项目——project——clean 重新编译项目在打包基本即可。

7、jar包测试
当你制作成jar的时候,个人建议是先用cmd运行这个jar包来查看是否正常,如果有问题的话控制台会打印输出信息,这样就可以排除,避免制作成windows服务太难排查问题。
自己新建个文件夹,将上图中的lib文件夹(运行需要的jar包)和sendmsgtask.jar放进去,也许你会问怎么知道复制出来的时候,lib的相对于sendmsgtask.jar路径,请看下面这个sendmsgtask.jar中maven的配置图
这里写图片描述
至于路径可以参考下图,我这里涉及到日志路径,所以测试的朋友可以先向我这样编写路径,到时候再将com/aotain/sendmsg/util/LogUtil.java输出日志路径改为自己的路径。
这里写图片描述

然后进入cmd 输入下图的命令 f: cd 到 jar包所需要的路径,然后执行java -jar sendmsgtask.jar ,如果一切正常的话,将会输出下面的日志信息。恭喜你,已经完成一半了,接下来是制作成windows服务了。
这里写图片描述

8、制作windows服务的工具选择
其实吧,我试过很多个制作windows服务的工具,不过也就只有一个成功了。不知道是工具不能实现还是我的操作不对,我在这个流程上面花了好多时间,搞得我都快疯了。
我一开始使用的是javaservice来制作,参考了下面的链接http://blog.csdn.net/sky1718/article/details/51103865但是不成功,好像提示启动失败。我当时也使用了一个另外一个工具prunsrv,有人介绍它是tomcat制作windows服务的,我当时想我终于要做出来了,心里有那么一点小窃喜。但是事与愿违,启动的时候报错 :服务已经安装,但是启动失败(英文大概意思),我当时还去查看了计算机的系统日志,也没给我多大线索,当时花了好多时间都做不出来,都开始怀疑人生了。
后来我使用了wrapper-windows-x86这个工具,在经过一段时间的捣鼓之后,终于成功了。

9、制作流程
其实这个教程网上有很多。下面有详细的教程。
第一步当然是下载工具:到官网https://wrapper.tanukisoftware.com/doc/english/download.jsp下载windows x86的社区免费版本。这里要说明下这个工具的分64位和32位,不过64位是收费版,他会先让你使用一段时间,然后证书过期之后,就会程序停止,我记得当时好像是每十五分钟服务会停止,然后让你手动去开启服务,这个在里面的配置文件也有说明。所以不管是64位还是32位的电脑,建议直接下载这个工具的32位的。
这里写图片描述
当然大家要是有积分的话也可以到这里下载http://download.csdn.net/download/love_smallbear/2166538,我用的就是这个。
其实准备好jar包和工具之后,只需要修改工具的配置文件即可,这里是制作的另外一个核心。我来详解一下。
至于制作流程参考的这个链接http://blog.csdn.net/xs_00/article/details/50818362里面写的太麻烦,其实你主要是看配置文件conf/wrapper.conf里面的参数解析即可
这里仅仅列出需要修改和需要注意的地方
8.1 找到wrapper.java.command=java
如果本机已配置了jre,那么此项不需更改;否则的话,需要将jre复制到myWindowServ文件夹路径下
(如和bin在 同一级,修改wrapper.java.command=../jre/bin/java.exe《注:这里需要将编译jar包jre安装文件全部拷贝过来。》)
8.2 指定wrapper的启动方式,用wrapper代理启动不容易出现问题,不然 老报test.Main不存在的异常。
wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main
修改成
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
8.3 将程序运行需要的jar包都列出来 lib文件夹中的wrapper.jar是必需的
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../application/myjar.jar
8.4 配置程序运行的所需要的内存大小
# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3
# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=64
修改成
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=256
这里是限制服务所占用的最小和最大内存,根据程序运行的效果也可以不改。
8.5 指定程序的主类
如 com.weiguo.mypro.TimerRun 是 myJar打包工程中main方法所在的类,
就需要如下配置:
wrapper.app.parameter.1=com.weiguo.mypro.TimerRun
以下的一些设置 就是服务本身的属性设置,可以 设置—控制面板–管理工具–服务–随便选中一个服务–右键属性看到。
8.6 控制台运行时的名称
wrapper.console.title=TestServer
8.7 指定服务的名称
wrapper.ntservice.name=TestServer
8.8 windows服务的显示名称
wrapper.ntservice.displayname=TestServer
8.9 服务描述
wrapper.ntservice.description=TestServer描述
8.10 启动模式,默认是自启动AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START
9 运行InstallApp-NT.bat安装服务,运行StartApp-NT.bat启动服务。
10 可以暂停,重启服务 停止服务 PauseApp-NT.bat ResumeApp-NT.bat StopApp-NT.bat
11 如果要卸载这个服务的话,运行UninstallApp-NT.bat卸载服务。

制作流程可以参考我的,简单粗暴有效
第一步:在f盘新建一个文件夹,取个名字,比如:sandmsgTest,再将wrapper-windows-x86-32-3.2.3.zip解压,将里面的lib bin conf logs 这个四个文件夹复制到sandmsgTest里面,在新增一个文件叫做application ,将你做好的jar包 sendmsgtask.jar放进application 这里,将你需要的jar包都放进lib文件夹,结果请看下图
这里写图片描述

这里写图片描述
当然这里jar包太多,我只截图了其中一部分

第二步,修改配置文件,重要
打开wrapper.conf配置文件,参考参数解释来修改成自己的信息
有两个细节要注意:一个是你这次需要的jar包,最好自己一个个手写进入,我试过用*表示,结果报错,请看下图
这里写图片描述
第二个细节,就是你如果对其中的参数修改,要生效的话,记得去掉前面的 # 注释符号,我当时就犯了修改没去掉注释符这个低级的错误,导致一直失败。检查没问题之后进入下一步

第三步,运行
你打开bin文件,然后看到里面的bat文件,
这里写图片描述
至于功能,百度下前面开头的单词即可,也可以自己改掉文件名字,不会影响功能,因为都是去读取配置文件来执行。
先执行安装命令InstallTestWrapper-NT.bat,没报错的话继续执行StartTestWrapper-NT.bat开启服务命令,如果双击出现无权限访问,建议右键以管理员权限运行即可。
如果一直都没报错,就可以点开我的电脑 ——右键管理——服务和应用程序——服务 来查找你启动的服务,如果一切正常,那么将会出现下图。
这里写图片描述

那么恭喜你,windows服务制作成,你可以定时查看下服务运行日志来看系统是否正常,如下图

这里写图片描述

结尾

其实这个并不难实现,百度上也有很多例子,不过有一些感觉是不靠谱的,这个是例子是我自己全程跑完正常的。所以在这里给大家一个参考的方向,少走弯路。

下面是我的maven项目,导入加上自己的配置即可,如果导入报错:Project build error: Non-resolvable parent POM: Failure to find
com.aotain:bms:pom:1.0.0 in http://repo.maven.apache.org/maven2 was
cached in the local repository, resolution will not be reattempted until the
update interval of central has elapsed or updates are forced and
‘parent.relativePath’ points at wrong local POM 这个其实我也不大懂怎么解决,如果有时间的话新建一个项目,然后将对应文件复制出来,或者有朋友成功解决了这个问题的麻烦给我留言,学习下。

源代码下载地址:
http://download.csdn.net/download/qq_32574435/10188032

猜你喜欢

转载自blog.csdn.net/qq_32574435/article/details/78963133