守护基于JVM的应用程序

部署体系结构设计是任何定制服务器端应用程序开发项目的重要组成部分。 由于其重要性,部署架构设计应尽早开始,并与其他开发活动一起进行。 部署体系结构设计的复杂性取决于许多方面,包括所提供服务的可伸缩性和可用性目标,部署过程以及系统体系结构的技术属性。

可服务性和操作问题,例如部署安全性,监视,备份/还原等,与部署体系结构设计的更广泛主题有关。 这些问题本质上是跨领域的,可能需要从服务推出过程到实际系统管理详细信息的不同层次上加以解决。

在系统管理详细信息级别,使用纯基于JVM的应用程序部署模型时(在类似Unix的平台上),经常会遇到以下挑战:

  • 如何安全关闭应用服务器或应用程序? 通常,使用侦听关闭请求的TCP侦听器线程。 如果您在同一主机上部署了同一应用服务器的许多实例,则有时很容易混淆这些实例并关闭错误的实例。 另外,您还必须防止未经授权访问关机监听器。
  • 创建与系统启动和关闭机制(例如Sys-V init,systemd,Upstart等)无缝集成的初始化脚本
  • 如果应用程序死了,如何自动重启?
  • 日志文件管理。 应用程序日志可以通过日志库进行管理(例如,旋转,压缩,删除)。 有时也可以使用日志库来管理应用服务器或平台日志,但有时可能需要与OS级工具(例如logrotate)集成。

对于这些问题,有两种解决方案可以使操作系统与应用程序/应用程序服务器之间的集成更加紧密。 一种广泛使用的通用解决方案是Java Service Wrapper 。 Java Service Wrapper擅长解决上述挑战,并根据专有许可发布。 还提供了基于GPL v2的社区许可选项。

Apache commons守护程序是另一个选择。 它的根源是Apache Tomcat,并且与应用服务器很好地集成在一起,但是它比这要通用得多。除了Java,commons守护程序还可以与其他基于JVM的语言(例如Scala)一起使用。 顾名思义,commons守护程序是Apache许可的。

Commons守护程序包括以下功能:

  • 如果它消失了,将自动重新启动JVM
  • 使用标准OS机制启用JVM进程的安全关闭(基于Tomcat TCP的关闭机制容易出错且不安全)
  • 重定向STDERR / STDOUT并设置JVM进程名称
  • 允许与OS初始化脚本机制集成(记录JVM进程pid)
  • 将JVM进程与父进程和控制台分离
  • 以减少的OS特权运行JVM和应用程序
  • 允许与OS工具(例如logrotate)协调日志文件管理(使用SIGUSR1信号重新打开日志文件)

部署Commons守护程序

从应用程序开发人员的角度来看,commons守护程序由两部分组成:用于启动应用程序的jsvc二进制文件和commons守护程序Java API。 在启动期间,jsvc二进制文件通过应用程序实现并由commons守护程序Java API定义的生命周期方法来引导应用程序。 Jsvc创建一个控制过程,以在异常终止时监视和重新启动应用程序。 这是与应用程序一起部署commons守护程序的概述:

  1. 在应用程序引导程序类中实现commons守护程序API生命周期方法(请参阅直接使用jsvc )。
  2. 编译并安装jsvc。 (请注意,通常不建议在生产或QA服务器上安装编译器工具链)。
  3. 将commons-daemon API放在应用程序类路径中
  4. 找出用于通过jsvc运行应用程序的命令行参数。 查看Tomcat发行版中的bin / daemon.sh以供参考。
  5. 根据上一步创建适当的初始化脚本。 可以通过软件包管理器在许多Linux发行版上安装Tomcat,该软件包通常附带一个初始化脚本,可用作参考。

实践经验

Tomcat发行版包括“ daemon.sh”,这是一个通用包装外壳脚本,可用作创建特定于系统的初始化脚本变体的基础。 我遇到的问题之一是包装脚本的调用者无法覆盖wait配置参数的默认值。 在某些情况下,Tomcat随机数生成器初始化可能会超过最大等待时间,从而导致初始化脚本报告失败,即使最终启动应用程序服务器也是如此。 现在似乎已解决此问题。

另一个问题是包装器脚本不允许传递带有空格的JVM参数。 例如,与JVM“ -XX:OnOutOfMemoryError”和co一起使用时,这可能很方便。 参数。 使用包装脚本是可选的,也可以轻松更改,但是由于它包含一些有用的功能,因此我宁愿重用而不是复制它,因此我创建了一个功能请求并为此#55104提出了一个小补丁。

在找出正确的命令行参数以使jsvc引导您的应用程序时,“-debug”参数对于进行故障排除非常有用。 另外,默认情况下,jsvc将工作目录更改为/,在这种情况下,绝对路径通常应与其他选项一起使用。 “ -cwd”选项可用于覆盖默认的工作目录值。

