我的编程空间,编程开发者的网络收藏夹
学习永远不晚

防止JAVA程序重复启动的解决办法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

防止JAVA程序重复启动的解决办法

防止JAVA程序重复启动的解决办法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

我们项目中有一个后台任务处理程序,是java开发application,用以处理网站提交的一些批量数据文件,因为这些数据文件数据量一般都比较大,所以写了这个批量处理程序,用以异步处理这些批量数据文件。这个程序设计成插件式的,处理各种不同数据文件的功能单独作为一个插件,然后使用Spring来粘合各个组件,这样就可以很方便地对该程序进行扩展。
       今天客户提出一个要求:需要控制这个程序在同一主机上只能启动一个实例。
       为了实现客户要求,我首先想到就是在数据库中建一张表,程序启动时往该表中写入一个标志,等程序结束时再删除标志。但这种方式存在一个问题就是,如果程序是非正常停止或被杀进程,那么这个标志就不可能被清除,那下一次启动就会误判为重复启动;另外,如果用数据库来记录启动标志的话,还把该程序跟数据库紧密耦合起来,感觉很别扭。
       排除了第一种方案之后,我以想到了用文件来保存启动标志(好象一些大型的程序,诸如weblogic好象就是采用在文件中记录启动标志方式来控制重复启动的)。客流量然这种方式不需要与数据库耦合在一起,但也存在程序异常中止而无法清除启动标志的问题,所以这个方案也被枪毙了。
       我想到的第三种方案就是在JAVA中调用操作系统的查看系统进程的方式来取得系统进程,然后再检测系统进程有特殊的进程标志来判断是否重复启动。但这种方式一是看起来很别扭,再者就是Window和 *nix系统中查看系统进程的命令不一样,分成几种情况来处理,无端地增加了程序的复杂性,也不可取。
       能不能在内存中记录一个启动标志呢?理论上这应该是不可行的,因为跨JVM来相互操作内存数据是不可能。我在网上搜了一下,也没找到相关的例子。
       那能不能占用一点系统共享资源,来换取我们的目标呢?比较容易想到的系统资源并且不能重复使用的资源就是端口。我尝试采用如下方案:在程序中指定一个不常用的端口(比如:12345),在程序启动时,就指定的端口启动一个ServerSocket,这个Socket只是为了占用这个端口,不接受任何网络连接。如果试图启动第二个实例时,程序在该指定端口启动ServerSocket时就会抛异常,这时我们就可以认为系统已经启动过了,然后打印提示并直接退出程序即可。这种方式在理论上分析应该可以的,我开始动手修改程序。程序修改如下:

