0

我继承了一个为 ATM 交换机编写的重写 Java 项目。我已经在这个项目上工作了 3.5 个月,并尝试使用 Discover Card 测试认证申请。我对并发(线程和接收队列)不太熟悉,但我认为我遇到了阻塞问题并且找不到解决问题的方法。

这是发生的情况:

  1. 我在我们的开发服务器(Windows 2003)上启动应用程序。
  2. 我通过 Discover 网站上名为 RCT 的 WEB APP 向我的应用程序提交了一条 ISO8583 消息 (0800) 用于动态密钥交换,并且消息处理正常。消息停止,每个 Eclipse 调试器的接收排队器和我的日志说它正在等待另一条消息。
  3. 密钥保存在 Discover Web 应用程序的内存中。
  4. 我将下一个 ISO8583 消息 (0200) 提交给我的应用程序,但我从未看到后续的 ISO8583 消息甚至击中我们的应用程序。
  5. 我可以看到后续消息通过 Wireshark 确认的特定端口上的线路出现,但它从未到达应用程序入口点。我在我会看到后续消息命中应用程序的位置设置了一个断点,但我从未到达断点。在 Eclipse 调试会话中,我看到 DiscoverChannel 线程正在运行以及 2 个接收队列线程也在运行。它们似乎已打开并准备好接收消息,但它再也没有到达应用程序。

在 Eclipse DEBUG 窗口中,我复制了 THREADS 的堆栈,如果在等待的 DiscoverChannel-ReceiveQueuer-1 线程中获取后续请求的问题被 DiscoverChannel-ReceiveQueuer-0 线程阻塞?这就是我阅读它的方式,但希望得到一些确认,或者如果错误,如何找到我的问题。

这是堆栈:

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 servlet 中完成,而不是让它们来回切换到独立的应用程序。

于 2013-07-11T17:55:44.860 回答