私は単純なServletContextListener
を持っています。これは、tomcatが起動するときにプロセスを実行し、tomcatがシャットダウンしたときにシャットダウンします。tomcat7によって生成されたプロセスは一時停止する
プロセス:
java -jar application.war -S rake jobs:work
それはキューを処理ルビーdelayed_job
労働者を生成します。しかし、多くの仕事を処理したり、仕事に時間がかかるときに問題が発生します。それは少数を処理し、それはちょうど停止します。エラーはスローされず、ログには何も記録されません。実行を停止します。
サーバを再起動すると、シャットダウン信号が送信されたエントリがログに記録されます。労働者が目を覚まし、仕事を終了し(実行中に一時停止した場合)、終了する。
私はtomcat7の外でこのコマンドを実行すると、正常に正常に動作します。
ServletContextListener
コード:
public class RakeServlet implements ServletContextListener
{
private Process workerProcess;
@Override
public void contextInitialized(ServletContextEvent event)
{
workerProcess = Runtime.getRuntime().exec("java -jar application.war -S rake jobs:work");
}
@Override
public void contextDestroyed(ServletContextEvent event)
{
workerProcess.destroy();
}
}
ps aux
出力:
tomcat7 2119 0.5 16.9 3479300 668704 ? Sl 02:20 2:41 java -jar application.war -S rake jobs:wor
tomcatからではなくコマンドラインから実行すると、処理が停止したときにコンソールに何が表示されますか? – Sam
@Samコマンドラインから実行すると処理が停止しない – Ruslan
申し訳ありませんが、もっと慎重に読むべきです。アプリケーションを使用する際に使用する出力ストリームを読み書きする必要がある可能性があります。そうしないと、アプリケーションがハングアップする可能性があります。あなたはwarファイルを直接ロードしてランタイムコールを避けるためにtomcatを使用できますか? – Sam