守护码头

除Tomcat外,Jetty是我经常使用的另一个servlet容器。 由于集成已经存在,因此将common守护程序与Tomcat结合使用不会带来任何挑战,因此,我决定了解一下如何在不支持现成的common守护程序的应用服务器上工作。

为了在Jetty中实现必要的更改,我克隆了Jetty源代码存储库,在Jetty bootstrap类中添加了jsvc生命周期方法,并构建了Jetty。 之后,我开始尝试使用jsvc命令行参数来引导Jetty。 Jetty附带了jetty.sh启动脚本,该脚本具有称为“ check”的选项,用于输出与安装相关的各种信息。 除其他外,它输出将与JVM一起使用的命令行参数。 这为jsvc命令行提供了一个很好的起点。

这些是我最终得到的命令行:

export JH=$HOME/jetty-9.2.2-SNAPSHOT
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
jsvc -debug -pidfile $JH/jetty.pid -outfile $JH/std.out -errfile $JH/std.err -Djetty.logs=$JH/logs -Djetty.home=$JH -Djetty.base=$JH -Djava.io.tmpdir=/var/folders/g6/zmr61rsj11q5zjmgf96rhvy0sm047k/T/ -classpath $JH/commons-daemon-1.0.15.jar:$JH/start.jar org.eclipse.jetty.start.Main jetty.state=$JH/jetty.state jetty-logging.xml jetty-started.xml

这可以用作适当的生产级初始化脚本的起点,以启动和关闭Jetty。

我在Jetty项目问题跟踪器中将我的代码更改作为问题#439672提交,并且刚刚得知更改已与上游代码库合并,因此您将来应该可以使用Apache commons守护程序jsvc来守护Jetty。盒子。

翻译自: https://www.javacodegeeks.com/2014/07/daemonizing-jvm-based-applications.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开篇

进入软件行业已有数日,但终归还算是新手。 对程序员有点好奇,所以选择这个职业,从现在开始希望能够记下自己从业当中的点点滴滴,同时希望自己也能够一直坚持下去。转载于:https://www.cnblogs.com/gaser/archive/2009/11/22/16082…

构造函数 基本使用

相关知识点&#xff1a; 构造函数、原型对象、实例对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta h…

2019CCPC网络预选赛 八道签到题题解

目录 2019中国大学生程序设计竞赛&#xff08;CCPC&#xff09; - 网络选拔赛6702 &6703 array6704 K-th occurrence6705 path6706 huntian oy6707 Shuffle Card6708 Windows Of CCPC6709 Fishing Master 2019中国大学生程序设计竞赛&#xff08;CCPC&#xff09; - 网络选…

深入理解表单脚本系列第一篇——表单对象

前面的话 javascript最初的一个应用就是分担服务器处理表单的责任&#xff0c;打破处处依赖服务器的局面。尽管目前的web和javascript已经有了长足的发展&#xff0c;但web表单的变化并不明显。由于web表单没有为许多常见任务提供现成的解决方法&#xff0c;很多开发人员不仅会…

stm32开发问题集锦

1 在flash中跑程序时&#xff0c;能进入中断&#xff0c;但在ram中跑时&#xff0c;进不了中断的原因。看以下的中断配置函数可以知道&#xff0c;要在ram中调试程序&#xff0c;需要定义VECT_TAB_RAM。定义方法a:在Project\Options for taget xxx 的对话框的c/c中定义宏VECT_T…

luoguP4213 【模板】杜教筛(Sum)杜教筛

链接 luogu 思路 为了做hdu来学杜教筛。 杜教筛模板题。 卡常数&#xff0c;我加了register居然跑到不到800ms。 太深了。 代码 // luogu-judger-enable-o2 #include <bits/stdc.h> #define ll long long using namespace std; const int _5000030; int vis[_],pri[_],cn…

深入理解脚本化CSS系列第二篇——查询计算样式

前面的话 元素的渲染结果是多个CSS样式博弈后的最终结果&#xff0c;这也是CSS中的C(cascade)层叠的含义。访问第一篇中的style属性只能获取行间样式&#xff0c;这通常来说&#xff0c;并不是我们想要的结果。本文将详细介绍如何查询计算样式 getComputedStyle() 元素的计算样…

创建自己的Java批注

如果您一直在用Java编程并且使用诸如Spring和Hibernate之类的任何流行框架&#xff0c;那么您应该对使用注释非常熟悉。 当使用现有框架时&#xff0c;其注释通常就足够了。 但是&#xff0c;您是否发现需要创建自己的注释&#xff1f; 不久之前&#xff0c;我找到了一个理由来…

