0

私は、ATM スイッチ用に書かれた、書き直された Java プロジェクトを継承しました。私はこのプロジェクトに 3.5 か月間取り組んでおり、Discover Card を使用してアプリケーションの認証をテストしようとしています。私は同時実行性 (スレッドと受信キューラー) に精通していませんが、ブロッキングの問題に遭遇したと思います。問題を修正する方法が見つかりません。

発生するシナリオは次のとおりです。

  1. 開発サーバー (Windows 2003) でアプリケーションを起動します。
  2. Discover Web サイトの RCT と呼ばれる WEB APP を介してアプリケーションに動的キー交換用の ISO8583 メッセージ (0800) を送信すると、メッセージは正常に処理されます。メッセージが停止し、Eclipse デバッガーごとの受信キューとログに、別のメッセージを待機していると表示されます。
  3. キーは、Discover Web アプリのメモリに保持されます。
  4. 次の ISO8583 メッセージ (0200) をアプリケーションに送信しますが、その後の ISO8583 メッセージがアプリケーションにヒットすることさえありません。
  5. 確認のために 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 週間取り組んできましたが、解決策を見つけることができず、実際にヘルプ/指示を使用することができました.

4

1 に答える 1

1

ここでアーキテクチャに従うのは難しいですが、一般に、Java Web アプリはスレッドを生成したり、マルチスレッドのスタンドアロン アプリを直接操作したりすべきではありません。Web アプリをリファクタリングして、クレジット カード処理がすべて Java サーブレット内で行われるようにすることをお勧めします。

于 2013-07-11T17:55:44.860 に答える