锁定老帖子 主题:防止JAVA程序重复启动的一个另类解决办法
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-07
我们项目中有一个后台任务处理程序,是java开发application,用以处理网站提交的一些批量数据文件,因为这些数据文件数据量一般都比较大,所以写了这个批量处理程序,用以异步处理这些批量数据文件。这个程序设计成插件式的,处理各种不同数据文件的功能单独作为一个插件,然后使用Spring来粘合各个组件,这样就可以很方便地对该程序进行扩展。 java 代码
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-07
很另类的方式,提供了一个不错的思路。在没有特殊要求的情况下,这样解决很不错
|
|
返回顶楼 | |
发表时间:2006-12-07
其实 监听同一个端口还是很常用的方法,比如 Azureus(开源Java BT 客户端) 就是这样。
另一个常用的方法是像 Eclipse 的 workspace 一样。用 RandomAccessFile 把 File 的写 锁定掉 |
|
返回顶楼 | |
发表时间:2006-12-07
确实是很不错的一个方法, 绝大部分服务器系统上, 端口相对来说还是比较cheap的.
这个问题经典的跨平台解决方法是建一个命名的系统互斥量, 它的生命周期也是跟着进程的. 不过Java平台不倾向于提供直接操作宿主系统资源的途径, 自己也是以虚拟机为全部逻辑环境, 不提供宿主系统范围的Inter-JVM-Communication机制. 用端口绑定方式来实现互斥确实有点另类, 不过对于纯Java应用来说不失为最佳的解决方案. 另可以有一点改进的地方, 就是绑定到 InetAddress.getLocalHost() 这个本机地址(在大多数OS上相当于127.0.0.1), 这样进一步不会占用服务器外部ip上的端口. 不过一般的服务器上服务进程通常也不指定具体外部地址, 而是绑定到所有本机地址的端口, 即便这样改过以后还是会影响他们的启动. 所以这个改进除非在很大型的系统上, 服务应用各自指定具体的外部地址去绑定时才有作用. |
|
返回顶楼 | |
发表时间:2006-12-07
引用 complystill 20 分钟前 确实是很不错的一个方法, 绝大部分服务器系统上, 端口相对来说还是比较cheap的. 这个问题经典的跨平台解决方法是建一个命名的系统互斥量, 它的生命周期也是跟着进程的. 不过Java平台不倾向于提供直接操作宿主系统资源的途径, 自己也是以虚拟机为全部逻辑环境, 不提供宿主系统范围的Inter-JVM-Communication机制. 用端口绑定方式来实现互斥确实有点另类, 不过对于纯Java应用来说不失为最佳的解决方案. 另可以有一点改进的地方, 就是绑定到 InetAddress.getLocalHost() 这个本机地址(在大多数OS上相当于127.0.0.1), 这样进一步不会占用服务器外部ip上的端口. 不过一般的服务器上服务进程通常也不指定具体外部地址, 而是绑定到所有本机地址的端口, 即便这样改过以后还是会影响他们的启动. 所以这个改进除非在很大型的系统上, 服务应用各自指定具体的外部地址去绑定时才有作用. 谢谢各位的回复,特别是complystill和Sunteya 给我开扩了思路。 我得到的回报比我给出的多得多啊!! |
|
返回顶楼 | |
发表时间:2006-12-07
我觉得利用文件来保存启动标记也可以,只是思路变换一下,打开后一个实例,强制关闭前一个:
启动实例时生成唯一标记,保存变量,写入文件,然后循环读取文件内容,判断是否与保存变量相等,不等则退出。 第二实例运行时因操作同一文件,必然会满足第一实例不等的条件,迫使第一实例关闭。 刚才做了个小实验,发现也可行。 |
|
返回顶楼 | |
发表时间:2006-12-07
引用 Nirvana 1 小时前 我觉得利用文件来保存启动标记也可以,只是思路变换一下,打开后一个实例,强制关闭前一个: 启动实例时生成唯一标记,保存变量,写入文件,然后循环读取文件内容,判断是否与保存变量相等,不等则退出。 第二实例运行时因操作同一文件,必然会满足第一实例不等的条件,迫使第一实例关闭。 刚才做了个小实验,发现也可行。 我个人觉得Nirvana的方法不是很可行,你说在第二实例启动时,强制关闭第一实例,这存在两个问题: 1、如何做到从第二实例中关闭第一实例? 2、即使可以关闭第一实例,那第一实例中正在处理的数据咋办?而且这样强制关闭第一实例,感觉有点象病毒噢,呵呵! |
|
返回顶楼 | |
发表时间:2006-12-07
C/C++里最常规的解决方案还是用Mutex,不过这个咚咚不知道在java里有没有。
|
|
返回顶楼 | |
发表时间:2006-12-08
Eclipse启动似乎是通过文件来判断的,
还有Java Logging API也会产生一个.lck文件, 可不可以通过标志文件的存取权限来判断? 试试看去,10分钟后回来。 |
|
返回顶楼 | |
发表时间:2006-12-08
http://www.google.com/codesearch?hl=en&q=+lang:java+file+Open+full+occupied+show:07RRbObTL2o:DFnXDE8Qjvw:dkG5HqoyK5Y&sa=N&cd=8&ct=rc&cs_p=:pserver:anonymous%40hsqldb.cvs.sourceforge.net:/cvsroot/hsqldb+hsqldb-dev3&cs_f=src/org/hsqldb/persist/NIOLockFile.java#a0
似乎有关,接着试 |
|
返回顶楼 | |