Grails Quartz2作业随机停止

时间:2014-02-25 18:00:56

标签: grails quartz-scheduler

我遇到的情况是我的Grails应用中的某个作业在没有任何明确原因的情况下停止运行。没有异常抛出。我们使用的是Grails 2.2.3和Quartz2插件。有趣的是,所有其他工作继续运行;只有一个特定的工作一次又一次地冻结。此作业调用第三方REST API调用,有时会给出非常延迟的响应,并且在很少的实例中根本没有响应。所有工作都是 concurrent = false 。有人能指出我正确的方向吗?我一直在努力解决这个问题已经有两天了。我尝试过的事情很少:

  1. 更改/简化了作业处理任务的执行情况。该作业仍然进行REST API调用。响应时间非常长(最多20分钟),并且在较少的情况下我们会遇到ConnectionTimeOut异常。
  2. 启用石英测井。作业冻结,日志记录不会给出任何错误消息。
  3. 安装了Grails石英监视器插件。我们已将其内联并调整为使用Quartz2插件运行。它只显示了通常的石英/清单。
  4. 目前尚无法解决问题,现在已经没有想法了。是否有人遇到过这种情况并有一些提示可供分享。感谢。

    注意:现在我们已经删除了对第三方REST API的调用,这需要花费太长时间来查看作业是否在较长时间内正常运行。我猜服务器有时会杀死过程太长或经常超时的过程。

1 个答案:

答案 0 :(得分:0)

我们已经能够解决这个谜题。问题是,对其中一个第三方服务器的API调用没有得到最多40-50分钟的响应,之后服务器将超时并关闭连接。我们在每次运行中使用了多线程,并且由于某些“错误”实现,它没有给我们一个真正的' concurrent = false '行为;所以在某种程度上,我们有数以千计的开放式连接到这个第三方服务器,大多数请求都没有响应(40-50分钟)。这只是我们的猜测,过了一段时间这个特定的工作/调度程序冻结了。

我们找到了解决问题的两种方法:

  1. 使用我们的传出API请求实现更短的连接超时和读取超时。阅读连接超时读取超时 here之间的区别。这是我们写的代码:

    网址url =新网址(urlString)
    HttpURLConnection httpURLConnection =(HttpURLConnection)url.openConnection() httpURLConnection.setConnectTimeout(5 * 1000 * 60)
    httpURLConnection.setReadTimeout(8 * 1000 * 60)

  2. 我们能够成功测试的第二个解决方案是通过从Linux crontab实用程序调用我们的应用程序的操作/ URL来进行API调用。我们所做的是点击我们的应用程序中的特定URL,然后获取对第三方的API调用,这样我们就可以从我们的应用程序中删除整个石英调度程序/插件依赖项,即我们在此不使用石英调度程序案件。这种方法的唯一缺点是我们从应用程序代码库外部触发REST API调用。因此,如果我们对我们的应用程序进行WAR,将其部署在另一台机器上,我们也必须配置Linux crontab。

  3. 我们最终实现了第一个解决方案(连接/读取超时解决方案),因为它使解决方案保持了代码库本身(在crontab实用程序的情况下这是不可能的)。

    希望这可以帮助某人或给他们指点。