我继承了为ATM Switch编写的重写Java项目。我已经在这个项目上工作了3.5个月,并尝试使用Discover Card测试认证申请。我并不熟悉并发(线程和接收队列器),但我认为我遇到了阻塞问题,无法找到纠正问题的方法。
以下是发生的情况:
在Eclipse DEBUG窗口中,我复制了THREADS的STACK,如果在DiscoverChannel-ReceiveQueuer-0 THREAD中阻止了在DiscoverChannel-ReceiveQueuer-1 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周,但找不到解决方案,可以真正使用一些帮助/方向。
答案 0 :(得分:1)
这里很难遵循您的架构,但一般来说,Java Web应用程序不应该生成线程或直接使用多线程独立应用程序。我建议重构Web应用程序,以便所有信用卡处理都在Java servlet中完成,而不是让它们来回运行到一个独立的应用程序。