线程阻塞问题?

时间:2013-07-11 17:50:02

标签: java multithreading iso8583

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

以下是发生的情况:

  1. 我在开发服务器(Windows 2003)上启动应用程序。
  2. 我通过Discover网站上名为RCT的WEB APP向我的应用程序提交ISO8583消息(0800)以进行动态密钥交换,消息处理正常。消息停止,每个Eclipse调试器和我的日志的接收队列表示它正在等待另一条消息。
  3. 密钥保存在Discover网络应用程序的内存中。
  4. 我将下一个ISO8583消息(0200)提交给我的应用程序但我从未看到随后的ISO8583消息甚至打到我们的应用程序。
  5. 我可以看到后续消息在特定端口上使用Wireshark进行确认,但它从未进入应用程序入口点。我把断点放在我看到后续消息到达应用程序的位置,但我从未到达断点。在Eclipse调试会话中,我看到运行的DiscoverChannel线程以及运行的2个接收队列线程。它们似乎已经打开并准备好发送消息,但它再也无法到达应用程序。
  6. 在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周,但找不到解决方案,可以真正使用一些帮助/方向。

1 个答案:

答案 0 :(得分:1)

这里很难遵循您的架构,但一般来说,Java Web应用程序不应该生成线程或直接使用多线程独立应用程序。我建议重构Web应用程序,以便所有信用卡处理都在Java servlet中完成,而不是让它们来回运行到一个独立的应用程序。