- 浏览: 1777590 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (723)
- IE 国际化 (1)
- java (310)
- python (52)
- Spring (101)
- eclipse (43)
- birt (10)
- exe4j (1)
- ActiveMQ (3)
- HornetQ (7)
- Ext (16)
- Linux (50)
- james (1)
- mail (3)
- 经验 (288)
- tomcat (5)
- Netty (3)
- ant (6)
- rsync (2)
- MD5 (3)
- 正则表达式 (3)
- 非技术 (59)
- mysql (28)
- sftp (1)
- Commons (2)
- oracle (3)
- vsftp (1)
- jdoc (1)
- socket (3)
- SEDA (2)
- UUID (1)
- quartz (7)
- javascript (50)
- sql (5)
- array (3)
- POI (3)
- redis (2)
- junit (4)
- 二维码 (1)
- jdk (8)
- h2 (6)
- maven (37)
- JVM (5)
- html (4)
- css (1)
- excel (4)
- myeclipse (2)
- scala (0)
- jQuery (5)
- log (10)
- slf4j (2)
- log4j (9)
- REST (15)
- guava (18)
- Joda-Time (7)
- ini4j (1)
- 配置文件 (2)
- lucene (1)
- database (3)
- curator (2)
- zookeeper (3)
- 并发 (2)
- jetty (6)
- ehcache (5)
- windows (1)
- protobuf (1)
- select2 (2)
- easyui (10)
- Freemarker (1)
- Filter (1)
- twisted (1)
- DateTime (11)
- mockrunner (1)
- DataSource (4)
- ajax (1)
- shell (18)
- powermockito (5)
- json (5)
- lombok (1)
- jointjs (1)
- cookie (1)
- mybatis (11)
- 加密解密 (2)
- 安全 (2)
- web (1)
- notepad++ (3)
- mac (48)
- sublime (14)
- git (7)
- docker (10)
- jar (1)
- gson (5)
- ubuntu (3)
- 模式 (1)
- neo4j (2)
- elasticsearch (1)
- OmniGranffle (1)
- ASCII (1)
- jdbc (3)
- kafka (1)
- MQ (1)
- chrome (3)
- 华为 (1)
- 路由器 (1)
- api (2)
- 架构 (1)
- 设计模式 (1)
- pip (4)
- springboot (48)
- 数据库 (4)
- thread (1)
- java.thread (1)
- sqlite (1)
- postman (1)
- springboot-actuator (2)
- jwt (1)
- token (1)
- brew (9)
- vim (1)
- virtualbox (1)
- Swagger (1)
- spring-retry (3)
- 调度 (1)
- item2 (5)
- graph (12)
- jgrapht (12)
- tuple (1)
- hadoop (5)
- curl (1)
- 算法 (3)
- Jekyll (1)
- github (1)
- ssh-keygen (1)
- zip (2)
- http (2)
- RestTemplate (8)
- 文件处理 (2)
- XStream (1)
- XML (3)
- JAXB (1)
- 笛卡尔积 (2)
- hive (1)
- 搜狗输入法 (1)
- 常用java类 (2)
- nginx (1)
- log4j2 (1)
- drawio (2)
- 安卓 (1)
- 小米 (1)
- okhttp (1)
- requests (1)
- 格式化 (2)
- MySQL Workbench (1)
- 分布式 (1)
- zip4j (1)
- hbase (5)
- hikari (1)
- javers (1)
- pydatetime (4)
- pyassert (1)
- pylog (2)
- tree (2)
- download (1)
- zeppelin (1)
- utils (2)
- wget (1)
- 鼠标 (1)
- 位运算 (2)
- open api (1)
- 域名 (1)
最新评论
-
youngcoder:
haohaohao~
Spring cache 注解功能不起作用的解决方案 -
kanpiaoxue:
lixz 写道有具体实例demo吗好多年前写的了。你还是去官网 ...
spring batch(一):基础部分 -
lixz:
有具体实例demo吗
spring batch(一):基础部分 -
BuDongOrz:
...
Spring MVC controller 读取配置文件 -
hvang1988:
理解错了,原来还是计数,不是时间
spring batch(二):核心部分(1):配置Spring batch
问题:【备注:发现java的NIO是平台相关的,目前只能在Windows上面实现文件锁,而Linux是不支持的。我正在寻找更好的解决办法,有解决方案的朋友,可以在这里留言。谢谢】
【备注:今天在网上找了一个开源的,防止程序启动多进程的jar包。地址: http://www.sauronsoftware.it/projects/junique/manual.php
用起来,很不错。我看了源码,也是nio的文件锁和Socket绑定端口号实现的。不过,他为了防止文件锁不起作用,下面接着用了socket占用端口号,来了一个双重保险。我也懒的自己写了,就用了他的。】
【目前没有好的办法。只能用占用端口号的解决方案】
以前一直在做WEB开发,对于后台程序不是很了解。现在做后台的部分系统开发,发现一个问题:java程序打成jar包之后进行运行,有时候因为人为的原因,会多次启动该jar运行程序。很多情况下,这是不允许的。为了解决java程序被启动多个进程,我找了一些资料,里面说的五花八门。有的说用数据库,有的说用文件写入一个标识。这些方法都可以防止程序被多次启动,但是存在一个很大的问题:如果程序的进程是被 kill 掉的,那么再次启动程序,就会发生问题,因为标志位没有被清空。所以这不是彻底解决问题的方法。
又开始找了一些资料,终于发现了不错的方案。下面给我现在使用的方案,利用Java NIO的文件锁(File Lock)来实现的。还有朋友用的是占用一个不经常用的端口,来实现,这也是一个不错的解决方案。占用端口号的方案,我在这里给出链接: http://sheng.iteye.com/blog/37732
这里是我写的文件锁的解决方案:
package com.concurrency.chapter1; import java.io.File; import java.io.FileWriter; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; /** * <pre> * with java NIO file lock to prevent starting more than on process * @author kanpiaoxue * @date 2012-02-02 * </pre> */ public class SingletonProgram { private static Logger logger = Logger.getLogger(SingletonProgram.class); private static final String PROGRAMA_NAME = "Singleton"; /** * @param args */ public static void main(String[] args) { String startMessage = "start " + PROGRAMA_NAME + " application"; logger.info(startMessage); lockSingletonProgramFile(PROGRAMA_NAME); try {// simulate running program ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(new Runnable() { @Override public void run() { logger.info("start to run test thread."); while (true) { try { long sleepTime = 10L; logger.info("run test thread successfully. It will sleep " + sleepTime + " seconds"); TimeUnit.SECONDS.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } } } }); exec.shutdown(); } catch (Exception ex) { ex.printStackTrace(); } logger.info(startMessage + " successfully!"); } /** * method destination : privent starting more than one program process in * system processes * * @param programName */ private static void lockSingletonProgramFile(String programName) { // java -DlockFile=D:\lock\tmplock\application.lock -jar // SingletonProgram.jar final String startFailureMessage = "Error:start " + programName + " application"; String lockFile = System.getProperty("lockFile"); logger.info("start " + programName + " application with [lockFile] : " + lockFile); if (null == lockFile) { lockFile = System.getProperty("user.dir") + File.separator + programName + ".lock"; logger.warn("does not provide lockFile, it will use default lockFile which is [" + lockFile + "]"); } RandomAccessFile raf = null; FileChannel fileChannel = null; FileLock flock = null; FileWriter writer = null; try { File file = new File(lockFile); if (!file.exists()) { String parent = file.getParent(); File folder = new File(parent); if (!folder.exists() || !folder.isDirectory()) { if (!folder.mkdirs()) { logger.error(startFailureMessage + " failure: create lock file folder failure:" + parent); System.exit(-1); } } if (!file.createNewFile()) { logger.error(startFailureMessage + " failure: create lock file failure:" + lockFile); System.exit(-1); } } writer = new FileWriter(file); writer.write(programName); /** * Here,we force flush data into lock file. If there already has a * process in system processes, it will catch Exception. */ writer.flush(); writer.close(); raf = new RandomAccessFile(file, "rw"); fileChannel = raf.getChannel(); flock = fileChannel.tryLock();// start to try locking lock file /** * <pre> * Note: * Here, at first time, you cann't release or close these resources. * If you do it, you will find that it cann't prevent more than one program process * running in system processes. * </pre> */ } catch (Exception e) { logger.error(startFailureMessage + " failure: lock file is [" + lockFile + "]:" + e.getMessage(), e); try { /** * <pre> * Note: * If you start program process failure, * you need to try releasing and closing these resources. * </pre> */ if (null != writer) { writer.close(); } if (null != flock) { flock.release(); } if (null != fileChannel) { fileChannel.close(); } if (null != raf) { raf.close(); } } catch (Exception ex) { logger.error( "Error: close resource failure:" + ex.getMessage(), ex); } logger.error("There is a " + programName + " application process in system processes. Now exit starting!"); System.exit(-1); } } }
- junique-1.0.4.zip (80 KB)
- 下载次数: 29
发表评论
-
swagger生成javaAPI的server&client代码
2021-03-25 11:05 947文章原文: 《Spring Boot: API ... -
springboot 返回JSON日期格式问题
2021-03-24 16:36 1112springboot返回的时间格式,根据版本的不同,可能返回 ... -
在其他项目中如何依赖一个springboot的jar?
2021-03-17 16:08 630资料:How to add a dependency ... -
指定java stream中并行处理的线程池大小
2021-03-04 11:38 1600Java8实战:并行线程池 写道 并行流内部使用了默认的F ... -
Can we disable the default web server in the Spring Boot application?
2021-02-22 11:07 278The major strong point in S ... -
Java 8 Comparator: How to Sort a List
2021-02-22 10:54 344文章地址: https://dzone.com/art ... -
Java Getter and Setter: Basics, Common Mistakes, and Best Practices
2021-02-22 10:19 512文章地址: https://dzone.com/ar ... -
Java String Format Examples
2021-02-22 10:14 313参考资料地址: 文章地址: https://dzo ... -
位运算&位掩码示例(权限)
2021-02-10 14:26 462参考资料地址: 1、https://juejin. ... -
Java 位移运算符
2021-02-08 16:21 417参考文章: 1、【 ... -
java中tree的应用示例:javax.swing.tree.DefaultMutableTreeNode
2021-02-03 15:03 497package org.kanpiaoxue. ... -
数据分页逻辑
2021-01-20 17:48 312//当前页 int intPage = I ... -
eclipse导入导出Snippets
2021-01-20 10:45 372导出: Display the snippets v ... -
eclipse迁移配置、插件(导出/导入快捷键、代码风格等等)
2021-01-20 10:28 774有的时候需要从一个eclipse导出它的所有配置,比如 ... -
eclipse需要的jdk版本查询
2021-01-18 11:38 502现在jdk的版本升级太快,eclipse的升级也 ... -
mac查看JAVA_HOME
2021-01-17 00:37 754在mac里面安装好java之后需要设置JAVA_HOM ... -
单例模式
2021-01-14 10:03 274参考资料: https://dzone.com/art ... -
计算工作日期的java工具类
2020-12-31 10:55 317import org.apache.common ... -
java的四舍五入
2020-12-30 11:59 466参考文章: https://www.cnblogs.c ... -
存储单位工具类(来自于hadoop)
2020-12-25 17:30 218/** * 存储单位工具类 * @ClassN ...
相关推荐
Java程序的启动界面是用户与应用程序交互的第一步,它通常包含程序图标、窗口标题、欢迎信息等元素。在Java中,我们可以使用Swing或JavaFX库来创建具有丰富图形界面的应用程序启动界面。本文将深入探讨如何利用这些...
《Java程序设计实用教程(第3版)》是一本针对初学者深入浅出的编程教材,旨在教授读者如何使用Java语言进行程序开发。本书通过丰富的例题和实践项目,帮助学习者逐步掌握Java的核心概念和技术。这个压缩包包含了书...
Java程序性能优化是Java开发中的重要环节,它旨在提高应用程序的运行效率,减少资源消耗,提升用户体验。在Java世界中,性能优化涵盖了多个层面,包括代码优化、内存管理、线程调度、数据库交互以及JVM参数调整等。...
9. **泛型**:Java的泛型用于创建可重复使用的类型安全的代码,防止在集合中存储不兼容类型的数据。例如,ArrayList使用泛型声明其元素类型,如ArrayList仅能存储字符串。 10. **接口与抽象类**:接口是完全抽象的...
Java程序设计中,TCP文件传输程序是一个常见的任务,它涉及到网络编程、IO流处理以及用户交互界面的设计。在这个项目中,我们使用了Java的核心库来实现客户端与服务器之间的文件交换,利用TCP(传输控制协议)作为...
- **Java Application**:独立运行的应用程序,可以直接在命令行或图形界面启动。 - **Java Applet**:嵌入到网页中的小程序,由浏览器中的Java插件解释执行。 每种类型的程序都有其特定的应用场景: - **Java ...
Java中的`java.lang.OutOfMemoryError`是一种常见的运行时错误,通常表示应用程序在尝试分配内存时遇到了问题。根据提供的信息,这个错误主要涉及到两个方面:`PermGen space`和`Java heap`,并且与Tomcat服务器相关...
《雍俊海JAVA程序设计教程》是一本针对初学者和进阶者的JAVA编程教材,它旨在帮助读者理解和掌握JAVA这门强大的面向对象编程语言。该教程的第二版更新了部分内容,适应了最新的JAVA开发环境和技术趋势。配合教材的...
Java多线程GUI摇奖程序是一种利用Java编程语言构建的图形用户界面(GUI)应用程序,它结合了多线程技术来实现抽奖或摇奖的功能。在这个程序中,多线程的运用确保了用户界面的流畅性和后台计算的独立性,避免了因耗时...
3. **忽略文件类型**:除了过滤文件类型,该工具还提供了忽略某些文件的能力,这可能是为了避开系统文件或特定的应用程序文件,以避免误删。忽略列表同样可以通过配置文件或代码参数进行设置。 4. **文件比较策略**...
Java在线聊天程序是一种基于C/S(Client/Server)架构的多线程应用程序,它允许用户通过网络进行实时通信。在本程序中,每个客户端都由一个独立的线程处理,这样可以确保即使多个用户同时发送消息,服务器也能高效地...
在IT行业中,小程序支付与Java后台的集成是移动应用开发中的常见需求,特别是在电商、服务预订等场景下。本文将详细解析小程序支付的过程以及Java后台如何支持这一功能。 小程序支付通常指的是微信小程序支付,它是...
在应用程序启动时初始化连接池,并配置最大连接数、超时时间等参数,从而优化数据库访问性能。 #### 6. Java中的异常处理 - **知识点概述**:异常处理是Java语言的一个重要特性,它可以帮助开发者捕捉并处理程序...
这种设计模式确保一个应用程序在同一时间只能有一个实例在运行,不允许用户启动第二个实例。这样的限制有助于避免资源浪费、数据冲突和其他潜在问题。以下是对这个主题的详细阐述: 1. **单实例应用程序的概念**: ...
这份"Java程序技术文档"集合提供了一系列关于Java编程的关键知识点,旨在帮助开发者深化理解并提升技能。 1. **基础概念** - **类与对象**:Java的核心是类,它是对象的蓝图。对象则是程序的基本构建块,它们封装...
《Java语言程序设计》作业答案是一份集合了个人整理的Java编程学习参考资料,主要针对Java初学者...以上内容涵盖了Java语言程序设计的主要知识点,通过深入学习和实践,你可以逐步掌握Java编程技能,并能解决实际问题。
这里列出的两个文件,一个是可执行文件(.exe),这通常是Windows系统下的应用程序。"平安信用卡风控征信室晚会抽奖系统.exe"可能是这个抽奖程序的主程序,由平安信用卡风控征信室开发,可能包含了一些特定的安全和...
Java程序设计是一种广泛应用于软件开发、移动应用、企业级系统以及互联网服务的语言。它以其“一次编写,到处运行”的特性,成为全球开发者的重要工具。本教程将深入探讨Java语言的核心概念,帮助初学者及进阶者全面...
在提供的压缩包文件“摇奖程序”中,应该包含了实现上述功能的源代码,通过阅读和分析这些代码,我们可以更深入地理解Java线程在实际应用中的使用方式。对于初学者来说,这是一个很好的学习实例,可以从中了解如何在...
- **Servlet与JSP**:用于构建动态Web应用程序的基础。 - **Spring框架**:用于简化企业级Java应用的开发,提供依赖注入和AOP等功能。 10. **Java开发工具**: - **IDEA**:IntelliJ IDEA是一款流行的Java集成...