2013-07-11 116 views
0

我继承了为ATM交换机编写的重写Java项目。我一直在为这个项目工作3.5个月,并试图用Discover卡测试应用程序的认证。我并不熟悉并发(线程和接收队列),但我认为我遇到了阻塞问题,无法找到解决问题的方法。线程阻塞问题?

这里是什么发生的场景:

  1. 我开始我们的开发服务器(Windows 2003)上的应用程序。
  2. 我通过Discover网站上名为RCT的WEB应用程序向我的应用程序提交ISO8583消息(0800),以便消息处理正常。消息停止并且每个Eclipse调试器都接收到队列,我的日志说它正在等待另一条消息。
  3. 钥匙放在Discover web应用程序的内存中。
  4. 我向我的应用程序提交下一个ISO8583消息(0200),但是我从来没有看到随后的ISO8583消息甚至打我们的应用程序。
  5. 我可以看到使用Wireshark进行确认的特定端口上的后续消息,但它永远不会进入应用程序入口点。我在后面的消息点击应用程序的位置放了一个断点,但我从未到达断点。在Eclipse调试会话中,我看到正在运行的DiscoverChannel线程以及正在运行的2个接收队列线程。他们似乎是开放的,并且已经准备好接受消息,但它再也没有到达应用程序。

在我复制的线程,如果问题的STACK与得到在正在等待被阻止由DiscoverChannel-ReceiveQueuer-0 THREAD DiscoverChannel-ReceiveQueuer-1 THREAD的后续请求Eclipse调试窗口?这就是我正在阅读的内容,但希望得到一些确认或错误的,如何找到我的问题。

这里是堆栈:

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

我编辑了我的原始邮件,如下所示将其暂时搁置。我的信息如何被修改?谢谢 – Melinda

回答

1

在这里很难遵循你的架构,但是通常Java Web应用程序不应该产生线程或直接与多线程独立应用程序一起工作。我建议重构Web应用程序,以便所有的信用卡处理都在Java servlet中完成,而不是让它们来回移动到独立应用程序。

+0

感谢您的答复迈克。实际上,这不是一个Web应用程序,而是一个独立的应用程序,仅在Windows 2003盒子的后台运行。当我说我正在通过Discover Web应用程序执行ISO8583消息时,我想我可能会混淆这个问题。我们需要利用他们的网络应用程序进行认证,并且网络应用程序通过定义的端口与我们的DEV盒直接相连,并将信息传递给我们的独立应用程序。希望澄清。我了解它很难理解架构。我正在尝试自己理解这一点。谢谢。 – Melinda