论坛首页 Java企业应用论坛

防止JAVA程序重复启动的一个另类解决办法

浏览 21683 次
该帖已经被评为精华帖
作者 正文
   发表时间: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
有个实现了。
0 请登录后投票
   发表时间:2006-12-08  
File lock 要指定文件路径,很局限,还是端口更全局一些。
0 请登录后投票
   发表时间:2006-12-08  
wdmsyf 写道
引用

Nirvana     1 小时前
我觉得利用文件来保存启动标记也可以,只是思路变换一下,打开后一个实例,强制关闭前一个:
启动实例时生成唯一标记,保存变量,写入文件,然后循环读取文件内容,判断是否与保存变量相等,不等则退出。
第二实例运行时因操作同一文件,必然会满足第一实例不等的条件,迫使第一实例关闭。

刚才做了个小实验,发现也可行。

我个人觉得Nirvana的方法不是很可行,你说在第二实例启动时,强制关闭第一实例,这存在两个问题:
1、如何做到从第二实例中关闭第一实例?
2、即使可以关闭第一实例,那第一实例中正在处理的数据咋办?而且这样强制关闭第一实例,感觉有点象病毒噢,呵呵!


1.如果觉得不清楚,补充一下:第二个实例运行时,改变了同一文件所记录的启动标记,而第一个实例始终循环读取文件进行比较,此时标记变量值与文件内容不等即关闭。
这个应该很简单的。

2.请问你非正常情况下退出时,数据是怎么处理的?难道都是随它去吗?
另外,我的这关闭,应该是正常退出,尚在程序可控制范围下。
扯病毒就太远了,倒是服务器端口经常被封的说。
0 请登录后投票
   发表时间:2006-12-08  
巧了.这个思路我N年前也用过.
http://www.mxjava.com/blog/article.asp?id=3

而且最近公司的项目中也用了这个思路.呵呵~~我们都在杭州哦!
0 请登录后投票
   发表时间:2006-12-08  
之前也碰到过类似的问题,这的确是一个比较好的方式。
0 请登录后投票
   发表时间:2006-12-08  
引用
hiswing     7 小时前

巧了.这个思路我N年前也用过.
http://www.mxjava.com/blog/article.asp?id=3

而且最近公司的项目中也用了这个思路.呵呵~~我们都在杭州哦!

hiswing:呵呵,与我心有戚戚焉,握个手先!  
0 请登录后投票
   发表时间:2006-12-08  
wdmsyf 写道
引用

Nirvana     1 小时前
我觉得利用文件来保存启动标记也可以,只是思路变换一下,打开后一个实例,强制关闭前一个:
启动实例时生成唯一标记,保存变量,写入文件,然后循环读取文件内容,判断是否与保存变量相等,不等则退出。
第二实例运行时因操作同一文件,必然会满足第一实例不等的条件,迫使第一实例关闭。

刚才做了个小实验,发现也可行。

我个人觉得Nirvana的方法不是很可行,你说在第二实例启动时,强制关闭第一实例,这存在两个问题:
1、如何做到从第二实例中关闭第一实例?
2、即使可以关闭第一实例,那第一实例中正在处理的数据咋办?而且这样强制关闭第一实例,感觉有点象病毒噢,呵呵!


我也倾向于通过锁定文件来保证java启动程序的唯一性,以前我写过一个这样的mini程序库。
关闭第一个实例是通过在程序中添加JMX接口,允许远程调用该接口来关闭程序,而不是执行kill -9这样的操作
来关闭。
0 请登录后投票
   发表时间:2006-12-09  
hiswing 写道
巧了.这个思路我N年前也用过.
http://www.mxjava.com/blog/article.asp?id=3

而且最近公司的项目中也用了这个思路.呵呵~~我们都在杭州哦!



看了你写的方法,但我有一点疑问,你在选择服务器端口时,采用的是自动增加的方法,这个方法没问题,但你在console类中,iPort = 50000。由于在不同的jvm下运行,这个Consonle客户端每次连接的都是端口50000,那么,Server中端口增加非但没有意义,反而会引起误操作。假如端口50000被其它程序占用,那么该程序还不能很好做到防止重复运行了。我想还是指定端口吧。望指教。
0 请登录后投票
   发表时间:2006-12-11  
http://www.matrix.org.cn/thread.shtml?topicId=2053&forumId=1&fid=1
0 请登录后投票
   发表时间:2006-12-11  
可以用访问记录。
定时记录访问时间到文件,
超时即为无程序运行或程序导常。
这样不是更容易些?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics