2

シナリオ

私はJavaアプリケーションを持っています(TCP / IPポートでリッスンするためにSpring Integrationを使用しています)。java.util.concurrent.Executors ファクトリで作成された ExecuterService でいくつかのワーカー スレッドを使用しています。メイン スレッドはワーカー スレッドを作成し、次のようなループで待機します。

while(!shutdownRequested)
{
    try {
         Thread.sleep(2000);
         } catch (InterruptedException e) {
           e.printStackTrace();
         }
}

実行サービスを停止し、タイムアウトの場合にシャットダウンを強制するシャットダウン フックがあります。

問題
このプログラムは私のマシン (Windows 7) で正常に終了しません。1 つのスレッドが tcp ポートでリッスンしたままになり、その後プロセスにアクセスできなくなります。タスク マネージャーからこのプロセスを強制終了できず、「アクセスが拒否されました」というエラーが表示されます。

興味深いことに、この問題は私のマシンでのみ発生し、他の Windows 7 マシンには影響しません。他のすべてのマシンでは、コンソールから Control-C を押すと、常にプログラムが正常に停止します。

過去に(同じアプリケーションで)この問題に直面しましたが、Windowsを再フォーマットして再インストールすると、魔法のように問題がなくなりました。(私はこれが少し多すぎることを知っています!!)

アプリケーションは何ヶ月も完全に機能しましたが、残念なことに、他の理由で最近コンピューターを再フォーマットする必要がありました。再フォーマット後、問題が再び発生しました。

このアプリケーションを再起動する必要があるたびにウィンドウを再起動する必要があるため、これは非常にイライラします。これは、ゾンビプロセスがそのポートでライトニングを行っているため、TCP ポートにバインドできないためです。

私のセットアップで何が間違っている可能性がありますか?

4

1 に答える 1

1

おそらく、ソケットをclose()する必要があります。これにより、ソケットが SocketException をスローするため、ブロッキングが停止します。

于 2012-12-01T15:17:21.867 に答える