jvm虚拟机 基于栈_守护基于JVM的应用程序

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. 根据上一步创建适当的初始化脚本。 Tomcat可以通过程序包管理器安装在许多Linux发行版上,并且该程序包通常带有一个可用作参考的初始化脚本。

实践经验

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

jvm虚拟机 基于栈

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

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

相关文章

ListView中让TextView中的文字进行单独滚动

TextView不能在ListeView中单独的滚动原因 默认ListView将会拦截MOVE事件向下传递 参见源码 case MotionEvent.ACTION_MOVE: {switch (mTouchMode) {case TOUCH_MODE_DOWN:int pointerIndex ev.findPointerIndex(mActivePointerId);if (pointerIndex -1) {pointerIndex 0;…

JPA @Embeddable和@Embedded

介绍: 作为一个面向对象的开发人员,我们希望避免使用带有大量不相关字段的大型类。 因此,我们可能经常感到有必要使用多个对象来表示JPA实体。 在本快速教程中,我们将学习如何使用JPA或Hibernate中的Embedded和Embeddable注释来实…

android monitor不能查看/data目录

问题 在android 7.0虚拟机上不能查看/data目录 解决 1. 修改目录权限 开始->cmd->adb shell->chmod -R 777 /data 2. root虚拟机 先执行 adb root,再执行 adb remount 出现remount succeeded表示可以了

Sqlite error- INSERT failed: datatype mismatch

问题 sqlite3 使用.import命令导入输入出现error-INSERT failed: datatype mismatch 原因 文件字段的默认分隔符为“|”,而从excel转换的.csv文件默认为逗号,所以导致文件解析出错,进而 “数据类型不匹配” 解决 在.import命令前修改分隔…

反射-获取java私有内部类反射类型、私有字段

获取JAVA私有内部类反射类型 方式一 Class.forName(“外部类完整路径$内部私有类类名”); 方式二 通过获取对应私有内部类的字段而获取 完整的类名 Class.forName(field.getType().getName()) 获取JAVA私有字段 Class.forName(“类完整路径”).getDelcaredField(“字段名…

javafx透明边框_JavaFX技巧6:使用透明颜色

javafx透明边框为用户界面元素选择正确的颜色始终是一个很大的挑战,但是当您开发可重用的框架控件时,开发人员就无法控制使用它们的应用程序的外观和感觉,这甚至更具挑战性。 尽管您可能总是将元素添加到默认的灰色背景之上,但是嵌…

android-创建sdcard

进入sdk 安装路径 tools目录下 mksdcard 100M D:\dxfSDCard.img //创建一个100M的sdcard

Apache Ivy 2.5.0发布

本周,我们发布了Apache Ivy的 2.5.0版本。 Apache Ivy是与Apache Ant构建工具集成的构建依赖项管理器。 可以照常从https://ant.apache.org/ivy/download.cgi下载该下载。 该2.5.0版本是在Ivy发行版中存在很大差距之后发布的。 2.4.0于2014年12月26日发布。此后&am…

android: a system image must be selected to continmue

问题:如题 原因: 没有对应的镜像文件 解决 android studio 进入setting -> appearance behavior -> system setting -> android sdk 下载对应的镜像文件即可

win10 更新 英特尔显示器音频 后显示器音箱没有声音

问题 如题,win10系统更新后显示器音箱没有声音,且右击桌面声音查看播放设备 (说明:这是在解决问题之后截的图,没解决前,只有一个“扬声器/听筒”,原先是存在BenQ LCD的) 解决过…

unity ppr_智能自动PPR更改事件策略

unity pprADF开发人员普遍认为,将迭代器绑定更改事件策略设置为ppr在性能方面不是一件好事,因为此策略会强制框架刷新每个请求上绑定到此迭代器的所有属性绑定。 这不是真的! 框架仅刷新在请求期间已更改的属性和依赖于已更改属性的属性。 …

onenote创建快速笔记--此分区尚不可用,它是从其他设备添加的,该设备同步后才将可用

问题如题 解决 【文件】→【选项】->【保存和备份】 ->【修改】-> 选择新的分区存放快速笔记 图文并茂请参见:https://blog.sina.com.cn/s/blog_7012320d0102wsmw.html 其他: 同步不能连接服务器 解决该问题时,出现同步不成功&…

用Java匹配模式

如果您使用的是Java,那么您之前很有可能会看到其模式匹配。 String#matches(String)方法在内部使用Pattern类型,该类型包含更复杂的功能: 通过编译正则表达式来创建Pattern 。 该模式与任何输入字符串匹配,并且可以选择查找捕获组…

gradle-com.android.build.api.transform.TransformException:Error while generating the main dex list

问题 What went wrong: Execution failed for task >’:app:transformClassesWithMultidexlistForYm10000016Release’. com.android.build.api.transform.TransformException: Error while generating the main dex list. 原因 MultiDex未做初始化 解决 在application的…

Devc++- 源文件未编译”

问题:如题 解决: 删除D:\Software\DEV-CPP\Libexec\gcc\mingw32\3.4.2\目录中的collect2.exe(最好修改名称或备份一下)

如何构建一个Maven插件

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 由于其插件生态系统的普及,Apache Maven仍然是Java领域中最流行的构建工具。 很容易找到一个现有的插件来…

devc++ 运行时黑屏一闪而过

解决 return 0;前 写getchar();或者 system("pause");

java word批注_创建自己的Java批注

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

东芝硬盘插入台式机后滴滴响

问题:如题 个人解决: 插入到主机背后的USB接口,前置的USB可能供电不足

使用JUnit 5进行Spring Boot测试

JUnit 5 (JUnit Jupiter)已经存在了相当长的一段时间,并且配备了许多功能。 但令人意外JUnit 5它不是一个默认的测试库相关,当涉及到春节开机测试入门:它仍然是JUnit 4.12 ,在2014年发布了回来,…