锁定老帖子 主题:防止JAVA程序重复启动的一个另类解决办法
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-08
http://www.google.com/codesearch?hl=en&q=+lang:java+file+lock+show:c7KnypL3_Ww:Pv4m6pxQY3c:7XNnTPAzhY8&sa=N&cd=1&ct=rc&cs_p=svn://source.pentaho.org/svnroot/pentaho-reportdesigner/trunk&cs_f=src/org/pentaho/reportdesigner/lib/client/util/SingleApplicationLock.java#a0
SingleApplicationLock.java 有个实现了。 |
|
返回顶楼 | |
发表时间:2006-12-08
File lock 要指定文件路径,很局限,还是端口更全局一些。
|
|
返回顶楼 | |
发表时间:2006-12-08
wdmsyf 写道 引用 Nirvana 1 小时前 我觉得利用文件来保存启动标记也可以,只是思路变换一下,打开后一个实例,强制关闭前一个: 启动实例时生成唯一标记,保存变量,写入文件,然后循环读取文件内容,判断是否与保存变量相等,不等则退出。 第二实例运行时因操作同一文件,必然会满足第一实例不等的条件,迫使第一实例关闭。 刚才做了个小实验,发现也可行。 我个人觉得Nirvana的方法不是很可行,你说在第二实例启动时,强制关闭第一实例,这存在两个问题: 1、如何做到从第二实例中关闭第一实例? 2、即使可以关闭第一实例,那第一实例中正在处理的数据咋办?而且这样强制关闭第一实例,感觉有点象病毒噢,呵呵! 1.如果觉得不清楚,补充一下:第二个实例运行时,改变了同一文件所记录的启动标记,而第一个实例始终循环读取文件进行比较,此时标记变量值与文件内容不等即关闭。 这个应该很简单的。 2.请问你非正常情况下退出时,数据是怎么处理的?难道都是随它去吗? 另外,我的这关闭,应该是正常退出,尚在程序可控制范围下。 扯病毒就太远了,倒是服务器端口经常被封的说。 |
|
返回顶楼 | |
发表时间:2006-12-08
巧了.这个思路我N年前也用过.
http://www.mxjava.com/blog/article.asp?id=3 而且最近公司的项目中也用了这个思路.呵呵~~我们都在杭州哦! |
|
返回顶楼 | |
发表时间:2006-12-08
之前也碰到过类似的问题,这的确是一个比较好的方式。
|
|
返回顶楼 | |
发表时间:2006-12-08
引用 hiswing 7 小时前 巧了.这个思路我N年前也用过. http://www.mxjava.com/blog/article.asp?id=3 而且最近公司的项目中也用了这个思路.呵呵~~我们都在杭州哦! hiswing:呵呵,与我心有戚戚焉,握个手先! |
|
返回顶楼 | |
发表时间:2006-12-08
wdmsyf 写道 引用 Nirvana 1 小时前 我觉得利用文件来保存启动标记也可以,只是思路变换一下,打开后一个实例,强制关闭前一个: 启动实例时生成唯一标记,保存变量,写入文件,然后循环读取文件内容,判断是否与保存变量相等,不等则退出。 第二实例运行时因操作同一文件,必然会满足第一实例不等的条件,迫使第一实例关闭。 刚才做了个小实验,发现也可行。 我个人觉得Nirvana的方法不是很可行,你说在第二实例启动时,强制关闭第一实例,这存在两个问题: 1、如何做到从第二实例中关闭第一实例? 2、即使可以关闭第一实例,那第一实例中正在处理的数据咋办?而且这样强制关闭第一实例,感觉有点象病毒噢,呵呵! 我也倾向于通过锁定文件来保证java启动程序的唯一性,以前我写过一个这样的mini程序库。 关闭第一个实例是通过在程序中添加JMX接口,允许远程调用该接口来关闭程序,而不是执行kill -9这样的操作 来关闭。 |
|
返回顶楼 | |
发表时间:2006-12-09
hiswing 写道 巧了.这个思路我N年前也用过.
http://www.mxjava.com/blog/article.asp?id=3 而且最近公司的项目中也用了这个思路.呵呵~~我们都在杭州哦! 看了你写的方法,但我有一点疑问,你在选择服务器端口时,采用的是自动增加的方法,这个方法没问题,但你在console类中,iPort = 50000。由于在不同的jvm下运行,这个Consonle客户端每次连接的都是端口50000,那么,Server中端口增加非但没有意义,反而会引起误操作。假如端口50000被其它程序占用,那么该程序还不能很好做到防止重复运行了。我想还是指定端口吧。望指教。 |
|
返回顶楼 | |
发表时间:2006-12-11
|
|
返回顶楼 | |
发表时间:2006-12-11
可以用访问记录。
定时记录访问时间到文件, 超时即为无程序运行或程序导常。 这样不是更容易些? |
|
返回顶楼 | |