java 代码

  1. package cn.com.pansky.xmdswz.application.scheduler;  

  2.  

  3. import org.apache.commons.logging.Log;  

  4. import org.apache.commons.logging.LogFactory;  

  5. import org.quartz.SchedulerException;  

  6. import org.quartz.impl.StdScheduler;  

  7. import org.springframework.beans.factory.BeanFactory;  

  8. import org.springframework.context.support.ClassPathXmlApplicationContext;  

  9. import cn.com.pansky.xmdswz.system.cache.CachedTableMgr;  

  10. import cn.com.pansky.xmdswz.system.config.SystemConfig;  

  11. import cn.com.pansky.xmdswz.utility.DateUtil;  

  12. import org.quartz.JobDetail;  

  13. import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;  

  14. import java.net.ServerSocket;  

  15. import java.io.*;  

  16.  

  17.  

  18. publicclass Scheduler {  

  19.  privatestatic Log log = LogFactory.getLog(Scheduler.class);  

  20.  

  21.  privatestatic ServerSocket srvSocket = null; //服务线程,用以控制服务器只启动一个实例  

  22.  

  23.  privatestaticfinalint srvPort = 12345;     //控制启动唯一实例的端口号,这个端口如果保存在配置文件中会更灵活  

  24.  

  25.    

  26.  privatestatic String CONFIG_FILE = "cn/com/pansky/xmdswz/application/scheduler/Scheduling-bean.xml";  

  27.  

  28.  

  29.  public Scheduler() {  

  30.    //检测系统是否只启动一个实例  

  31.    checkSingleInstance();  

  32.  

  33.    //下面读取Spring的配置文件  

  34.    SystemConfig cfg = new SystemConfig();  

  35.    String config = cfg.parseParam("SCHEDULER.CONFIG_FILE", false);  

  36.    if(config!=null && !"".equals( config.trim()))  

  37.      CONFIG_FILE = config;  

  38.    log.debug("CONFIG_FILE: "+CONFIG_FILE);  

  39.  }  

  40.  

  41.    

  42.  publicstaticvoid main(String[] args) throws Exception{  

  43.    Scheduler sch = new Scheduler();  

  44.    sch.execute();  

  45.  }  

  46.  

  47.    

  48.  publicvoid execute() {  

  49.    ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {CONFIG_FILE});  

  50.    BeanFactory factory = (BeanFactory) appContext;  

  51.  

  52.      

  53.    StdScheduler scheduler = (StdScheduler) factory.getBean("schedulerFactoryBean");  

  54.    //先暂停所有任务,等待装载缓存代码表  

  55.    try {  

  56.      scheduler.pauseAll();  

  57.    } catch (SchedulerException ex) {  

  58.      log.error("",ex);  

  59.    }  

  60.  

  61.      

  62.    CachedTableMgr cachedtableMgr = (CachedTableMgr) factory.getBean("cachedTableMgr");  

  63.    try {  

  64.      cachedtableMgr.loadCodeTable();  

  65.    } catch (Exception ex) {  

  66.      log.fatal("Load cached table failed. System will exit.", ex);  

  67.      System.exit(0);  

  68.    }  

  69.  

  70.    //重新恢复所有任务  

  71.    try {  

  72.      scheduler.resumeAll();  

  73.    } catch (SchedulerException ex) {  

  74.      log.error("",ex);  

  75.    }  

  76.  }  

  77.  

  78.    

  79.  protectedvoid checkSingleInstance() {  

  80.    try {  

  81.      srvSocket = new ServerSocket(srvPort); //启动一个ServerSocket,用以控制只启动一个实例  

  82.    } catch (IOException ex) {  

  83.      if(ex.getMessage().indexOf("Address already in use: JVM_Bind")>=0)  

  84.        System.out.println("在一台主机上同时只能启动一个进程(Only one instance allowed)。");  

  85.      log.fatal("", ex);  

  86.      System.exit(0);  

  87.    }  

  88.  }  

  89. }  

关于防止JAVA程序重复启动的解决办法问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

防止JAVA程序重复启动的解决办法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

防止JAVA程序重复启动的解决办法

防止JAVA程序重复启动的解决办法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我们项目中有一个后台任务处理程序,是java开发application,用以处理网站提交的一
2023-06-03

java开发中防止重复提交的几种解决方案

我们日常开发中有很多的应用场景都会遇到重复提交问题,下面这篇文章主要给大家介绍了关于java开发中防止重复提交的几种解决方案,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2022-11-13

win10计算机反复重启无法启动的解决方案教程

如何解决计算机重复无法打开的问题?许多朋友遇到了计算机重复的问题,但这可能是由于驱动不兼容或硬件问题造成的。今天,我们为您带来了计算机重复无法打开的解决方案。让我们一起学习。如何解决计算机反复重启无法打开机器的问题。1.驱动器不易重启,此时
2023-07-10

java无法启动该应用程序如何解决

有几种可能的解决方法可以尝试:1. 检查Java安装:确保已正确安装Java并且JAVA_HOME环境变量已设置。您可以在命令行中运行"java -version"来验证Java的安装情况。2. 检查应用程序的依赖项:某些Java应用程序可
2023-09-22

win7资源管理器老是自动重启的解决办法

