我继承了一个为 ATM 交换机编写的重写 Java 项目。我已经在这个项目上工作了 3.5 个月,并尝试使用 Discover Card 测试认证申请。我对并发(线程和接收队列)不太熟悉,但我认为我遇到了阻塞问题并且找不到解决问题的方法。
这是发生的情况:
- 我在我们的开发服务器(Windows 2003)上启动应用程序。
- 我通过 Discover 网站上名为 RCT 的 WEB APP 向我的应用程序提交了一条 ISO8583 消息 (0800) 用于动态密钥交换,并且消息处理正常。消息停止,每个 Eclipse 调试器的接收排队器和我的日志说它正在等待另一条消息。
- 密钥保存在 Discover Web 应用程序的内存中。
- 我将下一个 ISO8583 消息 (0200) 提交给我的应用程序,但我从未看到后续的 ISO8583 消息甚至击中我们的应用程序。
- 我可以看到后续消息通过 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 周了,找不到解决方案,真的可以使用一些帮助/指导。