Java多线程在交易中间件测试中的应用(3)

    作者:课课家教育更新于: 2016-02-03 13:55:34

    大神带你学编程,欢迎选课

      解决方法及实现细节

      为了解决项目面临的测试难题,本文采用 java 的多线程机制来模拟这三个问题所涉及的 场景。由于在本项目中客户端发出的请求需要复杂的处理,所以本文采用实现 Runnable 接口的方法来实现多线程,这样发 送请求的类还可以继承其它的工具类来实现复杂的处理。

    Java多线程在交易中间件测试中的应用(3)_java语言_java编程_课课家

      由于 IMS Connect 所支持的 socket 的数目 (MAXSOC) 可 以从 100 到 65535,而 TCPIPQ 队列的大小可以从 50 到 65535,本文在实现客户端多线程请求前,设置 IMS Connect 的 MAXSOC=100 并且设置 TCPIPQ=50。

      在这个前提下,本文实现的线程类在演示时,如果创建 100 个线程的客户端连 接,就会达到 socket 连接的上限,使 IMS Connect 的 Health 为 0,意味着不能再监听多余的 socket 请求,如果继续 发送 50 个请求,这些请求会进入 TCPIPQ 的队列,使这个缓存队列也达到上限。再继续发送请求就会被拒绝,并得到拒绝 的提示信息。

      如果使用最简单的实现方法,可以参考如下的代码清单 2。

      清单 2. 多客户端并发连接的简单 实现

      class Utility { // 工具类

      public byte[] getHeadData(String...parms){

      .....

      ....

      }

      public byte[] getBodyData(String...parms){

      .....

      ....

      }

      public byte[] getFootData(String...parms){

      .....

      ....

      }

      }

      class SocketClient extends Utility implements Runnable,Test{ // 实现 Runnable 接口

      String hostName;

      int port;

      public SocketClient(String hostName,int port) {

      this.hostName=hostName;

      this.port=port;

      }

      // 线程启动后的连接,并发送数据的

      public void run() {

      try {

      INETAddress inetAddress = InetAddress.getByName(hostName);

      Socket socket = new Socket(inetAddress,port);

      OutputStream os = socket.getOutputStream();

      BufferedOutputStream bos = new BufferedOutputStream(os);

      byte[] sendHeadData = getHeadData("aaa","bbb","ccc");

      byte[] sendBodyData = getBodyData("ddd","eee","fff");

      byte[] sendFootData = getFootData("ggg","hhh","iii");

      bos.write(sendHeadData);

      bos.write(sendBodyData);

      bos.write(sendFootData);

      bos.flush();

      } catch (IOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

      }

      }

      }

      // 测试的主线程,演示测试的一些场景

      public class SocketConnectionDemo {

      public int connectionNumb; // 连接数

      public String hostName;// 连接的 IMS Connect 的域名

      public int port;// 连接的端口

      public SocketConnectionDemo(int connectionNumb,String hostName, int port){

      this.connectionNumb=connectionNumb;

      this.hostName=hostName;

      this.port=port;

      }

      public static void main(String[] args) {

      int connectionNumb = 50;

      String hostName = "ec32181.vmec.svl.com";

      int port = 9999;

      SocketConnectionDemo scd = new SocketConnectionDemo(connectionNumb,hostName,port);

      }

      // 最简单的测试场景

      public void testScenario1(){

      for(int i=1; i<=connectionNumb; i++){

      SocketClient sc = new SocketClient(hostName, port);

      Thread clientT = new Thread(sc,"Client"+i);

      clientT.start();

      }

      // 测试的具体逻辑

      … ..

      … .

      }

      }

课课家教育

未登录

1