私は、ATM スイッチ用に書かれた、書き直された Java プロジェクトを継承しました。私はこのプロジェクトに 3.5 か月間取り組んでおり、Discover Card を使用してアプリケーションの認証をテストしようとしています。私は同時実行性 (スレッドと受信キューラー) に精通していませんが、ブロッキングの問題に遭遇したと思います。問題を修正する方法が見つかりません。
発生するシナリオは次のとおりです。
- 開発サーバー (Windows 2003) でアプリケーションを起動します。
- Discover Web サイトの RCT と呼ばれる WEB APP を介してアプリケーションに動的キー交換用の ISO8583 メッセージ (0800) を送信すると、メッセージは正常に処理されます。メッセージが停止し、Eclipse デバッガーごとの受信キューとログに、別のメッセージを待機していると表示されます。
- キーは、Discover Web アプリのメモリに保持されます。
- 次の ISO8583 メッセージ (0200) をアプリケーションに送信しますが、その後の ISO8583 メッセージがアプリケーションにヒットすることさえありません。
- 確認のために Wireshark を使用して特定のポートで後続のメッセージが送信されるのを確認できますが、アプリケーションのエントリ ポイントには到達しません。後続のメッセージがアプリケーションにヒットする場所にブレークポイントを設定しましたが、ブレークポイントに到達しません。Eclipse デバッグ セッションでは、DiscoverChannel スレッドが実行されているのに加えて、2 つの受信キュー スレッドも実行されていることがわかります。それらは開いていてメッセージの準備ができているように見えますが、やはりアプリケーションには到達しません。
Eclipse DEBUG ウィンドウで、スレッドのスタックをコピーしました。待機中の DiscoverChannel-ReceiveQueuer-1 THREAD で後続のリクエストを取得する際の問題が、DiscoverChannel-ReceiveQueuer-0 THREAD によってブロックされている場合は? それが私が読んでいる方法ですが、確認を取得したい、または間違っている場合は、問題を見つける方法を知りたいです。
スタックは次のとおりです。
Thread [DiscoverChannelThread ] (Suspended)
waiting for: Socket (id=82)
Object.wait(long) line: not available [native method]
Socket(Object).wait() line: 485
DiscoverChannel(SwitchChannel).run() line: 1931
Thread.run() line: 662
Thread [DiscoverChannel-ReceiveQueuer-1] (Suspended)
waiting for: DataInputStream (id=36)
DiscoverChannel(SwitchChannel).blockUntilGetMessageBytes(Request, ProcessingTimer) line: 672
DiscoverChannel(SwitchChannel).blockUntilReceiveMessage(ProcessingTimer) line: 1330
ReceiveQueuer.run() line: 96
Thread.run() line: 662
Thread [DiscoverChannel-ReceiveQueuer-0] (Suspended)
owns: BufferedInputStream (id=60)
owns: DataInputStream (id=36)
SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]
SocketInputStream.read(byte[], int, int) line: 129
BufferedInputStream.fill() line: 218 [local variables unavailable]
BufferedInputStream.read1(byte[], int, int) line: 258
BufferedInputStream.read(byte[], int, int) line: 317
DataInputStream.readFully(byte[], int, int) line: 178
DiscoverChannel(SwitchChannel).blockUntilGetMessageLength() line: 801
DiscoverChannel(SwitchChannel).blockUntilGetMessageBytes(Request, ProcessingTimer) line: 673
DiscoverChannel(SwitchChannel).blockUntilReceiveMessage(ProcessingTimer) line: 1330
ReceiveQueuer.run() line: 96
Thread.run() line: 662 [local variables unavailable]
この種の問題をデバッグする方法に関する提案/指示をいただければ幸いです。この会社の以前の開発者は、もはや質問することができません。私はこの特定の問題に 2 週間取り組んできましたが、解決策を見つけることができず、実際にヘルプ/指示を使用することができました.