套接字通信中没有读取过程
本部分讨论在 AIX 平台上的套接字通信中经常遇到的一个问题。性能测试是一件好事情。它可以帮助您找出不如功能测试中找到的错误那么明显的错误。这些错误包括内存泄漏和多线程编程的争用条件。它们就像您代码中的捣蛋鬼,有时可能会使您的代码行为异常。
在这个性能测试场景中,测试客户端向运行于 Application Server 上的 Web 应用程序发送 Web 服务请求。该 Web 应用程序处理请求并构造一个新消息,然后将新构建的消息发送到一个网关。然后网关向该 Web 应用程序发回一个响应,该 Web 应用程序再向测试客户端发送一个响应。图 2 显示了该过程流。
图 2. Web 应用程序的性能测试
陷阱
上述场景非常常见,并且很容易在功能测试中验证。然而,在性能测试中,当企业应用程序经历很高的事务处理速度(Transaction Per Second,TPS)时,如果没有预先执行性能测试,您的应用程序很可能会引发异常。
异常发生在套接字通信中,其主要特征为:java.net.SocketException: There is no process to read data written to a pipe
“There is no process to read data written to a pipe”错误是一个特定于 AIX 的错误消息,位于对应的 Java 代码的本机方法实现中。它是由在 AIX 上实现套接字通信的 C 代码所引发的。
正如该消息所述,它是在写入某个管道的消息没有被任何进程读取时发生的。当向接收端发送大量请求时,接收端可能由于超时、线程被阻塞或其他原因而无法读取请求,然后就会引发此异常。
解决办法
大多数时候,此问题都是由潜在的错误引起的。例如:
该 Web 应用程序与网关建立一个 HTTP 连接,并尝试向它发送一个请求(图 2 中的步骤 2),如清单 6 所示。
清单 6. 向 Web 应用程序发送 HTTP 请求
URL url = new URL(serverAddress);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
PrintWriter writer = new PrintWriter(os);
writer.println("Hello, dude");
writer.flush();
writer.close();
InputStream is = conn.getInputStream();
如果没有最后一行 InputStream is = conn.getInputStream,则会引发 java.net.SocketException: There is no process to read data written to a pipe 异常。如果没有 conn.getInputStream(),则根本不会将请求消息发送到接收端。因此,接收端不会收到任何消息,当然就没有任何进程读取写入连接套接字的请求数据了,所以就导致产生异常。
侦听响应时超时,如图 2 中的步骤4 所示。
性能测试可能预期测试客户端能够在五秒内获得响应。如果响应在五秒后返回,则发出请求的测试客户端将不再处理它。因此,测试客户端不会读取响应数据。对于套接字管道,数据是写入了,但是它缺少读取过程。
响应线程被另一个线程阻塞,如图 2 中的步骤 3 所示。
假设您在网关中管理线程池以响应 Web 应用程序发送的请求。当达到相当高的 TPS 时,由于低效的线程调度,很可能无法调度任何线程去处理新的请求。结果,该请求未由任何线程读取和处理。这还可能会导致错误。
提醒
对于基于输入或输出流的 API,应确保在不再需要时关闭所有打开的连接(打开的 InputStream(Reader) 或 OutputStream(Writer))。
总结
将 Java Web 应用程序从一个平台移植到另一个平台所需的精力虽然不是非常巨大,但也是相当可观的。需要记住的三个要点如下:
在编写操作系统相关的代码时,避免硬编码。使用 java.lang.System.getProtery(String name) 始终更为可靠。
使用 java.lang.Class.getResource(String filename) 来定位在 Application Developer V5.1.2、Rational Application Developer V6.0 和相关版本的 Application Server 上都有效的资源,无论它们是在 Windows 还是在 AIX 上。
对于容易出错的网络程序,应该成对地执行读取和写入操作。如果将数据写入某个套接字,则必须有某个进程去读取它们。
分享到:
相关推荐
DB2从windowsXP迁移至AIX完整过程
将经分A库的Oracle RAC 从HPUX平台迁移到IBM AIX 平台。目前经分A库Oracle RAC 建立在基于Symantec SFCFS的四台HP节点系统上,数据文件建立在VXVM 的裸设备上,数据库容量110TB 。 由于Symantec VXVM采用的是跨...
- 迁移环境搭建 搭建用于应用迁移的开发环境和测试实验环境。 - 服务中间件和资源迁移 在应用代码迁移之前,首先完成应用运行所依赖的服务中间件和基础软件资源的迁移和转换。
DB2从AIX+server上转移(迁移)到linux上.docx
window tomcat项目迁移到linux上环境的配置及迁移过程中遇到问题的总结.
AIX6.1系统安装详细过程、还有迁移的的内容、主要是安装的中的一些指令
毕设项目-基于迁移学习flask的web端三维模型重建系统源码.zip毕设项目-基于迁移学习flask的web端三维模型重建系统源码.zip毕设项目-基于迁移学习flask的web端三维模型重建系统源码.zip毕设项目-基于迁移学习flask的...
AIX LV迁移: 一、在同一卷组中操作,迁移L V 二、在不同一卷组中操作,迁移L V 建议在实施前做好数据备份,在业务不繁忙时停止应用操作
LV-AIX镜像迁移.pdf
【TTS】AIX平台数据库迁移到Linux环境(真实环境).pdf【TTS】AIX平台数据库迁移到Linux环境(真实环境).pdf
在启动过程中,应用程序将创建一个名为book_app的架构,在执行Hibernate验证之前从src / main / resources / flyway / postgres运行SQL脚本,并插入Libary.java类中定义的书籍。 应用程序启动后,您将在book_app...
利用xtts跨平台增量传输表空间技术,轻松快速将aix环境下的oracle11g在1小时内迁移到linux环境下。 本次采用手动xtts的方式,该方法适用任意平台之间,源端>=oracle10.2.0.3,目标端>=11.2.0.4,包括windows<->linux...
AIX数据迁移
ORACLE 数据库从AIX裸设备到ASM存储的迁移过程
《决战Nginx技术卷:高性能Web服务器部署与运维(基于php、Java、...对于ASP.NET的用户来说,现在从Windows系统下向Linux系统迁移的用户很多,这就无疑会使用Mono,在本书中同样能够找到Mono的使用和迁移的解决方案。
本文主要结合之前一次oracle迁移达梦的项目,将碰到的问题以及一系列踩过的坑列举出来供大家参考,数据库版本是达梦7。(本文中涉及到的部分对象名已用sch1,tab1等方式替换) 1、整体情况 迁移过程中失败任务数低于5%...
AIX系统LVM存储迁移手册
AIX7.1安装与迁移2014 不错的资源, 值得下载!
本指南将引导您完成将现有 Java EE 工作负载迁移到 Azure 的过程,也就是: Java EE 应用程序到应用服务 Linux 和 应用程序的数据到 Azure Database for PostgreSQL、MySQL 和/或 SQL 数据库。 目录 您将迁移到云...
行业分类-设备装置-一种从AIX平台至K-UX平台的CC++应用迁移工具.zip