/** * 压力测试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-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码。JSON-RPC-Java可运行在Servlet容器中如Tomcat也可以运行在...
JSON-RPC-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码。JSON-RPC-Java可运行在Servlet容器中如Tomcat也可以运行在...
android-json-rpc是一个在android程序中使用的JSON-RPC客户端类库。它提供了一个简单的API来执行JSON-RPC服务调用
继《JavaScript高级应用与实践》之后推出的json-rpc-for-java开源代码,是仅仅100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持...
JSON-RPC 2.0 规范(中文版)。 JSON-RPC是一个无状态且轻量级的远程过程调用(RPC)协议。 本规范主要定义了一些数据结构及其相关的处理规则。它允许运行在基于socket,http等诸多不同消息传输环境的同一进程中。其使用...
json-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdf
网上的json-rpc和它的源代码大多都不是完整的,这个里面是一一对应的,完整的源码包。里面有一个json-rpc-1.0.jar和一个json-rpc-1.0-source.jar
json-rpc-for-java,是仅仅不到100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持级联调用,也就是说不需要额外 的JavaScript编程,...
JSON-RPC用户手册
简单的json-rpc-client 简单而强大的 JSON-RPC 客户端,完全实现了 JSON-RPC 2.0 规范。 它提供了一个用于创建自定义客户端的接口,并带有一个默认实现,该实现使用 POST 通过 HTTP 发送请求。 符合标准,它支持...
JSON-RPC协议的C语言版与Python语言版,源代码及示例
jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例
JSON-RPC for Java使用说明 包括示例代码
JSON-RPC for Java.src 2.0
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 请求进行测试
JSON-RPC_for_Java使用说明
Anemonis.AspNetCore.JsonRpc ... 除了标准的JSON-RPC错误代码之外,中间件还可能返回以下JSON-RPC错误: 码 原因 -32000 提供的批次包含带有重复标识符的请求 除了标准的JSON-RPC HTTP错误代码之外,中间件还可
JSON-RPC是 JavaScript Object Notation–RPC的简称,利用JSON-RPC可以调用服务器端 Java 对象。JSON-RPC是一种轻量级远程过程调用协议,在此协议中,JSON 可以连续请求和响应。向远程服务发送请求可以调用远程方法...
libjson-rpc-cpp此框架为C ++提供跨平台的JSON-RPC(远程过程调用)支持。 它与JSON-RPC 2.0和1.0完全兼容。 在下一个RPC项目中使用libjson-rpc-cpp的5个很好的理由libjson-rpc-cpp此框架为C ++提供跨平台的...