2 つのアプリケーションがあり、どちらも Java で記述されています。1 つ目は単純なローダー/モニターです。リモート サイトにある 2 つ目のアプリケーションの更新をチェックし、利用可能な場合はダウンロードしてから、 を使用して 2 つ目のアプリケーションを起動しますRuntime.getRuntime().exec("javaw -jar MyApp.jar", null, new File("C:\MyWorkingDir"))
。次に、最初のアプリがそこに座って、2 番目のアプリが実行されていることを定期的に確認し (Sigar を使用)、停止した場合は再起動します。1 時間ごとに更新をチェックし続け、存在する場合は 2 番目のアプリケーションを強制終了し、ファイルを更新して再起動します。
2 番目のアプリケーションは、再び Sigar を使用して、システムのさまざまな側面を監視した後、マネージャーとの間で SNMP メッセージを送受信します。また、リモート サーバー上の最初のアプリケーションの更新を定期的に確認し、利用可能な場合はダウンロードして更新します。
2 つ目のアプリケーションを ( を使用してjavaw -jar MyApp.jar
) 単独で起動すると、アプリケーションは正常に動作します。
最初のアプリケーションを (を使用して) 起動すると、次javaw -jar MyLauncher.jar
の 2 つのいずれかが発生します。私の開発マシンでは問題なく動作します。私がテストした他のすべてのサーバーでは、2番目はこれまでのところ、20分から2時間待機してから続行しました. 最初のアプリケーションを強制終了すると、2 番目のアプリケーションはすぐに通常どおり続行されます。
ストールの原因となる特定のコードはありません。ログは、異なる実行および異なるマシンの異なる場所で発生することを示しています。場合によっては、log4j への 2 つの連続した呼び出しの間に発生することがあります。たとえば、失速した場所の 1 つは次のとおりです。
public static void Start(AgentConfig config) {
LogHelper.Log("Starting SNMP Listener on udp:127.0.0.1/" + config.get_listenerServerPort());
try {
LogHelper.Log("Creating address");
UdpAddress udpAddress = new UdpAddress("127.0.0.1/" + config.get_listenerServerPort());
<snipped for brevity>
} catch (Exception e) {
LogHelper.Error(e);
}
「待機モード」になると、ログに次のように表示されます。
500 [main] INFO root - Starting SNMP Listener on udp:127.0.0.1/163
7199578 [main] INFO root - Creating address
そのため、try ブロックに入る際に問題が発生しているように見えますが、(7199578-500)ms = 7199s = ほぼ正確に 2 時間後、これらを乗り越えてとにかく続行できます。
これらのプロジェクトのコードは 4 つのプロジェクトに分割されています。これらは、他の 3 つのプロジェクト (ロギング ヘルパーを含む) で使用される共通のルーチンです。ファイル アップデーター (他の 2 つによって使用されます)。2 つの主要なアプリケーションのそれぞれのメイン コード。必要なプロジェクトを Eclipse のビルド パスのプロジェクト セクションに追加することと、それぞれの jar をビルドすることの両方を試みました。どちらの場合も違いはありません。各プロジェクトは log4j を使用し、ファイル アップデーターは commons-net-3-3 を使用し、両方のメイン アプリは Sigar を使用し、プライマリ SNMP アプリケーションは snmp4j を使用します。
開発マシン (Win7 Pro 64 ビット) に JDK SE 7u25、サーバー (Win2003 Server R2 32 ビット) に JRE SE 7u25 をインストールしました。
Java は私の主要な開発環境ではありません。また、問題の定義がかなりあいまいなため、他に指針を見つけることができませんでした。
何か案は?