`

压力测试JSON-RPC服务

 
阅读更多
/**
 * 压力测试JSON-RPC服务
 * 
 * @author zhiqiang.zhu
 * @version $Id: LoadRunnerRPCService.java, v 0.1 2011-6-9 下午08:43:11 zhiqiang.zhu Exp $
 */
public class LoadRunnerRPCService {

    /** logger */
    private static final Logger      logger     = Logger.getLogger(LoadRunnerRPCService.class);

    /** 端口号 */
    private static final int         PROT       = 9091;

    /** 最大线程数 */
    private static final int         NTHREADS   = 150;

    /** 线城池 */
    private static final Executor    threadPool = Executors.newFixedThreadPool(NTHREADS);

    /** 异步服务外部接口 */
    private TestXXXXServiceFacade testXXXXServiceFacade ;

    /**
     * Spring初始化方法,启动一个服务端口的守护进程并开启服务
     */
    public void init() {
        try {
            new Thread(new Runnable() {
                public void run() {
                    try {
                        initServer();
                    } catch (Exception e) {
                        logger.error(e);
                        throw new RuntimeException(e);
                    }
                }
            }).start();

            if (logger.isInfoEnabled()) {
                logger.info("====================================");
                logger.info("异步服务接口压力测试服务启动成功!");
                logger.info("====================================");
            }

        } catch (Exception e) {
            logger.error("服务启动失败", e);
        }
    }

    /**
     * 初始化服务
     */
    private void initServer() {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket();
            serverSocket.bind(new InetSocketAddress(PROT));
        } catch (Exception e) {
            logger.error("服务启动失败", e);
            throw new RuntimeException(e);
        }

        try {
            while (true) {
                final Socket socket = serverSocket.accept();
                threadPool.execute(new Runnable() {
                    public void run() {
                        PrintWriter pw = null;
                        InputStream is = null;
                        try {
                            if (logger.isInfoEnabled()) {
                                logger.info("接受到来自" + socket.getInetAddress().getHostAddress()
                                            + "的请求!");
                            }
                            process(socket);
                            is = socket.getInputStream();
                            pw = new PrintWriter(socket.getOutputStream());
                            pw.print("true\r\n");
                            pw.flush();
                        } catch (Exception e) {
                            logger.error("处理指定的任务时出现异常", e);
                            try {
                                if (socket != null) {
                                    pw = new PrintWriter(socket.getOutputStream());
                                    pw.print("false\r\n");
                                    pw.flush();
                                }
                            } catch (IOException e1) {
                                logger.error("处理指定的任务时出现异常", e);
                            }
                        } finally {
                            if (is != null) {
                                IOUtils.closeQuietly(is);
                            }
                            
                            if (pw != null) {
                                IOUtils.closeQuietly(pw);
                            }
                            
                            if(socket != null) {
                                try {
                                    socket.close();
                                } catch (IOException e) {
                                    logger.error("处理指定的任务时出现异常", e);
                                }
                            }
                        }
                    }
                });
            }
        } catch (Exception e) {
            logger.error("处理任务时出现异常", e);
            throw new RuntimeException(e);
        }
    }

    /**
     * Socket服务处理
     * 
     * @param socket      请求
     * @throws Exception  异常
     */
    private void process(Socket socket) throws Exception {
        ChargeEvent chargeEvent = resolveParam(socket.getInputStream());
        
        if(logger.isInfoEnabled()) {
            logger.info("JSON格式转换ChargeEvent,chargeEvent=" + chargeEvent);
        }
        
        testXXXXServiceFacade.async(chargeEvent);
    }

    /**
     * 解析参数
     * 
     * @param inputStream   Socket输入流
     * @return              
     * @throws Exception
     */
    private ChargeEvent resolveParam(InputStream inputStream) throws Exception {

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int size = -1;
        while ((size = inputStream.read(buffer)) > -1) {
            bos.write(buffer, 0, size);
            String params = new String(bos.toByteArray());
            if (params.endsWith("}")) {
                break;
            }
        }

        String params = new String(bos.toByteArray());
        return splitJson(params);
    }

    /**
     * 解析JSON数据
     * 
     * @param params       JSON数据
     * @return             
     * @throws Exception
     */
    private ChargeEvent splitJson(String params) throws Exception {

        params = params.substring(1);
        params = params.substring(0, params.length() - 1);

        String properties = null;
        if (params.indexOf("[") != -1) {
            properties = params
                .substring(params.substring(0, params.indexOf("[")).lastIndexOf(",") + 1);
            params = params.substring(0, params.substring(0, params.indexOf("[")).lastIndexOf(","));
        }

        String[] arr = params.split(",");

        ChargeEvent chargeEvent = new ChargeEvent();
        for (String s : arr) {
            String[] values = s.split(":");
            values[0] = values[0].trim();
            values[1] = values[1].trim();
            String method = "get" + values[0].substring(0, 1).toUpperCase()
                            + values[0].substring(1);

            Method getMethod = ChargeEvent.class.getMethod(method, new Class[0]);
            Class<?> returnType = getMethod.getReturnType();

            Object value = getValue(values[1], returnType);
            method = "set" + values[0].substring(0, 1).toUpperCase() + values[0].substring(1);

            Method setMethod = ChargeEvent.class.getMethod(method, new Class[] { returnType });
            setMethod.invoke(chargeEvent, new Object[] { value });
        }

        if (properties != null) {
            Map<String, String> props = new HashMap<String, String>();
            properties = properties.substring(properties.indexOf("[") + 1);
            properties = properties.substring(0, properties.indexOf("]"));

            arr = properties.split(",");
            for (String s : arr) {
                String[] values = s.split(":");
                props.put(values[0].trim(), values[1].trim());
            }

            chargeEvent.setProperties(props);
        }

        return chargeEvent;
    }

    /**
     * 取得对应的数据
     * 
     * @param value String形式的值
     * @param clazz 值的类型
     * @return      真正的值
     */
    private Object getValue(String value, Class<?> clazz) {

        if (String.class.equals(clazz)) {
            return value;
        } else if (Money.class.equals(clazz)) {
            return new Money(value);
        } else if (BigDecimal.class.equals(clazz)) {
            return new BigDecimal(value);
        } else if (EventStatusEnum.class.equals(clazz)) {
            return EventStatusEnum.getEventStatusEnum(value);
        } else if (Date.class.equals(clazz)) {
            //yyyyMMddHHmmss
            return DateUtil.parseDateLongFormat(value);
        }

        return null;
    }

}

 

分享到:
评论

相关推荐

    json-rpc.jar 和 jsonrpc.js

    JSON-RPC-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码。JSON-RPC-Java可运行在Servlet容器中如Tomcat也可以运行在...

    JSON-RPC-Java实例

    JSON-RPC-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码。JSON-RPC-Java可运行在Servlet容器中如Tomcat也可以运行在...

    android-json-rpc

    android-json-rpc是一个在android程序中使用的JSON-RPC客户端类库。它提供了一个简单的API来执行JSON-RPC服务调用

    json-rpc-for-java

    继《JavaScript高级应用与实践》之后推出的json-rpc-for-java开源代码,是仅仅100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持...

    JSON-RPC 2.0 规范(中文版)

    JSON-RPC 2.0 规范(中文版)。 JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。 本规范主要定义了一些数据结构及其相关的处理规则。它允许运行在基于socket,http等诸多不同消息传输环境的同一进程中。其使用...

    json-rpc-java-talk-20050225.pdf

    json-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdf

    json-rpc-1.0(with source).rar

    网上的json-rpc和它的源代码大多都不是完整的,这个里面是一一对应的,完整的源码包。里面有一个json-rpc-1.0.jar和一个json-rpc-1.0-source.jar

    Json-RPC for java Example

    json-rpc-for-java,是仅仅不到100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持级联调用,也就是说不需要额外 的JavaScript编程,...

    JSON-RPC用户手册

    JSON-RPC用户手册

    simple-json-rpc-client:简单而强大的 JSON-RPC 客户端,完全实现了 JSON-RPC 2.0 规范

    简单的json-rpc-client 简单而强大的 JSON-RPC 客户端,完全实现了 JSON-RPC 2.0 规范。 它提供了一个用于创建自定义客户端的接口,并带有一个默认实现,该实现使用 POST 通过 HTTP 发送请求。 符合标准,它支持...

    json-rpc协议C语言版

    JSON-RPC协议的C语言版与Python语言版,源代码及示例

    jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例

    jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例

    JSON-RPC for Java使用说明

    JSON-RPC for Java使用说明 包括示例代码

    JSON-RPC for Java.src 2.0

    JSON-RPC for Java.src 2.0

    JsonRpc-Cpp

    JsonRpc-Cpp - JSON-RPC implementation. * Copyright (C) 2008-2011 Sebastien Vincent * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser ...

    jsonrpc-frontend:前端应用程序发送 json-rpc 请求进行测试

    jsonrpc-frontend:前端应用程序发送 json-rpc 请求进行测试

    Json-RPC_for_Java使用说明

    JSON-RPC_for_Java使用说明

    aspnetcore-json-rpc:.NET 5中用于ASP.NET Core的JSON-RPC 2.0中间件

    Anemonis.AspNetCore.JsonRpc ... 除了标准的JSON-RPC错误代码之外,中间件还可能返回以下JSON-RPC错误: 码 原因 -32000 提供的批次包含带有重复标识符的请求 除了标准的JSON-RPC HTTP错误代码之外,中间件还可

    JSON-RPC使用手册.

    JSON-RPC是 JavaScript Object Notation–RPC的简称,利用JSON-RPC可以调用服务器端 Java 对象。JSON-RPC是一种轻量级远程过程调用协议,在此协议中,JSON 可以连续请求和响应。向远程服务发送请求可以调用远程方法...

    json-rpc的C ++框架(json远程过程调用)-C/C++开发

    libjson-rpc-cpp此框​​架为C ++提供跨平台的JSON-RPC(远程过程调用)支持。 它与JSON-RPC 2.0和1.0完全兼容。 在下一个RPC项目中使用libjson-rpc-cpp的5个很好的理由libjson-rpc-cpp此框​​架为C ++提供跨平台的...

Global site tag (gtag.js) - Google Analytics