问题

所以过了几天,我可以回到我的Recaps小项目。 我从检查日志开始,发现了以下内容:

2012-03-04T01:52:51+00:00 heroku[web.1]: Idling
2012-03-04T01:52:53+00:00 heroku[web.1]: Stopping process with SIGTERM
2012-03-04T01:53:03+00:00 heroku[web.1]: Error R12 (Exit timeout) -> Process failed to exit within 10 seconds of SIGTERM
2012-03-04T01:53:03+00:00 heroku[web.1]: Stopping process with SIGKILL

我不知道您的想法,但是每当我在日志中看到“错误”时,我都会感到担忧。 因此,我决定删除该讨厌的行。 发生的事情令人不愉快。

解决方案

这似乎是一个简单的问题。 我首先找到了这个SIGTERM的全部含义。 我知道这是Linux信号,我只是想知道Heroku实际在做什么。 因此,基本上,有时候Heroku只是将SIGTERM发送到您的进程,以便可以正常关闭它。 这很简单。

正如我在上一篇文章中提到的那样,我决定使用Jetty代替Grizzly。 最初,我决定使用jetty-runner运行我的Web应用程序,它运行良好,在Jersey Servlet启动时对资源进行了扫描。 部署到Heroku也很容易,并且通过修改Procfile可以启动应用程序。

但是,该应用程序对SIGTERM的反应不正确,因此在不深入研究jetty-runner配置的情况下,我决定只使用嵌入式Jetty服务器。 这非常简单,运行领班启动可以使应用程序真正启动。 因此,无需进一步考虑,我便将更改后的应用程序部署到了Heroku。 为了检查错误是否再次出现,在第一次启动后,我只是重启了heroku并连接到另一个终端上的日志。 但是退出超时错误消息仍然存在。 我在这里的错误–我没有测试应用程序在使用工头时是否会正确退出。 再说一次,领班开始然后是ctrl + c只是为了看看会发生什么(后来我试过kill -s TERM procand得到了类似的输出):

pbu@pbudesk ~/recaps $ foreman start
21:57:27 web.1     | started with pid 9603
21:57:27 web.1     | 0    [main] INFO  org.eclipse.jetty.server.Server  - jetty-8.1.1.v20120215
21:57:27 web.1     | 110  [main] INFO  org.eclipse.jetty.webapp.StandardDescriptorProcessor  - NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
21:57:27 web.1     | 132  [main] INFO  org.eclipse.jetty.server.handler.ContextHandler  - started o.e.j.w.WebAppContext{/,file:/home/pbu/Devel/IdeaProjects/recaps/webmodule/src/main/webapp/},webmodule/src/main/webapp
21:57:27 web.1     | 133  [main] INFO  org.eclipse.jetty.server.handler.ContextHandler  - started o.e.j.w.WebAppContext{/,file:/home/pbu/Devel/IdeaProjects/recaps/webmodule/src/main/webapp/},webmodule/src/main/webapp
21:57:27 web.1     | 183  [main] INFO  org.eclipse.jetty.server.AbstractConnector  - Started SelectChannelConnector@0.0.0.0:5000
^CSIGINT received
21:57:57 system    | sending SIGTERM to all processes
21:57:57 system    | sending SIGTERM to pid 9603
21:57:57 web.1     | process terminated
pbu@pbudesk ~/recaps $

好的,因此当领班收到SIGINT时,它将SIGTERM发送到所有进程,很酷–也许Heroku测功机的行为相同。 不过,这并不是正常关机,但是Jetty的正常关机部分提到了两个不错的属性:gracefulShutdown和stopAtShutdown。 修改后的类如下所示:

public class Serve {public static void main(String[] args) throws Exception {int port = Integer.valueOf(System.getenv("PORT"));Server jetty = new Server(port);WebAppContext context = new WebAppContext();context.setContextPath("/");String webapp = "webmodule/src/main/webapp";context.setWar(webapp);context.setResourceBase(webapp);jetty.setHandler(context);jetty.setGracefulShutdown(1000);jetty.setStopAtShutdown(true);jetty.start();jetty.join();}
}

再次运行领班并使用ctrl + c证明此方法有效! 大!