浅谈MAXIMO项目实施(转)

浅谈MAXIMO项目实施工作以来&#xff0c;参与了XX公司的MAXIMO项目实施&#xff0c;妄谈一些工作中的感受和对MAXIMO的理解&#xff0c;欢迎砖头。[b]对MAXIMO的理解[/b]MAXIMO是老外的软件&#xff0c;是J2EE上架起的很成熟的平台级系统&#xff0c;其中融入了老外的管理方式和…

完整机器学习项目的流程

1 抽象成数学问题 明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情&#xff0c;胡乱尝试时间成本是非常高的。 这里的抽象成数学问题&#xff0c;指的明确我们可以获得什么样的数据&#xff0c;抽象出的问题&#xff0c;是一个分类还是回归或者…

使用Stream API的类Java产量

几种编程语言&#xff08;例如Ruby或Python等&#xff09;提供yield命令。 在内存消耗方面&#xff0c;Yield提供了一种有效的方式&#xff0c;可以通过按需生成值来创建一系列值。 有关Python产量的更多信息。 让我们考虑一个需要大量安全随机整数的类或方法。 经典方法是创建…

深入理解DOM节点类型第六篇——特性节点Attribute

前面的话 元素的特性在DOM中以Attr类型表示&#xff0c;从技术角度讲&#xff0c;特性是存在于元素的attributes属性中的节点。尽管特性是节点&#xff0c;但却不是DOM节点树的一部分。本文将详细介绍该部分内容 特征 特性节点的三个node属性————nodeType、nodeName、nodeV…

Vista,Windows7中给IIS7添加PHP支持

截止到发文时&#xff08;2009年9月25日&#xff09;&#xff0c;PHP是最新版本为5.3.0&#xff0c;但是5.3.0在IIS中的运行方式是FastCGI&#xff0c;要在Vista的IIS7上实现这一点我始终没弄成。最后我还是用的老方法&#xff0c;ISAPI&#xff0c;选用了一个5.3以前的版本&am…

python画手绘图

第一步&#xff1a;插入代码 #e17.1HandDrawPic.py from PIL import Image import numpy as np vec_el np.pi/2.2 # 光源的俯视角度&#xff0c;弧度值 vec_az np.pi/4. # 光源的方位角度&#xff0c;弧度值 depth 10. # (0-100) im Image.open(C:\\Users\\Thinkpad\\Deskt…

cf1208G Polygons 欧拉函数

链接 cf 给你两个正整数\(n\)和\(k\)&#xff0c;询问在一个圆上你最少需要几个点构才能造出\(k\)个边数小于等于\(n\)的正多边形 思路 深受迫害&#xff0c;所以写的详细一点&#xff0c;不会请留言。 性质1 考虑加进一个\(x\)边形。那么他的因子\(d\)一定在他之前加进来了. 因…

Java 8:功能性VS传统

业务逻辑是相同的&#xff1a; 给定一个由访问次数/时间组成的String表达式&#xff0c;例如&#xff1a;“ 1 / 24h&#xff0c;1..3 / 3h&#xff0c;5 / *” 然后&#xff0c;结果应为以下字符串列表&#xff1a; “ 1 / 24h”&#xff0c; “ 1 / 3h”&#xff0c;“ 2…

深入学习jQuery选择器系列第六篇——过滤选择器之状态选择器

前面的话 过滤选择器的内容非常多&#xff0c;本文介绍过滤选择器的最后一部分——状态选择器 焦点状态 :focus :focus选择器选择当前获得焦点的元素 <div><button>btn1</button><button>btn2</button><button>btn3</button></d…

aop 幂等验证(二)

1 创建IIdempotent Target({ElementType.PARAMETER, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented public interface IIdempotent { } 2 创建aop Component Aspect public class IdempotentAction {public final static String ERROR_REPEATSUBMIT &q…

pursuit of happiness

看的过程中&#xff0c;一直在看时间&#xff0c;只剩30分钟了&#xff0c;20分&#xff0c;15分了&#xff0c;主人公怎么还没发达。 因为那种痛苦&#xff0c;绝望&#xff0c;沮丧&#xff0c;真的可以隔着屏幕传递过来。 你会带着儿子住厕所么&#xff1f; 你会拼了老命赶时…

解读阿里巴巴集团的“大中台、小前台”组织战略

解读阿里巴巴集团的“大中台、小前台”组织战略 https://www.iyiou.com/p/92012.html 亿欧导读 ] 阿里的“中台战略” 不是一个简单的组织变革&#xff0c;还有业务变革、机制变革、技术架构变革的一次全面转型。 【编者按】阿里巴巴“大中台小前台”的中台战略的官方提法源自2…