最近有网友反馈电脑经常会出现每隔一段时间Windows资源管理器自动重启的情况,严重影响到的用户使用电脑,那么资源管理器老是重启是怎么回事,又该如何解决呢?下面本文将与大家分享下如何解决windows资源管理器重启。  windows资源管
2023-05-26

java: 程序包com.fasterxml.jackson.annotation不存在的解决办法

java程序包com.fasterxml.jackson.annotation缺失的解决办法包括:检查依赖关系,确保已添加com.fasterxml.jackson:jackson-annotations依赖项。导入正确的包,例如importcom.fasterxml.jackson.annotation.JsonProperty;更新Jackson版本,因旧版本可能存在此问题。检查类路径是否存在多个Jackson版本冲突。清除IDE缓存并重新构建项目。使用Maven中央存储库,确保依赖项可用。检查其他依
java: 程序包com.fasterxml.jackson.annotation不存在的解决办法
2024-04-02

win10应用程序添加到开机启动项的两种解决办法

在Windows10系统中,如果想让应用程序编程客栈在开机php之后自动运行起来,python可以怎么做呢?方法一: 1、首先创建应用程序的快捷方式 找到自己想加入开机启动项的应用程序,本文以iexplore为例,在iexplore应用程序
2023-06-16

Win7强制关机后突然无法重新启动的解决办法

电脑有时出现问题无编程法关机,有些用户会选择强制关机。但是Win7系统电脑被强制关机后无法启动了。强制关机对电脑损伤很大,突然就被停止运行。出现电脑强制关机编程后无法启动该如何解决呢?下面小编来跟大家分享两种解决电脑无法启动的方法。第一种方
2023-06-15

win10关机后电脑总是自动重启怎么办 win10电脑关机自动重启的解决方法

win10电脑关机自编程动重启的解决方法 修改设置1:依次点击编程客栈【开始菜单】--【设置】---【系统(显示、通知、php应用、电源)】--【电源和睡眠】--【其他电源设置】,如下图界面:在右边的菜单栏中,选择【选择电源按钮的功能】,如
2023-05-22

Win7打印机驱动程序无法安装的解决办法

在安装打印机驱动的时候,有时候我们遇到Win7系统打印机驱动程序无法安装的问题,其实主要是因为没有启动PrintSpooler服务。下面我们一起来看看Win7打印机驱动程序无法安装的解决办法1、先打开Windows7系统开始菜单。2、点击进
2023-06-09

Win7显示器驱动程序停止响应后恢复的解决方案

平时下班后,我们偶尔会看视频。玩游戏,但有时我们看视频。玩游戏时,显示器驱动程序已经停止响应并成功恢复。如果你不知道该如何处理Win7显示器驱动程序停止响应的问题,请阅读以下解决方案!1.重新安装或升级显卡驱动程序。1.运行驱动精灵软件,弹
2023-07-13

Android程序启动时出现黑屏问题的解决方法

本文实例讲述了Android程序启动时出现黑屏问题的解决方法。分享给大家供大家参考,具体如下: 关于黑屏: 默认的情况下,程序启动时,会有一个黑屏的时期,原因是,首个activity会加载一些数据,比如初始化列表数据、向服务器发送请求获取数
2022-06-06

windows无法打开此程序提示软件限制策略的阻止的解决办法

有用户反映在安装或打开程序,提示“由js于一个软件限制策略的阻止,Windows无法打开此程序.要获得更多信息,请打开事件查看器或与系统管理员联系。&rhttp://www.cppcns.comdquo;,这个问题可能是设置软件
2023-06-10

程序因为计算机中丢失msvcr110无法启动的解决方法

  mvcr110.dll是C+里文件之一,如果缺失了,将可能导致一些软件无法正常启动。而mvcr110.dll有可能是由于用户在清理系统垃圾的时候误删除了。如果此时出现无法启动此程序因为计算机中丢失msvcr110怎么办?  当出现这种情
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录