pbu@pbudesk ~/recaps $ foreman start
22:11:47 web.1     | started with pid 9863
22:11:47 web.1     | 0    [main] INFO  org.eclipse.jetty.server.Server  - jetty-8.1.1.v20120215
22:11:47 web.1     | 110  [main] INFO  org.eclipse.jetty.webapp.StandardDescriptorProcessor  - NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
22:11:47 web.1     | 131  [main] INFO  org.eclipse.jetty.server.handler.ContextHandler  - started o.e.j.w.WebAppContext{/,file:/home/pbu/Devel/IdeaProjects/recaps/webmodule/src/main/webapp/},webmodule/src/main/webapp
22:11:47 web.1     | 132  [main] INFO  org.eclipse.jetty.server.handler.ContextHandler  - started o.e.j.w.WebAppContext{/,file:/home/pbu/Devel/IdeaProjects/recaps/webmodule/src/main/webapp/},webmodule/src/main/webapp
22:11:48 web.1     | 183  [main] INFO  org.eclipse.jetty.server.AbstractConnector  - Started SelectChannelConnector@0.0.0.0:5000
^C22:11:49 web.1     | 1969 [Thread-1] INFO  org.eclipse.jetty.server.Server  - Graceful shutdown SelectChannelConnector@0.0.0.0:5000
22:11:49 web.1     | 1970 [Thread-1] INFO  org.eclipse.jetty.server.Server  - Graceful shutdown o.e.j.w.WebAppContext{/,file:/home/pbu/Devel/IdeaProjects/recaps/webmodule/src/main/webapp/},webmodule/src/main/webapp
SIGINT received
22:11:49 system    | sending SIGTERM to all processes
22:11:49 system    | sending SIGTERM to pid 9863
22:11:50 web.1     | 2982 [Thread-1] INFO  org.eclipse.jetty.server.handler.ContextHandler  - stopped o.e.j.w.WebAppContext{/,file:/home/pbu/Devel/IdeaProjects/recaps/webmodule/src/main/webapp/},webmodule/src/main/webapp
22:11:50 web.1     | process terminated
pbu@pbudesk ~/recaps $
So off to deploy it to the cloud! Again, deploy, heroku restart and watch logs... but it doesn't work.

不同的方式

最初失败后,我尝试了另一种方法。 我发现您可以注册关闭钩子-非常简单。 为此,只需使用Runtime.getRuntime()。addShutdownHook(Thread)方法注册一个新线程:

public class Serve {public static void main(String[] args) throws Exception {Runtime.getRuntime().addShutdownHook(new Thread() {@Overridepublic void run() {System.out.println("Shutting down by shutdown hook");}});int port = Integer.valueOf(System.getenv("PORT"));Server jetty = new Server(port);WebAppContext context = new WebAppContext();context.setContextPath("/");String webapp = "webmodule/src/main/webapp";context.setWar(webapp);context.setResourceBase(webapp);jetty.setHandler(context);jetty.setGracefulShutdown(1000);jetty.setStopAtShutdown(true);jetty.start();jetty.join();}
}

用工头进行的最终测试证明它也可以工作,但是再次在Heroku上不起作用。

在这一点上,我不知道如何摆脱超时。 这不是很重要,我只是想检查我是否可以对此做出反应,但无济于事。 现在,我想我只想联系Heroku,也许他们会帮助您。 另一种选择是尝试嵌入式Tomcat,但可能稍后再尝试。 现在,我还有其他事情要做,例如查看Jelastic 。

参考: Heroku和Java –从新手到初学者,我们的JCG合作伙伴 Piotr Buda的第2部分 ,在Software Ramblings博客上。

翻译自: https://www.javacodegeeks.com/2013/05/heroku-and-java-from-newbie-to-beginner-part-2.html

Heroku和Java –从新手到初学者,第2部分相关推荐

  1. Heroku和Java –从新手到初学者,第1部分

    最近,我听说Heroku允许在Cedar堆栈中部署Java应用程序. 由于没有真正的软件构想,我决定尝试一下,仅将SOMETHING配置为可在Heroku上运行. 我对ReST有一些迷恋(我仍然想学习 ...

  2. java heroku_Heroku和Java –从新手到初学者,第1部分

    java heroku 最近,我听说Heroku允许在Cedar堆栈中部署Java应用程序. 由于没有真正的软件构想,我决定尝试一下,仅配置SOMETHING以在Heroku上运行. 我对ReST有所 ...

  3. java heroku_Heroku和Java –从新手到初学者,第2部分

    java heroku 问题 所以过了几天,我可以回到我的Recaps小项目. 我从检查日志开始,发现了以下内容: 2012-03-04T01:52:51+00:00 heroku[web.1]: I ...

  4. Java开发新手经常遇到的一些问题

    Java开发新手经常遇到的一些问题 A:java.lang.UnsupportedClassVersionError: Bad version number in .class file 解答:导致此 ...

  5. 尚学堂java培训_送给 Java 自学者或者初学者的最全知识清单,2020 年 Java 就该这么学...

    最近逛知乎,发现有很多想自学 Java 或者 Java 初学者提问,不知道如何学习 Java?我接触 Java 快 8 年的时间了,一直从事 Java 开发工作,自己一直升级打怪,对于如何更好的学习 ...

  6. c语言和java哪个有前途_C语言和Java哪个更适合初学者?

    目前,无论是从应用范围还是流行程度来看,C语言和Java都是当下最为火热的编程语言.想要零基础入门编程的学习者在一开始的学习中都会碰到这样的难题:C语言和Java哪个更适合初学者?的确,编程语言的选择 ...

  7. 深圳Java培训:Java行业新手如何适应工作?

    新手上路,注意避让!这Java行业新手上岗其实跟刚刚拿到驾驶证的新手一样,总要小心翼翼避免横冲直撞!那作为一个Java新手该如何尽快适应工作呢? 作为一个Java行业新手,在工作之前,首先要检查一下自 ...

  8. 给学习java web新手们的建议和推荐一些书籍

    经常有人问我新手应该看哪些书籍,怎么样才行学好J2EE.其实各人都各人的学习方法,一个人的不一定适合另一个人,我在这里就我的学习路径,给大家列举一下,希望能提供一些参考.(申明:这里我不谈首先学习什么 ...

  9. Java编程学习:初学者怎样学好Java

    零基础学生只要方法得当,完全可以掌握Java编程.这里也是我个人的学习经历下面总结出来的几点学习Java的方法,仅供大家参考. 1.理解Java思想 Java是一门面向对象编程语言.向对象编程是Jav ...

最新文章

  1. 开发笔记7 | 部署 Go 应用程序到阿里云 ECS
  2. hyperopt中文文档:Interfacing-With-Other-Languages(在其他语言中使用hyperopt)
  3. 为什么 select count(*) from t,在 InnoDB 引擎中比 MyISAM 慢?
  4. 图论--Floyd总结
  5. java 3number_java 数据Number、Math
  6. 从Java 11中删除的API
  7. 主分区、扩展分区和逻辑分区(转载)
  8. 小技巧 ----- 关于Java中的System.arraycopy()
  9. Pytorch有什么节省内存(显存)的小技巧?
  10. 斗鱼VS虎牙,谁才是直播之王?一文带你看看两家平台 的竞品报告
  11. 用计算机拜年祝福语,适合拜年发的朋友圈祝福语
  12. 清华社英语在线自动教程python版
  13. beyond compare怎么设置不比较文件修改时间?
  14. SWOT分析法——进行项目管理的高效方法
  15. Vue与Spring boot基于RSA非对称加密进行前后端交互
  16. springboot 分组校验和顺序校验
  17. 计算机科学技术想象作文,【精华】科技想象作文5篇
  18. Django连接mysql数据库步骤非常详细
  19. 2.8w即可拥有仿拼多多商城APP
  20. 成员介绍网页模板html,HTML5 CSS3 SVG团队成员介绍卡片页面模板

热门文章

  1. Linux 临时表空间满了,Temporary表空间100%解决方案
  2. 服务器 ha linux,Linux 高可用(HA)集群之Heartbeat详解
  3. HDU1231(最大连续子序列)
  4. 匿名内部类与Lambda表达式
  5. java-jar jvm_使用Java流和In-JVM-Memory的超低延迟查询
  6. graphql_GraphQL在Wildfly群上
  7. 众神进入瓦尔哈拉_一时冲动:“通往瓦尔哈拉之路的冒险”
  8. OCA第1部分中的Java难题
  9. java 挥发注解_Java的挥发性修饰符
  10. Spring Bean范围