[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".gitignore",
    "content": "# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.jar\n*.war\n*.ear\n*.zip\n*.tar.gz\n*.rar\n*.gz\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n\n\n\n*/.classpath\n*/.factorypath\n*/.project\n*/.settings\n*/.idea\n*/target\n*.bak\n*.iml\n.idea\n.settings\n.project\n\n*.iml\n"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "README.md",
    "content": "# RPC Benchmark\n几乎所有的 RPC 框架都宣称自己是“高性能”的, 那么实际结果到底如何呢, 让我们来做一个性能测试吧.\n\n## 测试结果\n- Round-5 2019-02-11 https://www.jianshu.com/p/cdd94d0853c3\n- Round-4 2018-08-05 https://www.jianshu.com/p/72b98dc67d9d\n- Round-3 2018-05-12 https://www.jianshu.com/p/caf51f5cfbaa\n- Round-2 2018-03-25 https://www.jianshu.com/p/f0f494cfce94\n- Round-1 2018-01-28 https://www.jianshu.com/p/18c95649b1a4\n\n## 测试说明\n - 仅限于Java.\n - 客户端使用JMH进行压测, 32 线程, 3 轮预热 3 轮测试 每轮 10s\n - 每次运行前都会执行 ***killall java***, 但没有在每轮测试时重启操作系统\n - 所有类库版本在发布时都是最新的, 除非存在bug\n - 所有框架都尽量参考该项目自带的Benchmark实现\n - 将会一直持续, 不定期发布测试结果\n - 更多说明请移步: [怎样对 RPC 进行有效的性能测试](https://www.jianshu.com/p/cbcdf05eaa5c)\n\n## 测试用例\n 1. boolean existUser(String email), 判断某个 email 是否存在\n 2. boolean createUser(User user), 添加一个 User\n 3. User getUser(long id), 根据 id 获取一个用户\n 4. Page<User> listUser(int pageNo), 获取用户列表\n\n## 运行说明\n1. 需要两台机器，一台作为客户端，一台作为服务端\n2. 系统要求为 linux x64, 至少 4GB ram\n3. 客户端需要安装 jdk 11, maven 3\n4. 服务端需要安装 jdk 11\n5. 客户端服务端均需要设置 hosts\n> 10.0.0.88 benchmark-client<br>\n> 10.0.0.99 benchmark-server\n\n6. 服务端需要添加用户 benchmark, 需要配置成客户端免密登录, 也就是客户端可以通过如下方式访问服务端\n> ssh benchmark@benchmark-server \"ls -lh\"\n\n7. 客户端执行如下命令, 结果输出到 benchmark/benchmark-result\n> git clone https://github.com/hank-whu/rpc-benchmark.git<br>\n> cd rpc-benchmark<br>\n> java benchmark.java\n\n## 开发者必读\n1. cd benchmark-base && mvn install \n2. 配置好 hosts: benchmark-client benchmark-server\n3. 修改或者实现 xxx-server xxx-client\n4. 启动 Server, 然后启动 Client, 确保能不出错跑完所有测试项目\n5. 提交 Pull Request\n\n## 免责声明\n - 能力所限错误在所难免, 本测试用例及测试结果仅供参考.\n - 如果你认为xx框架的代码或配置存在问题，那么欢迎发起Pull Request.\n - 利益相关: 本测试用例作者同时为 [turbo](https://github.com/hank-whu/turbo-rpc), [undertow-async](https://github.com/hank-whu/undertow-async) 的作者.\n\n## 关注微信公众号: rpcBenchmark\n![rpcBenchmark](https://github.com/hank-whu/rpc-benchmark/raw/master/rpcBenchmark.jpg)"
  },
  {
    "path": "armeria-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>armeria-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>armeria-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "armeria-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceJsonHttpClientImpl;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserService userService = new UserServiceJsonHttpClientImpl(CONCURRENCY);\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "armeria-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>armeria-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>armeria-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<armeria.version>0.79.0</armeria.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.linecorp.armeria</groupId>\n\t\t\t<artifactId>armeria</artifactId>\n\t\t\t<version>${armeria.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t\t\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "armeria-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport java.net.InetSocketAddress;\n\nimport com.linecorp.armeria.server.ServerBuilder;\n\nimport benchmark.service.ArmeriaUserServiceServerImpl;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tServerBuilder sb = new ServerBuilder();\n\n\t\t// Configure an HTTP port.\n\t\tsb.http(new InetSocketAddress(\"benchmark-server\", 8080));\n\n\t\t// Using an annotated service object:\n\t\tsb.annotatedService(new ArmeriaUserServiceServerImpl());\n\n\t\tsb.build().start().join();\n\n\t}\n\n}\n"
  },
  {
    "path": "armeria-server/src/main/java/benchmark/service/ArmeriaUserServiceServerImpl.java",
    "content": "package benchmark.service;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.linecorp.armeria.common.HttpResponse;\nimport com.linecorp.armeria.server.annotation.Get;\nimport com.linecorp.armeria.server.annotation.Param;\nimport com.linecorp.armeria.server.annotation.Post;\nimport com.linecorp.armeria.server.annotation.RequestObject;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.util.JsonUtils;\n\n/**\n * only for server\n * \n * @author Hank\n *\n */\npublic class ArmeriaUserServiceServerImpl {\n\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\n\t@Get(\"/user-exist\")\n\tpublic HttpResponse existUser(@Param(\"email\") String email) {\n\n\t\tif (email == null || email.isEmpty()) {\n\t\t\treturn HttpResponse.of(String.valueOf(Boolean.TRUE));\n\t\t}\n\n\t\tif (email.charAt(email.length() - 1) < '5') {\n\t\t\treturn HttpResponse.of(String.valueOf(Boolean.FALSE));\n\t\t}\n\n\t\treturn HttpResponse.of(String.valueOf(Boolean.TRUE));\n\n\t}\n\n\t@Get(\"/get-user\")\n\tpublic HttpResponse getUser(@Param(\"id\") long id) throws JsonProcessingException {\n\t\tUser user = new User();\n\n\t\tuser.setId(id);\n\t\tuser.setName(\"Doug Lea\");\n\t\tuser.setSex(1);\n\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\tuser.setEmail(\"dong.lea@gmail.com\");\n\t\tuser.setMobile(\"18612345678\");\n\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\");\n\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\");\n\t\tuser.setStatus(1);\n\t\tuser.setCreateTime(LocalDateTime.now());\n\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\tList<Integer> permissions = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\tuser.setPermissions(permissions);\n\n\t\treturn HttpResponse.of(objectMapper.writeValueAsString(user));\n\t}\n\n\t@Get(\"/list-user\")\n\tpublic HttpResponse listUser(@Param(\"pageNo\") int pageNo) throws JsonProcessingException {\n\t\tList<User> userList = new ArrayList<>(15);\n\n\t\tfor (int i = 0; i < 15; i++) {\n\t\t\tUser user = new User();\n\n\t\t\tuser.setId(i);\n\t\t\tuser.setName(\"Doug Lea\" + i);\n\t\t\tuser.setSex(1);\n\t\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\t\tuser.setEmail(\"dong.lea@gmail.com\" + i);\n\t\t\tuser.setMobile(\"18612345678\" + i);\n\t\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\" + i);\n\t\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\" + i);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setCreateTime(LocalDateTime.now());\n\t\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\t\tList<Integer> permissions = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\t\tuser.setPermissions(permissions);\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tPage<User> page = new Page<>();\n\t\tpage.setPageNo(pageNo);\n\t\tpage.setTotal(1000);\n\t\tpage.setResult(userList);\n\n\t\treturn HttpResponse.of(objectMapper.writeValueAsString(page));\n\t}\n\n\t@Post(\"/create-user\")\n\tpublic HttpResponse createUser(@RequestObject User user) {\n\t\tif (user == null) {\n\t\t\treturn HttpResponse.of(String.valueOf(Boolean.FALSE));\n\t\t}\n\n\t\treturn HttpResponse.of(String.valueOf(Boolean.TRUE));\n\t}\n\n}\n"
  },
  {
    "path": "benchmark-base/.java-version",
    "content": "11\n"
  },
  {
    "path": "benchmark-base/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>benchmark-base</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>benchmark-base</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.jmh>1.21</version.jmh>\n\t\t<version.logback>1.2.3</version.logback>\n\t\t<version.httpclient>4.5.7</version.httpclient>\n\t\t<version.jackson>2.9.8</version.jackson>\n\t\t<version.kryo>4.0.2</version.kryo>\n\t\t<version.protostuff>1.6.0</version.protostuff>\n\t\t<version.jsr250>1.0</version.jsr250>\n\t\t<version.vibur>22.2</version.vibur>\n\t\t<version.conversantmedia-disruptor>1.2.15</version.conversantmedia-disruptor>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.openjdk.jmh</groupId>\n\t\t\t<artifactId>jmh-core</artifactId>\n\t\t\t<version>${version.jmh}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.openjdk.jmh</groupId>\n\t\t\t<artifactId>jmh-generator-annprocess</artifactId>\n\t\t\t<version>${version.jmh}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>ch.qos.logback</groupId>\n\t\t\t<artifactId>logback-classic</artifactId>\n\t\t\t<version>${version.logback}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.httpcomponents</groupId>\n\t\t\t<artifactId>httpclient</artifactId>\n\t\t\t<version>${version.httpclient}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.fasterxml.jackson.core</groupId>\n\t\t\t<artifactId>jackson-databind</artifactId>\n\t\t\t<version>${version.jackson}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.fasterxml.jackson.datatype</groupId>\n\t\t\t<artifactId>jackson-datatype-jdk8</artifactId>\n\t\t\t<version>${version.jackson}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.fasterxml.jackson.datatype</groupId>\n\t\t\t<artifactId>jackson-datatype-jsr310</artifactId>\n\t\t\t<version>${version.jackson}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.fasterxml.jackson.module</groupId>\n\t\t\t<artifactId>jackson-module-afterburner</artifactId>\n\t\t\t<version>${version.jackson}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.esotericsoftware</groupId>\n\t\t\t<artifactId>kryo</artifactId>\n\t\t\t<version>${version.kryo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.protostuff</groupId>\n\t\t\t<artifactId>protostuff-core</artifactId>\n\t\t\t<version>${version.protostuff}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.protostuff</groupId>\n\t\t\t<artifactId>protostuff-runtime</artifactId>\n\t\t\t<version>${version.protostuff}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>javax.annotation</groupId>\n\t\t\t<artifactId>jsr250-api</artifactId>\n\t\t\t<version>${version.jsr250}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.vibur</groupId>\n\t\t\t<artifactId>vibur-object-pool</artifactId>\n\t\t\t<version>${version.vibur}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.conversantmedia</groupId>\n\t\t\t<artifactId>disruptor</artifactId>\n\t\t\t<version>${version.conversantmedia-disruptor}</version>\n\t\t</dependency>\n\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/bean/Page.java",
    "content": "package benchmark.bean;\n\nimport java.io.Serializable;\nimport java.util.List;\n\npublic class Page<T> implements Serializable {\n\tprivate static final long serialVersionUID = -7529237188686406553L;\n\n\tprivate int pageNo;\n\tprivate int total;\n\tprivate List<T> result;\n\n\tpublic int getPageNo() {\n\t\treturn pageNo;\n\t}\n\n\tpublic void setPageNo(int pageNo) {\n\t\tthis.pageNo = pageNo;\n\t}\n\n\tpublic int getTotal() {\n\t\treturn total;\n\t}\n\n\tpublic void setTotal(int total) {\n\t\tthis.total = total;\n\t}\n\n\tpublic List<T> getResult() {\n\t\treturn result;\n\t}\n\n\tpublic void setResult(List<T> result) {\n\t\tthis.result = result;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Page [pageNo=\" + pageNo + \", total=\" + total + \", result=\" + result + \"]\";\n\t}\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/bean/User.java",
    "content": "package benchmark.bean;\n\nimport java.io.Serializable;\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.List;\n\npublic class User implements Serializable {\n\tprivate static final long serialVersionUID = 2566816725396650300L;\n\n\tprivate long id;\n\tprivate String name;\n\tprivate int sex;\n\tprivate LocalDate birthday;\n\tprivate String email;\n\tprivate String mobile;\n\tprivate String address;\n\tprivate String icon;\n\tprivate List<Integer> permissions;\n\tprivate int status;\n\tprivate LocalDateTime createTime;\n\tprivate LocalDateTime updateTime;\n\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic int getSex() {\n\t\treturn sex;\n\t}\n\n\tpublic void setSex(int sex) {\n\t\tthis.sex = sex;\n\t}\n\n\tpublic LocalDate getBirthday() {\n\t\treturn birthday;\n\t}\n\n\tpublic void setBirthday(LocalDate birthday) {\n\t\tthis.birthday = birthday;\n\t}\n\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\n\tpublic String getMobile() {\n\t\treturn mobile;\n\t}\n\n\tpublic void setMobile(String mobile) {\n\t\tthis.mobile = mobile;\n\t}\n\n\tpublic String getAddress() {\n\t\treturn address;\n\t}\n\n\tpublic void setAddress(String address) {\n\t\tthis.address = address;\n\t}\n\n\tpublic String getIcon() {\n\t\treturn icon;\n\t}\n\n\tpublic void setIcon(String icon) {\n\t\tthis.icon = icon;\n\t}\n\n\tpublic List<Integer> getPermissions() {\n\t\treturn permissions;\n\t}\n\n\tpublic void setPermissions(List<Integer> permissions) {\n\t\tthis.permissions = permissions;\n\t}\n\n\tpublic int getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(int status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic LocalDateTime getCreateTime() {\n\t\treturn createTime;\n\t}\n\n\tpublic void setCreateTime(LocalDateTime createTime) {\n\t\tthis.createTime = createTime;\n\t}\n\n\tpublic LocalDateTime getUpdateTime() {\n\t\treturn updateTime;\n\t}\n\n\tpublic void setUpdateTime(LocalDateTime updateTime) {\n\t\tthis.updateTime = updateTime;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"User [id=\" + id + \", name=\" + name + \", sex=\" + sex + \", birthday=\" + birthday + \", email=\" + email\n\t\t\t\t+ \", mobile=\" + mobile + \", address=\" + address + \", icon=\" + icon + \", permissions=\" + permissions\n\t\t\t\t+ \", status=\" + status + \", createTime=\" + createTime + \", updateTime=\" + updateTime + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/pool/ConcurrentObjectPool.java",
    "content": "package benchmark.pool;\n\nimport static benchmark.pool.UnsafeUtils.unsafe;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.util.concurrent.ThreadLocalRandom;\nimport java.util.function.Supplier;\n\n/**\n * @author Hank\n *\n * @param <T>\n */\n@SuppressWarnings(\"unchecked\")\npublic class ConcurrentObjectPool<T> implements Closeable {\n\n\tprivate static final long EXCHANGE;\n\tprivate static final int ABASE;\n\tprivate static final int ASHIFT;\n\n\tprivate static final Object EMPTY = new Object();\n\tprivate static final WaitStrategy WAIT_STRATEGY = new WaitStrategy();\n\n\tprivate final int size;\n\n\tvolatile long p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17;\n\tprivate final Object[] array;\n\n\tprivate final Object[] closeList;\n\tvolatile long q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11, q12, q13, q14, q15, q16, q17;\n\n\tprivate volatile Object exchange = EMPTY;\n\tvolatile long r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17;\n\n\tpublic ConcurrentObjectPool(int poolSize, Supplier<T> producer) {\n\t\tthis.size = poolSize;\n\t\tthis.closeList = new Object[poolSize];\n\t\tthis.array = new Object[poolSize];\n\n\t\tfor (int i = 0; i < poolSize; i++) {\n\t\t\tT t = producer.get();\n\n\t\t\tarray[i] = t;\n\t\t\tcloseList[i] = t;\n\t\t}\n\t}\n\n\tpublic T borrow() {\n\t\tT fast = exchange();\n\t\tif (fast != null) {// 抢到了\n\t\t\treturn fast;\n\t\t}\n\n\t\tfor (int i = 0; i < Integer.MAX_VALUE; i++) {\n\t\t\tint random = ThreadLocalRandom.current().nextInt(size);\n\n\t\t\tfor (int j = 0; j < size; j++) {\n\t\t\t\tlong offset = offset((random + j) % size);\n\t\t\t\tObject obj = unsafe().getObjectVolatile(array, offset);\n\n\t\t\t\tif (obj != EMPTY) {\n\t\t\t\t\tif (unsafe().compareAndSwapObject(array, offset, obj, EMPTY)) {\n\t\t\t\t\t\treturn (T) obj;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tWAIT_STRATEGY.idle(i);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic void release(final T t) {\n\t\tif (t == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tfinal boolean exchanged = exchange(t);\n\n\t\tfor (int i = 0; i < Integer.MAX_VALUE; i++) {\n\n\t\t\tint random = ThreadLocalRandom.current().nextInt(size);\n\n\t\t\tfor (int j = 0; j < size; j++) {\n\t\t\t\tif (exchanged && !checkExchange(t)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlong offset = offset((random + j) % size);\n\t\t\t\tObject obj = unsafe().getObjectVolatile(array, offset);\n\n\t\t\t\tif (obj == EMPTY) {\n\t\t\t\t\tif (exchanged && !cancelExchange(t)) {// 被其他线程抢走了\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (unsafe().compareAndSwapObject(array, offset, obj, t)) {// 归还资源\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tWAIT_STRATEGY.idle(i);\n\t\t}\n\t}\n\n\tprivate boolean exchange(final Object value) {\n\t\treturn unsafe().compareAndSwapObject(this, EXCHANGE, EMPTY, value);\n\t}\n\n\tprivate boolean cancelExchange(final Object value) {\n\t\treturn unsafe().compareAndSwapObject(this, EXCHANGE, value, EMPTY);\n\t}\n\n\tprivate boolean checkExchange(final Object value) {\n\t\treturn value == exchange;\n\t}\n\n\tprivate T exchange() {\n\t\tObject fast = exchange;\n\n\t\t// 抢一下\n\t\tif (fast != EMPTY && unsafe().compareAndSwapObject(this, EXCHANGE, fast, EMPTY)) {\n\t\t\treturn (T) fast;// 抢到了\n\t\t}\n\n\t\t// 没抢到\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\tfor (int i = 0; i < closeList.length; i++) {\n\t\t\tObject obj = closeList[i];\n\n\t\t\tif (obj instanceof AutoCloseable) {\n\t\t\t\ttry {\n\t\t\t\t\t((AutoCloseable) obj).close();\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static final long offset(int key) {\n\t\treturn ((long) key << ASHIFT) + ABASE;\n\t}\n\n\tstatic {\n\t\ttry {\n\t\t\tEXCHANGE = unsafe().objectFieldOffset(ConcurrentObjectPool.class.getDeclaredField(\"exchange\"));\n\n\t\t\tABASE = unsafe().arrayBaseOffset(Object[].class);\n\n\t\t\tint scale = unsafe().arrayIndexScale(Object[].class);\n\t\t\tif ((scale & (scale - 1)) != 0) {\n\t\t\t\tthrow new Error(\"array index scale not a power of two\");\n\t\t\t}\n\n\t\t\tASHIFT = 31 - Integer.numberOfLeadingZeros(scale);\n\t\t} catch (Exception e) {\n\t\t\tthrow new Error(e);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/pool/LockObjectPool.java",
    "content": "package benchmark.pool;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.util.IdentityHashMap;\nimport java.util.concurrent.ThreadLocalRandom;\nimport java.util.concurrent.locks.Lock;\nimport java.util.concurrent.locks.ReentrantLock;\nimport java.util.function.Supplier;\n\n/**\n * @author Hank\n *\n * @param <T>\n */\n@SuppressWarnings(\"unchecked\")\npublic class LockObjectPool<T> implements Closeable {\n\n\tstatic class ObjectWithLock {\n\t\tpublic final Object obj;\n\t\tpublic final Lock lock;\n\n\t\tpublic ObjectWithLock(Object obj) {\n\t\t\tthis.obj = obj;\n\t\t\tthis.lock = new ReentrantLock();\n\t\t}\n\t}\n\n\tprivate final ObjectWithLock[] array;\n\tprivate final IdentityHashMap<Object, ObjectWithLock> lockMap;\n\tprivate final int poolSize;\n\n\tpublic LockObjectPool(int poolSize, Supplier<T> producer) {\n\t\tthis.poolSize = poolSize;\n\n\t\tlockMap = new IdentityHashMap<>(poolSize * 2);\n\n\t\tarray = new ObjectWithLock[poolSize];\n\t\tfor (int i = 0; i < poolSize; i++) {\n\t\t\tT t = producer.get();\n\t\t\tObjectWithLock objectWithLock = new ObjectWithLock(t);\n\n\t\t\tarray[i] = objectWithLock;\n\t\t\tlockMap.put(t, objectWithLock);\n\t\t}\n\t}\n\n\tpublic T borrow() {\n\t\tint index = ThreadLocalRandom.current().nextInt(poolSize);\n\t\tObjectWithLock objectWithLock = array[index];\n\n\t\tobjectWithLock.lock.lock();\n\n\t\treturn (T) objectWithLock.obj;\n\t}\n\n\tpublic void release(T t) {\n\t\tif (t == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tlockMap.get(t).lock.unlock();\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\n\t\tfor (int i = 0; i < array.length; i++) {\n\t\t\tObject obj = array[i].obj;\n\n\t\t\tif (obj instanceof AutoCloseable) {\n\t\t\t\ttry {\n\t\t\t\t\t((AutoCloseable) obj).close();\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/pool/UnsafeUtils.java",
    "content": "package benchmark.pool;\n\nimport sun.misc.Unsafe;\n\npublic class UnsafeUtils {\n\tfinal static private Unsafe _unsafe;\n\n\tstatic {\n\t\tUnsafe tmpUnsafe = null;\n\n\t\ttry {\n\t\t\tjava.lang.reflect.Field field = sun.misc.Unsafe.class.getDeclaredField(\"theUnsafe\");\n\t\t\tfield.setAccessible(true);\n\t\t\ttmpUnsafe = (sun.misc.Unsafe) field.get(null);\n\t\t} catch (java.lang.Exception e) {\n\t\t\tthrow new Error(e);\n\t\t}\n\n\t\t_unsafe = tmpUnsafe;\n\t}\n\n\tpublic static final Unsafe unsafe() {\n\t\treturn _unsafe;\n\t}\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/pool/ViberObjectPool.java",
    "content": "package benchmark.pool;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.util.function.Supplier;\n\nimport org.vibur.objectpool.ConcurrentPool;\nimport org.vibur.objectpool.PoolObjectFactory;\nimport org.vibur.objectpool.PoolService;\nimport org.vibur.objectpool.util.ConcurrentCollection;\nimport org.vibur.objectpool.util.MultithreadConcurrentQueueCollection;\n\npublic class ViberObjectPool<T> implements Closeable {\n\n\tprivate final PoolService<T> pool;\n\n\tpublic ViberObjectPool(int poolSize, Supplier<T> producer) {\n\t\tPoolObjectFactory<T> poolObjectFactory = new PoolObjectFactory<T>() {\n\n\t\t\t@Override\n\t\t\tpublic T create() {\n\t\t\t\treturn producer.get();\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic boolean readyToTake(T obj) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic boolean readyToRestore(T obj) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void destroy(T obj) {\n\t\t\t\tif (obj instanceof AutoCloseable) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t((AutoCloseable) obj).close();\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\te.printStackTrace();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tConcurrentCollection<T> concurrentCollection = new  MultithreadConcurrentQueueCollection<>(poolSize);\n\t\tpool = new ConcurrentPool<>(concurrentCollection, poolObjectFactory, poolSize, poolSize, false);\n\t}\n\n\tpublic T borrow() {\n\t\treturn pool.take();\n\t}\n\n\tpublic void release(T t) {\n\t\tif (t == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tpool.restore(t);\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\tpool.close();\n\t}\n\n}"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/pool/WaitStrategy.java",
    "content": "package benchmark.pool;\n\nimport java.util.concurrent.locks.LockSupport;\n\npublic final class WaitStrategy {\n\n\tpublic final int idle(final int idleCounter) {\n\n\t\tfinal int idled = idleCounter + 1;\n\n\t\tif (idleCounter < 10) {\n\t\t\tThread.onSpinWait();\n\t\t\treturn idled;\n\t\t}\n\n\t\tif (idleCounter < 10 + 10) {\n\t\t\tThread.yield();\n\t\t\treturn idled;\n\t\t}\n\n\t\tLockSupport.parkNanos(1L);\n\n\t\treturn idled;\n\t}\n\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/rpc/AbstractClient.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\npublic abstract class AbstractClient {\n\tprivate final AtomicInteger counter = new AtomicInteger(0);\n\tprivate final UserService _serviceUserService = new UserServiceServerImpl();\n\n\tprotected abstract UserService getUserService();\n\n\tpublic boolean existUser() throws Exception {\n\t\tString email = String.valueOf(counter.getAndIncrement());\n\t\treturn getUserService().existUser(email);\n\t}\n\n\tpublic boolean createUser() throws Exception {\n\t\tint id = counter.getAndIncrement();\n\t\tUser user = _serviceUserService.getUser(id);\n\t\treturn getUserService().createUser(user);\n\t}\n\n\tpublic User getUser() throws Exception {\n\t\tint id = counter.getAndIncrement();\n\t\treturn getUserService().getUser(id);\n\t}\n\n\tpublic Page<User> listUser() throws Exception {\n\t\tint pageNo = counter.getAndIncrement();\n\t\treturn getUserService().listUser(pageNo);\n\t}\n\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/rpc/protocol/Request.java",
    "content": "package benchmark.rpc.protocol;\n\nimport java.io.Serializable;\nimport java.util.Arrays;\n\npublic class Request implements Serializable {\n\tprivate static final long serialVersionUID = 7798556948864269597L;\n\n\tprivate long requestId;\n\tprivate int serviceId;\n\tprivate Object[] params;\n\n\tpublic long getRequestId() {\n\t\treturn requestId;\n\t}\n\n\tpublic void setRequestId(long requestId) {\n\t\tthis.requestId = requestId;\n\t}\n\n\tpublic int getServiceId() {\n\t\treturn serviceId;\n\t}\n\n\tpublic void setServiceId(int serviceId) {\n\t\tthis.serviceId = serviceId;\n\t}\n\n\tpublic Object[] getParams() {\n\t\treturn params;\n\t}\n\n\tpublic void setParams(Object[] params) {\n\t\tthis.params = params;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Request [requestId=\" + requestId + \", serviceId=\" + serviceId + \", params=\" + Arrays.toString(params)\n\t\t\t\t+ \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/rpc/protocol/Response.java",
    "content": "package benchmark.rpc.protocol;\n\nimport java.io.Serializable;\n\npublic class Response implements Serializable {\n\tprivate static final long serialVersionUID = -2827803061483152127L;\n\n\tprivate long requestId;\n\tprivate byte statusCode;\n\tprivate Object result;\n\n\tpublic long getRequestId() {\n\t\treturn requestId;\n\t}\n\n\tpublic void setRequestId(long requestId) {\n\t\tthis.requestId = requestId;\n\t}\n\n\tpublic byte getStatusCode() {\n\t\treturn statusCode;\n\t}\n\n\tpublic void setStatusCode(byte statusCode) {\n\t\tthis.statusCode = statusCode;\n\t}\n\n\tpublic Object getResult() {\n\t\treturn result;\n\t}\n\n\tpublic void setResult(Object result) {\n\t\tthis.result = result;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Response [requestId=\" + requestId + \", statusCode=\" + statusCode + \", result=\" + result + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/rpc/route/RouteService.java",
    "content": "package benchmark.rpc.route;\n\nimport static benchmark.service.ServiceRegister.CREATE_USER;\nimport static benchmark.service.ServiceRegister.EXIST_USER;\nimport static benchmark.service.ServiceRegister.GET_USER;\nimport static benchmark.service.ServiceRegister.LIST_USER;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\npublic class RouteService {\n\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\tpublic Object invoke(int serviceId, Object[] params) {\n\n\t\tswitch (serviceId) {\n\t\tcase EXIST_USER:\n\t\t\treturn userService.existUser((String) params[0]);\n\n\t\tcase CREATE_USER:\n\t\t\treturn userService.createUser((User) params[0]);\n\n\t\tcase GET_USER:\n\t\t\treturn userService.getUser((Long) params[0]);\n\n\t\tcase LIST_USER:\n\t\t\treturn userService.listUser((Integer) params[0]);\n\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/rpc/util/ByteBufferUtils.java",
    "content": "package benchmark.rpc.util;\n\nimport static java.nio.charset.StandardCharsets.UTF_8;\n\nimport java.nio.ByteBuffer;\n\npublic class ByteBufferUtils {\n\n\tpublic static ByteBuffer allocateDirect(String str) {\n\t\treturn _allocateByteBuffer(str.getBytes(UTF_8), true);\n\t}\n\n\tpublic static ByteBuffer allocate(String str) {\n\t\treturn _allocateByteBuffer(str.getBytes(UTF_8), false);\n\t}\n\n\tpublic static ByteBuffer allocate(byte[] bytes) {\n\t\treturn _allocateByteBuffer(bytes, false);\n\t}\n\n\tprivate static ByteBuffer _allocateByteBuffer(byte[] bytes, boolean isDirect) {\n\t\tfinal ByteBuffer buffer = isDirect ? //\n\t\t\t\tByteBuffer.allocateDirect(bytes.length) : //\n\t\t\t\tByteBuffer.allocate(bytes.length);\n\n\t\tbuffer.put(bytes);\n\t\tbuffer.flip();\n\n\t\treturn buffer;\n\t}\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/rpc/util/HttpClientUtils.java",
    "content": "package benchmark.rpc.util;\n\nimport org.apache.http.client.config.RequestConfig;\nimport org.apache.http.config.SocketConfig;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.impl.client.HttpClientBuilder;\nimport org.apache.http.impl.conn.PoolingHttpClientConnectionManager;\n\npublic class HttpClientUtils {\n\n\tpublic static final int SOCKET_TIMEOUT = 60000;\n\tpublic static final int CONNECTION_REQUEST_TIMEOUT = 60000;\n\tpublic static final int CONNECT_TIMEOUT = 60000;\n\n\tpublic static CloseableHttpClient createHttpClient(int concurrency) {\n\t\tHttpClientBuilder builder = HttpClientBuilder.create();\n\n\t\tPoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();\n\t\tconnManager.setDefaultMaxPerRoute(concurrency);\n\t\tconnManager.setMaxTotal(concurrency);\n\n\t\tRequestConfig requestConfig = RequestConfig.custom()//\n\t\t\t\t.setAuthenticationEnabled(true)//\n\t\t\t\t.setSocketTimeout(SOCKET_TIMEOUT)//\n\t\t\t\t.setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT)//\n\t\t\t\t.setConnectTimeout(CONNECT_TIMEOUT)//\n\t\t\t\t.setRedirectsEnabled(true)//\n\t\t\t\t.setRelativeRedirectsAllowed(true)//\n\t\t\t\t.setMaxRedirects(15)//\n\t\t\t\t.build();\n\n\t\tSocketConfig socketConfig = SocketConfig.custom()//\n\t\t\t\t.setSoKeepAlive(true)//\n\t\t\t\t.setSoReuseAddress(true)//\n\t\t\t\t.build();\n\n\t\tbuilder.setConnectionManager(connManager);\n\t\tbuilder.setDefaultSocketConfig(socketConfig);\n\t\tbuilder.setDefaultRequestConfig(requestConfig);\n\n\t\treturn builder.build();\n\t}\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/rpc/util/JsonUtils.java",
    "content": "package benchmark.rpc.util;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.datatype.jdk8.Jdk8Module;\nimport com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;\nimport com.fasterxml.jackson.module.afterburner.AfterburnerModule;\n\npublic class JsonUtils {\n\tpublic static final ObjectMapper objectMapper = new ObjectMapper();\n\n\tstatic {\n\t\tobjectMapper.registerModule(new Jdk8Module());\n\t\tobjectMapper.registerModule(new JavaTimeModule());\n\t\tobjectMapper.registerModule(new AfterburnerModule());\n\t}\n\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/service/ServiceRegister.java",
    "content": "package benchmark.service;\n\npublic interface ServiceRegister {\n\tpublic static final int EXIST_USER = 0;\n\tpublic static final int CREATE_USER = 1;\n\tpublic static final int GET_USER = 2;\n\tpublic static final int LIST_USER = 3;\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/service/UserService.java",
    "content": "package benchmark.service;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\n\npublic interface UserService {\n\tpublic boolean existUser(String email);\n\n\tpublic boolean createUser(User user);\n\n\tpublic User getUser(long id);\n\n\tpublic Page<User> listUser(int pageNo);\n\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/service/UserServiceJsonHttpClientImpl.java",
    "content": "package benchmark.service;\n\nimport java.nio.charset.StandardCharsets;\n\nimport org.apache.http.HttpEntity;\nimport org.apache.http.client.entity.EntityBuilder;\nimport org.apache.http.client.methods.CloseableHttpResponse;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.util.EntityUtils;\n\nimport com.fasterxml.jackson.databind.JavaType;\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.util.HttpClientUtils;\nimport benchmark.rpc.util.JsonUtils;\n\n/**\n * only for client\n * \n * @author Hank\n *\n */\npublic class UserServiceJsonHttpClientImpl implements UserService {\n\n\tprivate static final String URL_EXIST_USER = \"http://benchmark-server:8080/user-exist?email=\";\n\tprivate static final String URL_CREATE_USER = \"http://benchmark-server:8080/create-user\";\n\tprivate static final String URL_GET_USER = \"http://benchmark-server:8080/get-user?id=\";\n\tprivate static final String URL_LIST_USER = \"http://benchmark-server:8080/list-user?pageNo=\";\n\n\tprivate final CloseableHttpClient client;\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\tprivate final JavaType userPageType = objectMapper.getTypeFactory()//\n\t\t\t.constructParametricType(Page.class, User.class);\n\n\tpublic UserServiceJsonHttpClientImpl(int concurrency) {\n\t\tclient = HttpClientUtils.createHttpClient(concurrency);\n\t}\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\ttry {\n\t\t\tString url = URL_EXIST_USER + email;\n\n\t\t\tHttpGet request = new HttpGet(url);\n\t\t\tCloseableHttpResponse response = client.execute(request);\n\n\t\t\tString result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);\n\n\t\t\treturn \"true\".equals(result);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean createUser(User user) {\n\t\ttry {\n\t\t\tbyte[] bytes = objectMapper.writeValueAsBytes(user);\n\n\t\t\tHttpPost request = new HttpPost(URL_CREATE_USER);\n\t\t\tHttpEntity entity = EntityBuilder.create().setBinary(bytes).build();\n\t\t\trequest.setEntity(entity);\n\n\t\t\tCloseableHttpResponse response = client.execute(request);\n\n\t\t\tString result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);\n\n\t\t\treturn \"true\".equals(result);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic User getUser(long id) {\n\t\ttry {\n\t\t\tString url = URL_GET_USER + id;\n\n\t\t\tHttpGet request = new HttpGet(url);\n\t\t\tCloseableHttpResponse response = client.execute(request);\n\n\t\t\tbyte[] bytes = EntityUtils.toByteArray(response.getEntity());\n\n\t\t\treturn objectMapper.readValue(bytes, User.class);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic Page<User> listUser(int pageNo) {\n\t\ttry {\n\t\t\tString url = URL_LIST_USER + pageNo;\n\n\t\t\tHttpGet request = new HttpGet(url);\n\t\t\tCloseableHttpResponse response = client.execute(request);\n\n\t\t\tbyte[] bytes = EntityUtils.toByteArray(response.getEntity());\n\n\t\t\treturn objectMapper.readValue(bytes, userPageType);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tUserService userService = new UserServiceJsonHttpClientImpl(256);\n\n\t\tSystem.out.println(userService.existUser(\"1236\"));\n\t\tSystem.out.println(userService.getUser(123));\n\t\tSystem.out.println(userService.listUser(123));\n\t}\n\n}\n"
  },
  {
    "path": "benchmark-base/src/main/java/benchmark/service/UserServiceServerImpl.java",
    "content": "package benchmark.service;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\n\n/**\n * only for server\n * \n * @author Hank\n *\n */\npublic class UserServiceServerImpl implements UserService {\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\tif (email == null || email.isEmpty()) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (email.charAt(email.length() - 1) < '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic User getUser(long id) {\n\t\tUser user = new User();\n\n\t\tuser.setId(id);\n\t\tuser.setName(new String(\"Doug Lea\"));\n\t\tuser.setSex(1);\n\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\tuser.setEmail(new String(\"dong.lea@gmail.com\"));\n\t\tuser.setMobile(new String(\"18612345678\"));\n\t\tuser.setAddress(new String(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\"));\n\t\tuser.setIcon(new String(\"https://www.baidu.com/img/bd_logo1.png\"));\n\t\tuser.setStatus(1);\n\t\tuser.setCreateTime(LocalDateTime.now());\n\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\tList<Integer> permissions = new ArrayList<Integer>(\n\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\n\t\tuser.setPermissions(permissions);\n\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic Page<User> listUser(int pageNo) {\n\t\tList<User> userList = new ArrayList<>(15);\n\n\t\tfor (int i = 0; i < 15; i++) {\n\t\t\tUser user = new User();\n\n\t\t\tuser.setId(i);\n\t\t\tuser.setName(\"Doug Lea\" + i);\n\t\t\tuser.setSex(1);\n\t\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\t\tuser.setEmail(\"dong.lea@gmail.com\" + i);\n\t\t\tuser.setMobile(\"18612345678\" + i);\n\t\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\" + i);\n\t\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\" + i);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setCreateTime(LocalDateTime.now());\n\t\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\t\tList<Integer> permissions = new ArrayList<Integer>(\n\t\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\t\tuser.setPermissions(permissions);\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tPage<User> page = new Page<>();\n\t\tpage.setPageNo(pageNo);\n\t\tpage.setTotal(1000);\n\t\tpage.setResult(userList);\n\n\t\treturn page;\n\t}\n\n\t@Override\n\tpublic boolean createUser(User user) {\n\t\tif (user == null) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "benchmark.java",
    "content": "import java.io.*;\nimport java.nio.charset.StandardCharsets;\nimport java.nio.file.Files;\nimport java.time.LocalDateTime;\nimport java.util.Arrays;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.concurrent.TimeUnit;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\npublic class benchmark {\n\n    private final static String jvmOps = \"java -server -Xmx1g -Xms1g -XX:MaxDirectMemorySize=1g -XX:+UseG1GC\";\n    private final static File resultFolder = new File(\"benchmark-result\");\n\n    private final static List<String> funOrder = List.of(\"existUser\", \"createUser\", \"getUser\", \"listUser\");\n    Item emptyItem = new Item(null, Typ.Thrpt, null, 0D);\n\n\n    public static void main(String[] args) throws Exception {\n        installBenchmarkBase();\n\n        var allTasks = getAllTasks()\n                .filter(t -> !t.startsWith(\"jupiter\"))\n                //.filter(t -> t.compareTo(\"jupiter\") > 0)\n                .collect(Collectors.toList());\n\n        System.out.println(\"找到以下benchmark项目:\");\n        System.out.println(allTasks);\n\n        allTasks.forEach(benchmark::benchmark);\n\n        report();\n    }\n\n    private static void installBenchmarkBase() throws Exception {\n        exec(\"benchmark-base\", \"mvn clean install\");\n    }\n\n    private static Stream<String> getAllTasks() {\n        var folder = new File(\".\");\n\n        return Stream.of(folder.list())\n                .filter(name -> name.endsWith(\"-client\"))\n                .map(name -> name.substring(0, name.length() - \"-client\".length()))\n                .sorted();\n    }\n\n    private static void benchmark(String taskName) {\n        try {\n            var serverPackage = packageAndGet(new File(taskName + \"-server\"));\n            var clientPackage = packageAndGet(new File(taskName + \"-client\"));\n\n            startServer(serverPackage);\n\n            //等服务器启动起来在启动客户端\n            TimeUnit.SECONDS.sleep(5);\n\n            startClient(clientPackage);\n            stopServer(serverPackage);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    private static File packageAndGet(File project) throws Exception {\n        exec(project, \"mvn clean package\", null);\n\n        var childList = new File(project, \"target\").listFiles();\n\n        var opt = Stream.of(childList)\n                .filter(f -> f.getName().endsWith(\"-jar-with-dependencies.jar\"))\n                .findFirst();\n\n        if (opt.isPresent()) {\n            return opt.get();\n        }\n\n        return Stream.of(childList)\n                .filter(f -> !f.getName().startsWith(\"original-\"))\n                .filter(f -> f.getName().endsWith(\".jar\"))\n                .findFirst()\n                .get();\n    }\n\n    private static String taskName(File pkg) {\n        var name = pkg.getName();\n\n        if (name.endsWith(\"-jar-with-dependencies.jar\")) {\n            return name.substring(0, name.length() - \"-jar-with-dependencies.jar\".length());\n        } else {\n            return name.substring(0, name.length() - \".jar\".length());\n        }\n    }\n\n    private static void startServer(File serverPackage) throws Exception {\n        var name = serverPackage.getName();\n        System.out.printf(\"start %s\\r\\n\", name);\n\n        var resultPath = taskName(serverPackage) + \".log\";\n\n        //copy到benchmark-server\n        exec(serverPackage.getParentFile(), \"scp \" + name + \" benchmark@benchmark-server:~\", null);\n\n        if (name.contains(\"servicecomb\")) {\n            //杀掉benchmark-server上的老servicecomb-service-center进程\n            exec(\"ssh\", \"benchmark@benchmark-server\", \"killall service-center\");\n\n            //benchmark-server上启动servicecomb-service-center服务\n            var downloadCommand = \"wget https://mirrors.tuna.tsinghua.edu.cn/apache/servicecomb/servicecomb-service-center/1.1.0/apache-servicecomb-service-center-1.1.0-linux-amd64.tar.gz\";\n            var unzipCommand = \"tar xvf apache-servicecomb-service-center-1.1.0-linux-amd64.tar.gz\";\n            var confCommand = \"sed -i \\\"s/127.0.0.1/benchmark-server/g\\\" ~/apache-servicecomb-service-center-1.1.0-linux-amd64/conf/app.conf\";\n            var runCommand = \"bash apache-servicecomb-service-center-1.1.0-linux-amd64/start-service-center.sh\";\n\n            exec(\"ssh\", \"benchmark@benchmark-server\", downloadCommand);\n            exec(\"ssh\", \"benchmark@benchmark-server\", unzipCommand);\n            exec(\"ssh\", \"benchmark@benchmark-server\", confCommand);\n            exec(\"ssh\", \"benchmark@benchmark-server\", runCommand);\n        }\n\n        //杀掉benchmark-server上的老进程\n        exec(\"ssh\", \"benchmark@benchmark-server\", \"killall java\");\n\n        //benchmark-server上启动服务器\n        var remoteCommand = String.format(\"nohup %s -jar %s >> %s &\", jvmOps, name, resultPath);\n        exec(\"ssh\", \"benchmark@benchmark-server\", remoteCommand);\n    }\n\n    private static void stopServer(File serverPackage) throws Exception {\n        var name = serverPackage.getName();\n        System.out.println(\"stop \" + name);\n\n        //benchmark-server上启动服务器\n        exec(\"ssh\", \"benchmark@benchmark-server\", \"killall java\");\n\n        if (name.contains(\"servicecomb\")) {\n            //杀掉benchmark-server上的老servicecomb-service-center进程\n            exec(\"ssh\", \"benchmark@benchmark-server\", \"killall service-center\");\n        }\n    }\n\n    private static void startClient(File clientPackage) throws Exception {\n        var name = clientPackage.getName();\n        System.out.println(\"start \" + name);\n\n        var resultFile = new File(resultFolder, taskName(clientPackage) + \".log\");\n\n        var command = jvmOps + \" -jar \" + name;\n\n        //启动客户端\n        exec(clientPackage.getParentFile(), command, resultFile);\n    }\n\n    private static void exec(String path, String command) throws Exception {\n        if (path != null) {\n            exec(new File(path), command, null);\n        } else {\n            exec((File) null, command, null);\n        }\n    }\n\n    private static void exec(String command) throws Exception {\n        exec((File) null, command, null);\n    }\n\n    private static void exec(File file, String command, File redirect) throws Exception {\n        var process = Runtime.getRuntime().exec(command, null, file);\n\n        if (redirect != null && !redirect.exists()) {\n            redirect.getParentFile().mkdirs();\n        }\n\n        try (var inputStream = process.getInputStream();\n             var inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);\n             var reader = new BufferedReader(inputStreamReader);\n             var output = redirect != null ? new FileOutputStream(redirect) : null;) {\n\n            var line = \"\";\n            while ((line = reader.readLine()) != null) {\n                System.out.println(line);\n\n                if (output != null) {\n                    output.write(line.getBytes(\"UTF-8\"));\n                    output.write(\"\\r\\n\".getBytes(\"UTF-8\"));\n                }\n            }\n        } catch (Throwable t) {\n            t.printStackTrace();\n        }\n\n        process.waitFor();\n        process.destroy();\n    }\n\n    private static void exec(String... commands) throws Exception {\n        System.out.println(Arrays.toString(commands));\n        var process = Runtime.getRuntime().exec(commands);\n\n        try (var inputStream = process.getInputStream();\n             var inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);\n             var reader = new BufferedReader(inputStreamReader);) {\n\n            var line = \"\";\n            while ((line = reader.readLine()) != null) {\n                System.out.println(line);\n            }\n        } catch (Throwable t) {\n            t.printStackTrace();\n        }\n\n        process.waitFor();\n        process.destroy();\n    }\n\n    public static void report() throws Exception {\n        var reportFile = new File(resultFolder, \"benchmark-report.md\");\n        var reportWriter = new FileWriter(reportFile, StandardCharsets.UTF_8);\n        var props = System.getProperties();\n\n        reportWriter.write(\"# RPC性能报告\\r\\n\");\n\n        reportWriter.write(\"> 生成时间: \" + LocalDateTime.now() + \"<br>\\r\\n\");\n        reportWriter.write(\"> 运行环境: \" + props.getProperty(\"os.name\") + \", \" + props.getProperty(\"java.vm.name\") + \" \" + props.getProperty(\"java.runtime.version\") + \"<br>\\r\\n\");\n        reportWriter.write(\"> 启动参数: \" + jvmOps + \"<br>\\r\\n\");\n\n        reportWriter.write(\"\\r\\n\");\n\n        var header = \"| framework | thrpt (ops/ms) | avgt (ms) | p90 (ms) | p99 (ms) | p999 (ms) |\\r\\n\"\n                + \"|:--- |:---:|:---:|:---:|:---:|:---:|\\r\\n\";\n\n        Stream.of(resultFolder.listFiles())\n                .filter(f -> f.getName().endsWith(\".log\"))\n                .filter(f -> f.getName().contains(\"-client-\"))\n                .flatMap(resultFile -> {\n                    var name = resultFile.getName();\n                    var index = name.indexOf(\"-client-\");\n                    var task = name.substring(0, index);\n\n                    return uncheck(() -> Files\n                            .lines(resultFile.toPath(), StandardCharsets.UTF_8)\n                            .filter(line -> line.startsWith(\"Client.\"))\n                            .map(line -> extract(task, line))\n                            .filter(item -> item != null));\n                })\n                .collect(Collectors.groupingBy(i -> i.fun))\n                .entrySet()\n                .stream()\n                .sorted(Comparator.comparingInt(kv -> funOrder.indexOf(kv.getKey())))\n                .forEach(kv -> {\n                    var fun = kv.getKey();\n                    var items = kv.getValue();\n                    var records = toRecords(items);\n\n                    uncheck(() -> reportWriter.write(\"\\r\\n## \" + fun + \"\\r\\n\"));\n                    uncheck(() -> reportWriter.write(header));\n\n                    records.forEach(record -> {\n                        var line = Stream\n                                .of(record.task, record.thrpt, record.avgt, record.p90, record.p99, record.p999)\n                                .map(Objects::toString)\n                                .collect(Collectors.joining(\"|\", \"|\", \"|\\r\\n\"));\n\n                        uncheck(() -> reportWriter.write(line));\n                    });\n\n                    uncheck(() -> reportWriter.write(\"\\r\\n\"));\n                });\n\n        reportWriter.flush();\n        reportWriter.close();\n\n        System.out.println(\"成功生成性能报告: \" + reportFile.getAbsolutePath());\n    }\n\n    private static List<Record> toRecords(List<Item> items) {\n        return items\n                .stream()\n                .collect(Collectors.groupingBy(item -> item.task))\n                .values()\n                .stream()\n                .map(list -> {\n                    var task = list.get(0).task;\n\n                    var thrpt = getScore(list, Typ.Thrpt);\n                    var avgt = getScore(list, Typ.Avgt);\n                    var p90 = getScore(list, Typ.P90);\n                    var p99 = getScore(list, Typ.P99);\n                    var p999 = getScore(list, Typ.P999);\n\n                    return new Record(task, thrpt, avgt, p90, p99, p999);\n                })\n                .sorted(Comparator.comparingDouble(r -> -r.thrpt))\n                .collect(Collectors.toList());\n    }\n\n    private static double getScore(List<Item> items, Typ typ) {\n        return items.stream().filter(i -> i.typ == typ).findFirst().get().score;\n    }\n\n    private static Item extract(String task, String line) {\n        if (line == null || line.length() == 0) {\n            return null;\n        }\n\n        if (line.contains(\" thrpt \")) {\n            var array = line.split(\"\\\\s+\");\n\n            var fun = array[0].replace(\"Client.\", \"\");\n            var score = Double.parseDouble(array[3]);\n\n            return new Item(task, Typ.Thrpt, fun, score);\n        }\n\n        if (line.contains(\" avgt \")) {\n            var array = line.split(\"\\\\s+\");\n\n            var fun = array[0].replace(\"Client.\", \"\");\n            var score = Double.parseDouble(array[3]);\n\n            return new Item(task, Typ.Avgt, fun, score);\n        }\n\n        if (line.contains(\"·p0.90 \")) {\n            var array = line.split(\"\\\\s+\");\n\n            var fun = array[0];\n            var begin = fun.indexOf(':') + 1;\n            var end = fun.indexOf('·');\n            fun = fun.substring(begin, end);\n\n            var score = Double.parseDouble(array[2]);\n\n            return new Item(task, Typ.P90, fun, score);\n        }\n\n        if (line.contains(\"·p0.99 \")) {\n            var array = line.split(\"\\\\s+\");\n\n            var fun = array[0];\n            var begin = fun.indexOf(':') + 1;\n            var end = fun.indexOf('·');\n            fun = fun.substring(begin, end);\n\n            var score = Double.parseDouble(array[2]);\n\n            return new Item(task, Typ.P99, fun, score);\n        }\n\n        if (line.contains(\"·p0.999 \")) {\n            var array = line.split(\"\\\\s+\");\n\n            var fun = array[0];\n            var begin = fun.indexOf(':') + 1;\n            var end = fun.indexOf('·');\n            fun = fun.substring(begin, end);\n\n            var score = Double.parseDouble(array[2]);\n\n            return new Item(task, Typ.P999, fun, score);\n        }\n\n        return null;\n    }\n\n    private static <T> T uncheck(UncheckedSupplier<T> fun) {\n        try {\n            return fun.get();\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    private static void uncheck(UncheckedFunction fun) {\n        try {\n            fun.apply();\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    @FunctionalInterface\n    private static interface UncheckedSupplier<T> {\n        T get() throws Exception;\n    }\n\n    @FunctionalInterface\n    private static interface UncheckedFunction {\n        void apply() throws Exception;\n    }\n\n}\n\n\nenum Typ {\n    Thrpt(\"Thrpt\"), Avgt(\"Avgt\"), P90(\"P90\"), P99(\"P99\"), P999(\"P999\");\n\n    public final String name;\n\n    private Typ(String name) {\n        this.name = name;\n    }\n}\n\n\nclass Item {\n    public final String task;\n    public final Typ typ;\n    public final String fun;\n    public final double score;\n\n    public Item(String task, Typ typ, String fun, double score) {\n        this.task = task;\n        this.typ = typ;\n        this.fun = fun;\n        this.score = score;\n    }\n}\n\nclass Record {\n    public final String task;\n    public final double thrpt;\n    public final double avgt;\n    public final double p90;\n    public final double p99;\n    public final double p999;\n\n    public Record(String task, double thrpt, double avgt, double p90, double p99, double p999) {\n        this.task = task;\n        this.thrpt = thrpt;\n        this.avgt = avgt;\n        this.p90 = p90;\n        this.p99 = p99;\n        this.p999 = p999;\n    }\n}"
  },
  {
    "path": "brpc-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>brpc-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>brpc-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.brpc>2.5.1</version.brpc>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.baidu</groupId>\n\t\t\t<artifactId>brpc-java</artifactId>\n\t\t\t<version>${version.brpc}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "brpc-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport com.baidu.brpc.client.BrpcProxy;\nimport com.baidu.brpc.client.RpcClient;\nimport com.baidu.brpc.client.RpcClientOptions;\nimport com.baidu.brpc.client.loadbalance.LoadBalanceStrategy;\nimport org.openjdk.jmh.annotations.*;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n    public static final int CONCURRENCY = 32;\n\n    private final UserService userService;\n    private final RpcClient rpcClient;\n\n    public Client() {\n        RpcClientOptions clientOption = new RpcClientOptions();\n        clientOption.setProtocolType(com.baidu.brpc.protocol.Options.ProtocolType.PROTOCOL_HTTP_JSON_VALUE);\n        clientOption.setWriteTimeoutMillis(1000);\n        clientOption.setReadTimeoutMillis(1000);\n        clientOption.setMaxTotalConnections(1000);\n        clientOption.setMinIdleConnections(10);\n        clientOption.setLoadBalanceType(LoadBalanceStrategy.LOAD_BALANCE_RANDOM);\n        clientOption.setCompressType(com.baidu.brpc.protocol.Options.CompressType.COMPRESS_TYPE_ZLIB);\n\n\n        String serviceUrl = \"list://benchmark-server:8002\";\n\n        this.rpcClient = new RpcClient(serviceUrl, clientOption);\n        this.userService = BrpcProxy.getProxy(rpcClient, UserService.class);\n    }\n\n    @Override\n    protected UserService getUserService() {\n        return userService;\n    }\n\n    @TearDown\n    public void close() throws IOException {\n        this.rpcClient.stop();\n    }\n\n    @Benchmark\n    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public boolean existUser() throws Exception {\n        return super.existUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public boolean createUser() throws Exception {\n        return super.createUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public User getUser() throws Exception {\n        return super.getUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public Page<User> listUser() throws Exception {\n        return super.listUser();\n    }\n\n    public static void main(String[] args) throws Exception {\n        Options opt = new OptionsBuilder()//\n                .include(Client.class.getSimpleName())//\n                .warmupIterations(3)//\n                .warmupTime(TimeValue.seconds(10))//\n                .measurementIterations(3)//\n                .measurementTime(TimeValue.seconds(10))//\n                .threads(CONCURRENCY)//\n                .forks(1)//\n                .build();\n\n        new Runner(opt).run();\n    }\n\n}\n"
  },
  {
    "path": "brpc-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "brpc-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>brpc-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>brpc-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.brpc>2.5.1</version.brpc>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.baidu</groupId>\n\t\t\t<artifactId>brpc-java</artifactId>\n\t\t\t<version>${version.brpc}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "brpc-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.service.UserServiceServerImpl;\nimport com.baidu.brpc.protocol.Options;\nimport com.baidu.brpc.server.RpcServer;\nimport com.baidu.brpc.server.RpcServerOptions;\n\npublic class Server {\n\n    public static void main(String[] args) throws InterruptedException {\n        int port = 8002;\n\n        RpcServerOptions options = new RpcServerOptions();\n        options.setReceiveBufferSize(64 * 1024 * 1024);\n        options.setSendBufferSize(64 * 1024 * 1024);\n        options.setKeepAliveTime(20);\n        options.setProtocolType(Options.ProtocolType.PROTOCOL_HTTP_JSON_VALUE);\n\n        final RpcServer rpcServer = new RpcServer(port, options);\n        rpcServer.registerService(new UserServiceServerImpl());\n        rpcServer.start();\n\n        System.out.println(\"START\");\n        Thread.sleep(Long.MAX_VALUE);\n    }\n\n}\n"
  },
  {
    "path": "brpc-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "dubbo-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>dubbo-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>dubbo-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.dubbo>2.7.3</version.dubbo>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.dubbo</groupId>\n\t\t\t<artifactId>dubbo</artifactId>\n\t\t\t<version>${version.dubbo}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "dubbo-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final ClassPathXmlApplicationContext context;\n\tprivate final UserService userService;\n\n\tpublic Client() {\n\t\tcontext = new ClassPathXmlApplicationContext(\"consumer.xml\");\n\t\tcontext.start();\n\t\tuserService = (UserService) context.getBean(\"userService\"); // 获取远程服务代理\n\t}\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tcontext.close();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "dubbo-client/src/main/resources/consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n\t<!-- 消费方应用名，用于计算依赖关系，不是匹配条件，不要与提供方一样 -->\n\t<dubbo:application name=\"benchmark.rpc.dubbo-client\" />\n\n\t<!-- 生成远程服务代理，可以和本地bean一样使用demoService -->\n\t<dubbo:reference id=\"userService\" check=\"false\"\n\t\tinterface=\"benchmark.service.UserService\" url=\"dubbo://benchmark-server:8080\" />\n\n\t<!-- dubbo://benchmark-rpc:8080?serialization=kryo -->\n\n</beans>"
  },
  {
    "path": "dubbo-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "dubbo-kryo-client/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "dubbo-kryo-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>dubbo-kryo-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>dubbo-kryo-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.dubbo>2.7.3</version.dubbo>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.dubbo</groupId>\n\t\t\t<artifactId>dubbo</artifactId>\n\t\t\t<version>${version.dubbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.dubbo</groupId>\n\t\t\t<artifactId>dubbo-serialization-kryo</artifactId>\n\t\t\t<version>${version.dubbo}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "dubbo-kryo-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final ClassPathXmlApplicationContext context;\n\tprivate final UserService userService;\n\n\tpublic Client() {\n\t\tcontext = new ClassPathXmlApplicationContext(\"consumer.xml\");\n\t\tcontext.start();\n\t\tuserService = (UserService) context.getBean(\"userService\"); // 获取远程服务代理\n\t}\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tcontext.close();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "dubbo-kryo-client/src/main/resources/consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n\t<!-- 消费方应用名，用于计算依赖关系，不是匹配条件，不要与提供方一样 -->\n\t<dubbo:application name=\"benchmark.rpc.dubbo-client\" />\n\n\t<!-- 生成远程服务代理，可以和本地bean一样使用demoService -->\n\t<dubbo:reference id=\"userService\" check=\"false\"\n\t\tinterface=\"benchmark.service.UserService\" url=\"dubbo://benchmark-server:8080\" />\n\n\t<!-- dubbo://benchmark-rpc:8080?serialization=kryo -->\n\n</beans>"
  },
  {
    "path": "dubbo-kryo-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "dubbo-kryo-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>dubbo-kryo-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>dubbo-kryo-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.dubbo>2.7.3</version.dubbo>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.dubbo</groupId>\n\t\t\t<artifactId>dubbo</artifactId>\n\t\t\t<version>${version.dubbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.dubbo</groupId>\n\t\t\t<artifactId>dubbo-serialization-kryo</artifactId>\n\t\t\t<version>${version.dubbo}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "dubbo-kryo-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws InterruptedException {\n\t\ttry (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"provider.xml\");) {\n\t\t\tcontext.start();\n\t\t\tThread.sleep(Integer.MAX_VALUE);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "dubbo-kryo-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "dubbo-kryo-server/src/main/resources/provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n\t<!-- 提供方应用信息，用于计算依赖关系 -->\n\t<dubbo:application name=\"benchmark.rpc.dubbo-server\" />\n\n\t<!-- 用dubbo协议在8080端口暴露服务 -->\n\t<dubbo:protocol name=\"dubbo\" host=\"benchmark-server\"\n\t\tport=\"8080\" serialization=\"kryo\" />\n\t<!-- <dubbo:protocol name=\"dubbo\" port=\"8080\" serialization=\"kryo\" /> -->\n\n\t<dubbo:registry address=\"N/A\" />\n\n\t<!-- 声明需要暴露的服务接口 -->\n\t<dubbo:service interface=\"benchmark.service.UserService\"\n\t\tref=\"userService\" />\n\n\t<!-- 和本地bean一样实现服务 -->\n\t<bean id=\"userService\" class=\"benchmark.service.UserServiceServerImpl\" />\n\n</beans>"
  },
  {
    "path": "dubbo-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>dubbo-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>dubbo-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.dubbo>2.7.3</version.dubbo>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.dubbo</groupId>\n\t\t\t<artifactId>dubbo</artifactId>\n\t\t\t<version>${version.dubbo}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "dubbo-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws InterruptedException {\n\t\ttry (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"provider.xml\");) {\n\t\t\tcontext.start();\n\t\t\tThread.sleep(Integer.MAX_VALUE);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "dubbo-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "dubbo-server/src/main/resources/provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n\t<!-- 提供方应用信息，用于计算依赖关系 -->\n\t<dubbo:application name=\"benchmark.rpc.dubbo-server\" />\n\n\t<!-- 用dubbo协议在8080端口暴露服务 -->\n\t<dubbo:protocol name=\"dubbo\" host=\"benchmark-server\"\n\t\tport=\"8080\" />\n\t<!-- <dubbo:protocol name=\"dubbo\" port=\"8080\" serialization=\"kryo\" /> -->\n\n\t<dubbo:registry address=\"N/A\" />\n\n\t<!-- 声明需要暴露的服务接口 -->\n\t<dubbo:service interface=\"benchmark.service.UserService\"\n\t\tref=\"userService\" />\n\n\t<!-- 和本地bean一样实现服务 -->\n\t<bean id=\"userService\" class=\"benchmark.service.UserServiceServerImpl\" />\n\n</beans>"
  },
  {
    "path": "grpc-client/.gitignore",
    "content": "/bin/\n"
  },
  {
    "path": "grpc-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>grpc-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>grpc-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.grpc>1.18.0</version.grpc>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.grpc</groupId>\n\t\t\t<artifactId>grpc-netty</artifactId>\n\t\t\t<version>${version.grpc}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.grpc</groupId>\n\t\t\t<artifactId>grpc-protobuf</artifactId>\n\t\t\t<version>${version.grpc}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.grpc</groupId>\n\t\t\t<artifactId>grpc-stub</artifactId>\n\t\t\t<version>${version.grpc}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<extensions>\n\t\t\t<extension>\n\t\t\t\t<groupId>kr.motd.maven</groupId>\n\t\t\t\t<artifactId>os-maven-plugin</artifactId>\n\t\t\t\t<version>1.6.1</version>\n\t\t\t</extension>\n\t\t</extensions>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.xolstice.maven.plugins</groupId>\n\t\t\t\t<artifactId>protobuf-maven-plugin</artifactId>\n\t\t\t\t<version>0.6.1</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<protocArtifact>com.google.protobuf:protoc:3.6.0:exe:${os.detected.classifier}</protocArtifact>\n\t\t\t\t\t<pluginId>grpc-java</pluginId>\n\t\t\t\t\t<pluginArtifact>io.grpc:protoc-gen-grpc-java:${version.grpc}:exe:${os.detected.classifier}</pluginArtifact>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>compile</goal>\n\t\t\t\t\t\t\t<goal>compile-custom</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/proto</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "grpc-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.grpc.UserServiceGrpcClientImpl;\nimport benchmark.service.UserService;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserServiceGrpcClientImpl userService = new UserServiceGrpcClientImpl();\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tuserService.close();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tClient client = new Client();\n\n\t\tfor (int i = 0; i < 60; i++) {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(client.getUser());\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\tThread.sleep(1000);\n\t\t\t}\n\t\t}\n\n\t\tclient.close();\n\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "grpc-client/src/main/java/benchmark/rpc/grpc/GrpcUserServiceClient.java",
    "content": "package benchmark.rpc.grpc;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport io.grpc.ManagedChannel;\nimport io.grpc.ManagedChannelBuilder;\n\npublic class GrpcUserServiceClient implements Closeable {\n\n\tpublic final ManagedChannel channel;\n\tpublic final UserServiceGrpc.UserServiceBlockingStub userServiceBlockingStub;\n\n\tpublic GrpcUserServiceClient(String host, int port) {\n\t\tManagedChannelBuilder<?> channelBuilder = ManagedChannelBuilder//\n\t\t\t\t.forAddress(host, port)//\n\t\t\t\t.idleTimeout(5, TimeUnit.SECONDS)//\n\t\t\t\t.usePlaintext(true);\n\n\t\tchannel = channelBuilder.build();\n\t\tuserServiceBlockingStub = UserServiceGrpc.newBlockingStub(channel);\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\ttry {\n\t\t\tchannel.shutdown().awaitTermination(5, TimeUnit.SECONDS);\n\t\t} catch (InterruptedException e) {\n\t\t\tthrow new IOException(e);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "grpc-client/src/main/java/benchmark/rpc/grpc/UserServiceGrpcClientImpl.java",
    "content": "package benchmark.rpc.grpc;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.ZoneOffset;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.grpc.UserServiceOuterClass.CreateUserResponse;\nimport benchmark.rpc.grpc.UserServiceOuterClass.GetUserRequest;\nimport benchmark.rpc.grpc.UserServiceOuterClass.ListUserRequest;\nimport benchmark.rpc.grpc.UserServiceOuterClass.UserExistRequest;\nimport benchmark.rpc.grpc.UserServiceOuterClass.UserExistResponse;\nimport benchmark.rpc.grpc.UserServiceOuterClass.UserPage;\nimport benchmark.service.UserService;\nimport io.grpc.ManagedChannel;\nimport io.grpc.ManagedChannelBuilder;\n\npublic class UserServiceGrpcClientImpl implements UserService, Closeable {\n\n\tprivate final String host = \"benchmark-server\";\n\tprivate final int port = 8080;\n\n\tprivate final ManagedChannel channel;\n\tprivate final UserServiceGrpc.UserServiceBlockingStub userServiceBlockingStub;\n\n\tpublic UserServiceGrpcClientImpl() {\n\t\tManagedChannelBuilder<?> channelBuilder = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true);\n\t\tchannel = channelBuilder.build();\n\t\tuserServiceBlockingStub = UserServiceGrpc.newBlockingStub(channel);\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\ttry {\n\t\t\tchannel.shutdown().awaitTermination(5, TimeUnit.SECONDS);\n\t\t} catch (InterruptedException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\tUserExistRequest request = UserExistRequest.newBuilder().setEmail(email).build();\n\t\tUserExistResponse response = userServiceBlockingStub.userExist(request);\n\n\t\treturn response.getExist();\n\t}\n\n\t@Override\n\tpublic boolean createUser(User user) {\n\t\tbenchmark.rpc.grpc.UserServiceOuterClass.User request = benchmark.rpc.grpc.UserServiceOuterClass.User\n\t\t\t\t.newBuilder()//\n\t\t\t\t.setId(user.getId())//\n\t\t\t\t.setName(user.getName())//\n\t\t\t\t.setSex(user.getSex())//\n\t\t\t\t.setBirthday((int) (user.getBirthday().toEpochDay()))//\n\t\t\t\t.setEmail(user.getEmail())//\n\t\t\t\t.setMobile(user.getMobile())//\n\t\t\t\t.setAddress(user.getAddress())//\n\t\t\t\t.setIcon(user.getIcon())//\n\t\t\t\t.addAllPermissions(user.getPermissions())//\n\t\t\t\t.setStatus(user.getStatus())//\n\t\t\t\t.setCreateTime(user.getCreateTime().toEpochSecond(ZoneOffset.UTC))//\n\t\t\t\t.setUpdateTime(user.getUpdateTime().toEpochSecond(ZoneOffset.UTC))//\n\t\t\t\t.build();\n\n\t\tCreateUserResponse response = userServiceBlockingStub.createUser(request);\n\n\t\treturn response.getSuccess();\n\t}\n\n\t@Override\n\tpublic User getUser(long id) {\n\t\tGetUserRequest request = GetUserRequest.newBuilder().setId(id).build();\n\t\tbenchmark.rpc.grpc.UserServiceOuterClass.User response = userServiceBlockingStub.getUser(request);\n\n\t\tUser user = new User();\n\t\tuser.setId(response.getId());\n\t\tuser.setName(response.getName());\n\t\tuser.setSex(response.getSex());\n\t\tuser.setBirthday(LocalDate.ofEpochDay(response.getBirthday()));\n\t\tuser.setEmail(response.getEmail());\n\t\tuser.setMobile(response.getMobile());\n\t\tuser.setAddress(response.getAddress());\n\t\tuser.setIcon(response.getIcon());\n\t\tuser.setPermissions(response.getPermissionsList());\n\t\tuser.setStatus(response.getStatus());\n\t\tuser.setCreateTime(LocalDateTime.ofEpochSecond(response.getCreateTime(), 0, ZoneOffset.UTC));\n\t\tuser.setUpdateTime(LocalDateTime.ofEpochSecond(response.getUpdateTime(), 0, ZoneOffset.UTC));\n\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic Page<User> listUser(int pageNo) {\n\t\tListUserRequest request = ListUserRequest.newBuilder().setPageNo(pageNo).build();\n\t\tUserPage response = userServiceBlockingStub.listUser(request);\n\n\t\tPage<User> page = new Page<>();\n\n\t\tpage.setPageNo(response.getPageNo());\n\t\tpage.setTotal(response.getTotal());\n\n\t\tList<User> userList = new ArrayList<>(response.getResultCount());\n\n\t\tfor (benchmark.rpc.grpc.UserServiceOuterClass.User u : response.getResultList()) {\n\t\t\tUser user = new User();\n\t\t\tuser.setId(u.getId());\n\t\t\tuser.setName(u.getName());\n\t\t\tuser.setSex(u.getSex());\n\t\t\tuser.setBirthday(LocalDate.ofEpochDay(u.getBirthday()));\n\t\t\tuser.setEmail(u.getEmail());\n\t\t\tuser.setMobile(u.getMobile());\n\t\t\tuser.setAddress(u.getAddress());\n\t\t\tuser.setIcon(u.getIcon());\n\t\t\tuser.setPermissions(u.getPermissionsList());\n\t\t\tuser.setStatus(u.getStatus());\n\t\t\tuser.setCreateTime(LocalDateTime.ofEpochSecond(u.getCreateTime(), 0, ZoneOffset.UTC));\n\t\t\tuser.setUpdateTime(LocalDateTime.ofEpochSecond(u.getUpdateTime(), 0, ZoneOffset.UTC));\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tpage.setResult(userList);\n\n\t\treturn page;\n\t}\n\n}\n"
  },
  {
    "path": "grpc-client/src/main/proto/UserService.proto",
    "content": "syntax = \"proto3\";\npackage grpc;\n\nimport public \"google/protobuf/timestamp.proto\"; \n\noption java_package = \"benchmark.rpc.grpc\";\n\nservice UserService {\n  rpc userExist (UserExistRequest) returns (UserExistResponse) {}\n  \n  rpc createUser (User) returns (CreateUserResponse) {}\n  \n  rpc getUser (GetUserRequest) returns (User) {}\n  \n  rpc listUser (ListUserRequest) returns (UserPage) {}\n}\n\nmessage UserExistRequest {\n  string email = 1;\n}\n\nmessage UserExistResponse {\n  bool exist = 1;\n}\n\nmessage GetUserRequest {\n  int64 id = 1;\n}\n\nmessage User {\n\tint64 id = 1;\n\tstring name = 2;\n\tint32 sex = 3;\n\tint32 birthday = 4;\n\tstring email = 5;\n\tstring mobile = 6;\n\tstring address = 7;\n\tstring icon = 8;\n\trepeated int32 permissions = 9;\n\tint32 status = 10;\n\tint64 createTime = 11;\n\tint64 updateTime = 12;\n}\n\nmessage CreateUserResponse {\n  bool success = 1;\n}\n\nmessage ListUserRequest {\n  int32 pageNo = 1;\n}\n\nmessage UserPage {\n  \tint32 pageNo = 1;\n\tint32 total = 2;\n\trepeated User result = 3;\n}"
  },
  {
    "path": "grpc-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<appender-ref ref=\"console\" />\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "grpc-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>grpc-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>grpc-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.grpc>1.18.0</version.grpc>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.grpc</groupId>\n\t\t\t<artifactId>grpc-netty</artifactId>\n\t\t\t<version>${version.grpc}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.grpc</groupId>\n\t\t\t<artifactId>grpc-protobuf</artifactId>\n\t\t\t<version>${version.grpc}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.grpc</groupId>\n\t\t\t<artifactId>grpc-stub</artifactId>\n\t\t\t<version>${version.grpc}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<extensions>\n\t\t\t<extension>\n\t\t\t\t<groupId>kr.motd.maven</groupId>\n\t\t\t\t<artifactId>os-maven-plugin</artifactId>\n\t\t\t\t<version>1.6.1</version>\n\t\t\t</extension>\n\t\t</extensions>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.xolstice.maven.plugins</groupId>\n\t\t\t\t<artifactId>protobuf-maven-plugin</artifactId>\n\t\t\t\t<version>0.6.1</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<protocArtifact>com.google.protobuf:protoc:3.6.0:exe:${os.detected.classifier}</protocArtifact>\n\t\t\t\t\t<pluginId>grpc-java</pluginId>\n\t\t\t\t\t<pluginArtifact>io.grpc:protoc-gen-grpc-java:${version.grpc}:exe:${os.detected.classifier}</pluginArtifact>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>compile</goal>\n\t\t\t\t\t\t\t<goal>compile-custom</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/proto</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "grpc-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.rpc.grpc.server.UserServiceGrpcServerImpl;\nimport io.grpc.ServerBuilder;\n\npublic class Server {\n\n\tpublic static final String host = \"benchmark-server\";\n\tpublic static final int port = 8080;\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tServerBuilder//\n\t\t\t\t.forPort(port)//\n\t\t\t\t.addService(new UserServiceGrpcServerImpl())//\n\t\t\t\t.build()//\n\t\t\t\t.start()//\n\t\t\t\t.awaitTermination();\n\t}\n\n}\n"
  },
  {
    "path": "grpc-server/src/main/java/benchmark/rpc/grpc/server/UserServiceGrpcServerImpl.java",
    "content": "package benchmark.rpc.grpc.server;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.ZoneOffset;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport benchmark.bean.Page;\nimport benchmark.rpc.grpc.UserServiceGrpc.UserServiceImplBase;\nimport benchmark.rpc.grpc.UserServiceOuterClass.CreateUserResponse;\nimport benchmark.rpc.grpc.UserServiceOuterClass.GetUserRequest;\nimport benchmark.rpc.grpc.UserServiceOuterClass.ListUserRequest;\nimport benchmark.rpc.grpc.UserServiceOuterClass.User;\nimport benchmark.rpc.grpc.UserServiceOuterClass.UserExistRequest;\nimport benchmark.rpc.grpc.UserServiceOuterClass.UserExistResponse;\nimport benchmark.rpc.grpc.UserServiceOuterClass.UserPage;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.grpc.stub.StreamObserver;\n\npublic class UserServiceGrpcServerImpl extends UserServiceImplBase {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tpublic void userExist(UserExistRequest request, StreamObserver<UserExistResponse> responseObserver) {\n\t\tString email = request.getEmail();\n\t\tboolean isExist = userService.existUser(email);\n\n\t\tUserExistResponse reply = UserExistResponse.newBuilder().setExist(isExist).build();\n\n\t\tresponseObserver.onNext(reply);\n\t\tresponseObserver.onCompleted();\n\t}\n\n\t@Override\n\tpublic void getUser(GetUserRequest request, StreamObserver<User> responseObserver) {\n\t\tlong id = request.getId();\n\t\tbenchmark.bean.User user = userService.getUser(id);\n\n\t\tUser reply = User.newBuilder()//\n\t\t\t\t.setId(user.getId())//\n\t\t\t\t.setName(user.getName())//\n\t\t\t\t.setSex(user.getSex())//\n\t\t\t\t.setBirthday((int) (user.getBirthday().toEpochDay()))//\n\t\t\t\t.setEmail(user.getEmail())//\n\t\t\t\t.setMobile(user.getMobile())//\n\t\t\t\t.setAddress(user.getAddress())//\n\t\t\t\t.setIcon(user.getIcon())//\n\t\t\t\t.addAllPermissions(user.getPermissions())//\n\t\t\t\t.setStatus(user.getStatus())//\n\t\t\t\t.setCreateTime(user.getCreateTime().toEpochSecond(ZoneOffset.UTC))//\n\t\t\t\t.setUpdateTime(user.getUpdateTime().toEpochSecond(ZoneOffset.UTC))//\n\t\t\t\t.build();\n\n\t\tresponseObserver.onNext(reply);\n\t\tresponseObserver.onCompleted();\n\t}\n\n\t@Override\n\tpublic void createUser(User request, StreamObserver<CreateUserResponse> responseObserver) {\n\t\tbenchmark.bean.User user = new benchmark.bean.User();\n\n\t\tuser.setId(request.getId());\n\t\tuser.setName(request.getName());\n\t\tuser.setSex(request.getSex());\n\t\tuser.setBirthday(LocalDate.ofEpochDay(request.getBirthday()));\n\t\tuser.setEmail(request.getEmail());\n\t\tuser.setMobile(request.getMobile());\n\t\tuser.setAddress(request.getAddress());\n\t\tuser.setIcon(request.getIcon());\n\t\tuser.setPermissions(request.getPermissionsList());\n\t\tuser.setStatus(request.getStatus());\n\t\tuser.setCreateTime(LocalDateTime.ofEpochSecond(request.getCreateTime(), 0, ZoneOffset.UTC));\n\t\tuser.setUpdateTime(LocalDateTime.ofEpochSecond(request.getUpdateTime(), 0, ZoneOffset.UTC));\n\n\t\tboolean success = userService.createUser(user);\n\n\t\tCreateUserResponse reply = CreateUserResponse.newBuilder().setSuccess(success).build();\n\n\t\tresponseObserver.onNext(reply);\n\t\tresponseObserver.onCompleted();\n\t}\n\n\t@Override\n\tpublic void listUser(ListUserRequest request, StreamObserver<UserPage> responseObserver) {\n\t\tint pageNo = request.getPageNo();\n\n\t\tPage<benchmark.bean.User> page = userService.listUser(pageNo);\n\n\t\tList<User> userList = new ArrayList<>(page.getResult().size());\n\n\t\tfor (benchmark.bean.User user : page.getResult()) {\n\t\t\tUser u = User.newBuilder()//\n\t\t\t\t\t.setId(user.getId())//\n\t\t\t\t\t.setName(user.getName())//\n\t\t\t\t\t.setSex(user.getSex())//\n\t\t\t\t\t.setBirthday((int) (user.getBirthday().toEpochDay()))//\n\t\t\t\t\t.setEmail(user.getEmail())//\n\t\t\t\t\t.setMobile(user.getMobile())//\n\t\t\t\t\t.setAddress(user.getAddress())//\n\t\t\t\t\t.setIcon(user.getIcon())//\n\t\t\t\t\t.addAllPermissions(user.getPermissions())//\n\t\t\t\t\t.setStatus(user.getStatus())//\n\t\t\t\t\t.setCreateTime(user.getCreateTime().toEpochSecond(ZoneOffset.UTC))//\n\t\t\t\t\t.setUpdateTime(user.getUpdateTime().toEpochSecond(ZoneOffset.UTC))//\n\t\t\t\t\t.build();\n\n\t\t\tuserList.add(u);\n\t\t}\n\n\t\tUserPage reply = UserPage.newBuilder()//\n\t\t\t\t.setPageNo(page.getPageNo())//\n\t\t\t\t.setTotal(page.getTotal())//\n\t\t\t\t.addAllResult(userList)//\n\t\t\t\t.build();\n\n\t\tresponseObserver.onNext(reply);\n\t\tresponseObserver.onCompleted();\n\t}\n\n}\n"
  },
  {
    "path": "grpc-server/src/main/proto/UserService.proto",
    "content": "syntax = \"proto3\";\npackage grpc;\n\nimport public \"google/protobuf/timestamp.proto\"; \n\noption java_package = \"benchmark.rpc.grpc\";\n\nservice UserService {\n  rpc userExist (UserExistRequest) returns (UserExistResponse) {}\n  \n  rpc createUser (User) returns (CreateUserResponse) {}\n  \n  rpc getUser (GetUserRequest) returns (User) {}\n  \n  rpc listUser (ListUserRequest) returns (UserPage) {}\n}\n\nmessage UserExistRequest {\n  string email = 1;\n}\n\nmessage UserExistResponse {\n  bool exist = 1;\n}\n\nmessage GetUserRequest {\n  int64 id = 1;\n}\n\nmessage User {\n\tint64 id = 1;\n\tstring name = 2;\n\tint32 sex = 3;\n\tint32 birthday = 4;\n\tstring email = 5;\n\tstring mobile = 6;\n\tstring address = 7;\n\tstring icon = 8;\n\trepeated int32 permissions = 9;\n\tint32 status = 10;\n\tint64 createTime = 11;\n\tint64 updateTime = 12;\n}\n\nmessage CreateUserResponse {\n  bool success = 1;\n}\n\nmessage ListUserRequest {\n  int32 pageNo = 1;\n}\n\nmessage UserPage {\n  \tint32 pageNo = 1;\n\tint32 total = 2;\n\trepeated User result = 3;\n}"
  },
  {
    "path": "grpc-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-server.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-server.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<appender-ref ref=\"console\" />\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "hprose-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>hprose-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>hprose-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.hprose>2.0.38</version.hprose>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hprose</groupId>\n\t\t\t<artifactId>hprose-java</artifactId>\n\t\t\t<version>${version.hprose}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.openjdk.jmh</groupId>\n\t\t\t<artifactId>jmh-core</artifactId>\n\t\t\t<version>1.19</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.openjdk.jmh</groupId>\n\t\t\t<artifactId>jmh-generator-annprocess</artifactId>\n\t\t\t<version>1.19</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "hprose-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport hprose.client.HproseTcpClient;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final HproseTcpClient client = new HproseTcpClient(\"tcp://benchmark-server:8080\");\n\tprivate final UserService userService = client.useService(UserService.class);\n\n\tpublic Client() {\n\t\tclient.setFullDuplex(true);\n\t\tclient.setNoDelay(true);\n\t}\n\t\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tclient.close();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n//\t\tHproseTcpClient client = new HproseTcpClient(\"tcp://127.0.0.1:8080\");\n//\t\tUserService userService = client.useService(UserService.class);\n//\t\tSystem.out.println(userService.existUser(\"1\"));\n\t}\n\n}\n"
  },
  {
    "path": "hprose-client/src/main/resources/consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n\t<!-- 消费方应用名，用于计算依赖关系，不是匹配条件，不要与提供方一样 -->\n\t<dubbo:application name=\"benchmark.rpc.dubbo-client\" />\n\n\t<!-- 生成远程服务代理，可以和本地bean一样使用demoService -->\n\t<dubbo:reference id=\"userService\" check=\"false\"\n\t\tinterface=\"benchmark.service.UserService\" url=\"dubbo://localhost:8080\" />\n\n</beans>"
  },
  {
    "path": "hprose-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>hprose-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>hprose-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.hprose>2.0.38</version.hprose>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hprose</groupId>\n\t\t\t<artifactId>hprose-java</artifactId>\n\t\t\t<version>${version.hprose}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "hprose-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.service.UserServiceServerImpl;\nimport hprose.server.HproseTcpServer;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tHproseTcpServer server = new HproseTcpServer(\"benchmark-server\", 8080);\n\t\tserver.add(new UserServiceServerImpl());\n\t\tserver.start();\n\t\tSystem.out.println(\"START\");\n\t\tThread.sleep(Long.MAX_VALUE);\n\t}\n\n}\n"
  },
  {
    "path": "hprose-server/src/main/resources/provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dubbo=\"http://code.alibabatech.com/schema/dubbo\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd\">\n\n\t<!-- 提供方应用信息，用于计算依赖关系 -->\n\t<dubbo:application name=\"benchmark.rpc.dubbo-server\" />\n\n\t<!-- 用dubbo协议在8080端口暴露服务 -->\n\t<dubbo:protocol name=\"dubbo\" port=\"8080\" />\n\t\n\t<dubbo:registry address=\"N/A\" />\n\n\t<!-- 声明需要暴露的服务接口 -->\n\t<dubbo:service interface=\"benchmark.service.UserService\"\n\t\tref=\"userService\" />\n\n\t<!-- 和本地bean一样实现服务 -->\n\t<bean id=\"userService\" class=\"benchmark.service.UserServiceServerImpl\" />\n\n</beans>"
  },
  {
    "path": "jupiter-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>jupiter-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>jupiter-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.jupiter>1.3.1-beta-1</version.jupiter>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.jupiter-rpc</groupId>\n\t\t\t<artifactId>jupiter-all</artifactId>\n\t\t\t<version>${version.jupiter}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-shade-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<createDependencyReducedPom>false</createDependencyReducedPom>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>shade</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<transformers>\n\t\t\t\t\t\t\t\t<transformer\n\t\t\t\t\t\t\t\t\timplementation=\"org.apache.maven.plugins.shade.resource.AppendingTransformer\">\n\t\t\t\t\t\t\t\t\t<resource>META-INF/services/org.jupiter.rpc.provider.processor.ProviderExecutorFactory</resource>\n\t\t\t\t\t\t\t\t</transformer>\n\t\t\t\t\t\t\t\t<transformer\n\t\t\t\t\t\t\t\t\timplementation=\"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer\">\n\t\t\t\t\t\t\t\t\t<manifestEntries>\n\t\t\t\t\t\t\t\t\t\t<Main-Class>benchmark.rpc.Client</Main-Class>\n\t\t\t\t\t\t\t\t\t\t<X-Compile-Source-JDK>${maven.compile.source}</X-Compile-Source-JDK>\n\t\t\t\t\t\t\t\t\t\t<X-Compile-Target-JDK>${maven.compile.target}</X-Compile-Target-JDK>\n\t\t\t\t\t\t\t\t\t</manifestEntries>\n\t\t\t\t\t\t\t\t</transformer>\n\t\t\t\t\t\t\t</transformers>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "jupiter-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.jupiter.common.util.SystemPropertyUtil;\nimport org.jupiter.rpc.DefaultClient;\nimport org.jupiter.rpc.JClient;\nimport org.jupiter.rpc.consumer.ProxyFactory;\nimport org.jupiter.transport.JConfig;\nimport org.jupiter.transport.JConnection;\nimport org.jupiter.transport.JConnector;\nimport org.jupiter.transport.JOption;\nimport org.jupiter.transport.UnresolvedAddress;\nimport org.jupiter.transport.UnresolvedSocketAddress;\nimport org.jupiter.transport.netty.JNettyTcpConnector;\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.JupiterUserService;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.netty.util.ResourceLeakDetector;\n\n@State(Scope.Benchmark)\npublic class Client {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final AtomicInteger counter = new AtomicInteger(0);\n\tprivate final UserService _serviceUserService = new UserServiceServerImpl();\n\n\tprivate final JupiterUserService userService;\n\tprivate final JClient client;\n\n\tpublic Client() {\n\t\tResourceLeakDetector.setLevel(ResourceLeakDetector.Level.DISABLED);\n\t\tSystemPropertyUtil\n\t\t\t\t.setProperty(\"jupiter.executor.factory.consumer.factory_name\", \"callerRuns\");\n\t\tSystemPropertyUtil.setProperty(\"jupiter.tracing.needed\", \"false\");\n\t\tclient = new DefaultClient().withConnector(new JNettyTcpConnector(true));\n\t\tJConfig config = client.connector().config();\n\t\tconfig.setOption(JOption.WRITE_BUFFER_HIGH_WATER_MARK, 2048 * 1024);\n\t\tconfig.setOption(JOption.WRITE_BUFFER_LOW_WATER_MARK, 1024 * 1024);\n\t\tconfig.setOption(JOption.SO_RCVBUF, 256 * 1024);\n\t\tconfig.setOption(JOption.SO_SNDBUF, 256 * 1024);\n\n\t\tint workers = Runtime.getRuntime().availableProcessors();\n\t\tUnresolvedAddress[] addresses = new UnresolvedAddress[workers];\n\t\tJConnector<JConnection> connector = client.connector();\n\t\tfor (int i = 0; i < addresses.length; i++) {\n\t\t\taddresses[i] = new UnresolvedSocketAddress(\"benchmark-server\", 18090);\n\t\t\tJConnection connection = connector.connect(addresses[i]);\n\t\t\tconnector.connectionManager().manage(connection);\n\t\t}\n\n\t\tuserService = ProxyFactory.factory(JupiterUserService.class).client(client).addProviderAddress(addresses)\n\t\t\t\t.newProxyInstance();\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tclient.shutdownGracefully();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic boolean existUser() throws Exception {\n\t\tString email = String.valueOf(counter.getAndIncrement());\n\t\treturn userService.existUser(email).join();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic boolean createUser() throws Exception {\n\t\tint id = counter.getAndIncrement();\n\t\tUser user = _serviceUserService.getUser(id);\n\t\treturn userService.createUser(user).join();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic User getUser() throws Exception {\n\t\tint id = counter.getAndIncrement();\n\t\treturn userService.getUser(id).join();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic Page<User> listUser() throws Exception {\n\t\tint pageNo = counter.getAndIncrement();\n\t\treturn userService.listUser(pageNo).join();\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tClient client = new Client();\n\t\tSystem.out.println(client.getUser());\n\t\tclient.close();\n\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "jupiter-client/src/main/java/benchmark/service/JupiterUserService.java",
    "content": "package benchmark.service;\n\nimport java.util.concurrent.CompletableFuture;\n\nimport org.jupiter.rpc.ServiceProvider;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\n\n@ServiceProvider(group = \"test\", name = \"jupiterUserService\")\npublic interface JupiterUserService {\n\tCompletableFuture<Boolean> existUser(String email);\n\n\tCompletableFuture<Boolean> createUser(User user);\n\n\tCompletableFuture<User> getUser(long id);\n\n\tCompletableFuture<Page<User>> listUser(int pageNo);\n\n}\n"
  },
  {
    "path": "jupiter-client/src/main/resources/META-INF/services/org.jupiter.rpc.consumer.processor.ConsumerExecutorFactory",
    "content": "org.jupiter.rpc.executor.CallerRunsExecutorFactory\norg.jupiter.rpc.executor.DisruptorExecutorFactory"
  },
  {
    "path": "jupiter-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-server.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-server.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<appender-ref ref=\"console\" />\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "jupiter-client/src/main/resources/spring-consumer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright (c) 2015 The Jupiter Project\n  ~\n  ~ Licensed under the Apache License, version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at:\n  ~\n  ~   http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n       xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xmlns:jupiter=\"http://www.jupiter-rpc.org/jupiter\"\n       xsi:schemaLocation=\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.jupiter-rpc.org/jupiter\n       http://www.jupiter-rpc.org/jupiter/jupiter.xsd\">\n\n    <jupiter:client id=\"jupiterClient\" registryType=\"default\">\n        <jupiter:property registryServerAddresses=\"benchmark-server:20001\" />\n        <!-- 可选配置 -->\n        <!--\n            String registryServerAddresses                  // 注册中心地址 [host1:port1,host2:port2....]\n            String providerServerAddresses                  // IP直连到providers [host1:port1,host2:port2....]\n        -->\n    </jupiter:client>\n\n    <!-- consumer -->\n    <jupiter:consumer id=\"jupiterUserService\" client=\"jupiterClient\" interfaceClass=\"benchmark.service.JupiterUserService\">\n        <!-- 以下都选项可不填 -->\n        <!-- 服务版本号, 通常在接口不兼容时版本号才需要升级 -->\n        <jupiter:property version=\"1.0.0\" />\n        <!-- 序列化/反序列化类型: (proto_stuff, hessian, kryo, java)可选, 默认proto_stuff -->\n        <jupiter:property serializerType=\"proto_stuff\" />\n        <!-- 软负载均衡类型[random, round_robin] -->\n        <jupiter:property loadBalancerType=\"round_robin\" />\n        <!-- 派发方式: (round, broadcast)可选, 默认round(单播) -->\n        <jupiter:property dispatchType=\"round\" />\n        <!-- 调用方式: (sync, async)可选, 默认sync(同步调用) -->\n        <jupiter:property invokeType=\"sync\" />\n        <!-- 集群容错策略: (fail_fast, fail_over, fail_safe)可选, 默认fail_fast(快速失败) -->\n        <jupiter:property clusterStrategy=\"fail_fast\" />\n        <!-- 在fail_over策略下的失败重试次数 -->\n        <jupiter:property failoverRetries=\"2\" />\n        <!-- 超时时间设置 -->\n        <jupiter:property timeoutMillis=\"60000\" />\n        <!-- 可选配置 -->\n        <!--\n            SerializerType serializerType                   // 序列化/反序列化方式\n            LoadBalancerType loadBalancerType               // 软负载均衡类型[random, round_robin]\n            long waitForAvailableTimeoutMillis = -1         // 如果大于0, 表示阻塞等待直到连接可用并且该值为等待时间\n            InvokeType invokeType                           // 调用方式 [同步, 异步]\n            DispatchType dispatchType                       // 派发方式 [单播, 广播]\n            long timeoutMillis                              // 调用超时时间设置\n            List<MethodSpecialConfig> methodSpecialConfigs; // 指定方法的单独配置, 方法参数类型不做区别对待\n            ConsumerHook[] hooks                            // consumer hook\n            String providerAddresses                        // provider地址列表, 逗号分隔(IP直连)\n            ClusterInvoker.Strategy clusterStrategy;        // 集群容错策略\n            int failoverRetries                             // fail_over的重试次数\n        -->\n    </jupiter:consumer>\n</beans>"
  },
  {
    "path": "jupiter-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "jupiter-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>jupiter-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>jupiter-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.jupiter>1.3.1-beta-1</version.jupiter>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.jupiter-rpc</groupId>\n\t\t\t<artifactId>jupiter-all</artifactId>\n\t\t\t<version>${version.jupiter}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-shade-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<createDependencyReducedPom>false</createDependencyReducedPom>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>shade</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<transformers>\n\t\t\t\t\t\t\t\t<transformer\n\t\t\t\t\t\t\t\t\timplementation=\"org.apache.maven.plugins.shade.resource.AppendingTransformer\">\n\t\t\t\t\t\t\t\t\t<resource>META-INF/services/org.jupiter.rpc.provider.processor.ProviderExecutorFactory</resource>\n\t\t\t\t\t\t\t\t</transformer>\n\t\t\t\t\t\t\t\t<transformer\n\t\t\t\t\t\t\t\t\timplementation=\"org.apache.maven.plugins.shade.resource.ManifestResourceTransformer\">\n\t\t\t\t\t\t\t\t\t<manifestEntries>\n\t\t\t\t\t\t\t\t\t\t<Main-Class>benchmark.rpc.Server</Main-Class>\n\t\t\t\t\t\t\t\t\t\t<X-Compile-Source-JDK>${maven.compile.source}</X-Compile-Source-JDK>\n\t\t\t\t\t\t\t\t\t\t<X-Compile-Target-JDK>${maven.compile.target}</X-Compile-Target-JDK>\n\t\t\t\t\t\t\t\t\t</manifestEntries>\n\t\t\t\t\t\t\t\t</transformer>\n\t\t\t\t\t\t\t</transformers>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "jupiter-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.service.JupiterUserServiceServerImpl;\nimport io.netty.util.ResourceLeakDetector;\n\nimport org.jupiter.common.util.SystemPropertyUtil;\nimport org.jupiter.rpc.DefaultServer;\nimport org.jupiter.rpc.JServer;\nimport org.jupiter.transport.JConfig;\nimport org.jupiter.transport.JOption;\nimport org.jupiter.transport.netty.JNettyTcpAcceptor;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws InterruptedException {\n\t\tResourceLeakDetector.setLevel(ResourceLeakDetector.Level.DISABLED);\n\t\ttry {\n\t\t\tSystemPropertyUtil.setProperty(\"jupiter.executor.factory.provider.factory_name\", \"callerRuns\");\n\t\t\tSystemPropertyUtil.setProperty(\"jupiter.executor.factory.affinity.thread\", \"true\");\n\t\t\tSystemPropertyUtil.setProperty(\"jupiter.tracing.needed\", \"false\");\n\t\t\tJServer server = new DefaultServer().withAcceptor(new JNettyTcpAcceptor(18090, true));\n\t\t\tJConfig config = server.acceptor().configGroup().child();\n\t\t\tconfig.setOption(JOption.WRITE_BUFFER_HIGH_WATER_MARK, 2048 * 1024);\n\t\t\tconfig.setOption(JOption.WRITE_BUFFER_LOW_WATER_MARK, 1024 * 1024);\n\t\t\tconfig.setOption(JOption.SO_RCVBUF, 256 * 1024);\n\t\t\tconfig.setOption(JOption.SO_SNDBUF, 256 * 1024);\n\n\t\t\tserver.serviceRegistry().provider(new JupiterUserServiceServerImpl()).register();\n\n\t\t\tserver.start(false);\n\t\t\tSystem.out.println(\"Jupiter started\");\n\t\t\tThread.sleep(java.lang.Integer.MAX_VALUE);\n\t\t} catch (Throwable t) {\n\t\t\tt.printStackTrace();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "jupiter-server/src/main/java/benchmark/service/JupiterUserService.java",
    "content": "package benchmark.service;\n\nimport java.util.concurrent.CompletableFuture;\n\nimport org.jupiter.rpc.ServiceProvider;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\n\n@ServiceProvider(group = \"test\", name = \"jupiterUserService\")\npublic interface JupiterUserService {\n\tCompletableFuture<Boolean> existUser(String email);\n\n\tCompletableFuture<Boolean> createUser(User user);\n\n\tCompletableFuture<User> getUser(long id);\n\n\tCompletableFuture<Page<User>> listUser(int pageNo);\n\n}\n"
  },
  {
    "path": "jupiter-server/src/main/java/benchmark/service/JupiterUserServiceServerImpl.java",
    "content": "package benchmark.service;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.concurrent.CompletableFuture;\n\nimport org.jupiter.rpc.ServiceProviderImpl;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\n\n/**\n * only for server\n * \n * @author Hank\n *\n */\n@ServiceProviderImpl(version = \"1.0.0\")\npublic class JupiterUserServiceServerImpl implements JupiterUserService {\n\n\t@Override\n\tpublic CompletableFuture<Boolean> existUser(String email) {\n\t\tif (email == null || email.isEmpty()) {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t\t}\n\n\t\tif (email.charAt(email.length() - 1) < '5') {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.FALSE);\n\t\t}\n\n\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<User> getUser(long id) {\n\t\tUser user = new User();\n\n\t\tuser.setId(id);\n\t\tuser.setName(new String(\"Doug Lea\"));\n\t\tuser.setSex(1);\n\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\tuser.setEmail(new String(\"dong.lea@gmail.com\"));\n\t\tuser.setMobile(new String(\"18612345678\"));\n\t\tuser.setAddress(new String(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\"));\n\t\tuser.setIcon(new String(\"https://www.baidu.com/img/bd_logo1.png\"));\n\t\tuser.setStatus(1);\n\t\tuser.setCreateTime(LocalDateTime.now());\n\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\tList<java.lang.Integer> permissions = new ArrayList<java.lang.Integer>(\n\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\n\t\tuser.setPermissions(permissions);\n\n\t\treturn CompletableFuture.completedFuture(user);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<Page<User>> listUser(int pageNo) {\n\t\tList<User> userList = new ArrayList<>(15);\n\n\t\tfor (int i = 0; i < 15; i++) {\n\t\t\tUser user = new User();\n\n\t\t\tuser.setId(i);\n\t\t\tuser.setName(\"Doug Lea\" + i);\n\t\t\tuser.setSex(1);\n\t\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\t\tuser.setEmail(\"dong.lea@gmail.com\" + i);\n\t\t\tuser.setMobile(\"18612345678\" + i);\n\t\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\" + i);\n\t\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\" + i);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setCreateTime(LocalDateTime.now());\n\t\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\t\tList<java.lang.Integer> permissions = new ArrayList<java.lang.Integer>(\n\t\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\t\tuser.setPermissions(permissions);\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tPage<User> page = new Page<>();\n\t\tpage.setPageNo(pageNo);\n\t\tpage.setTotal(1000);\n\t\tpage.setResult(userList);\n\n\t\treturn CompletableFuture.completedFuture(page);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<Boolean> createUser(User user) {\n\t\tif (user == null) {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.FALSE);\n\t\t}\n\n\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t}\n\n}\n"
  },
  {
    "path": "jupiter-server/src/main/resources/META-INF/services/org.jupiter.rpc.provider.processor.ProviderExecutorFactory",
    "content": "org.jupiter.rpc.executor.DisruptorExecutorFactory\norg.jupiter.rpc.executor.CallerRunsExecutorFactory\norg.jupiter.rpc.executor.ForkJoinPoolExecutorFactory"
  },
  {
    "path": "jupiter-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-server.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-server.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<appender-ref ref=\"console\" />\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "jupiter-server/src/main/resources/spring-provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- ~ Copyright (c) 2015 The Jupiter Project ~ ~ Licensed under the Apache \n\tLicense, version 2.0 (the \"License\"); ~ you may not use this file except \n\tin compliance with the License. ~ You may obtain a copy of the License at: \n\t~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable \n\tlaw or agreed to in writing, software ~ distributed under the License is \n\tdistributed on an \"AS IS\" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY \n\tKIND, either express or implied. ~ See the License for the specific language \n\tgoverning permissions and ~ limitations under the License. -->\n\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:jupiter=\"http://www.jupiter-rpc.org/jupiter\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans\n       http://www.springframework.org/schema/beans/spring-beans.xsd\n       http://www.jupiter-rpc.org/jupiter\n       http://www.jupiter-rpc.org/jupiter/jupiter.xsd\">\n\n\t<jupiter:server id=\"jupiterServer\" registryType=\"default\">\n\t\t<jupiter:property registryServerAddresses=\"benchmark-server:20001\" />\n\t\t<!-- 可选配置 -->\n\t\t<!-- String registryServerAddresses // 注册中心地址 [host1:port1,host2:port2....] \n\t\t\tProviderInterceptor[] providerInterceptors // 全局拦截器 FlowController<JRequest> \n\t\t\tflowController // 全局流量控制 -->\n\t</jupiter:server>\n\n\t<!-- provider -->\n\t<bean id=\"jupiterUserService\" class=\"benchmark.service.JupiterUserServiceServerImpl\" />\n\n\t<jupiter:provider id=\"jupiterUserServiceProvider\"\n\t\tserver=\"jupiterServer\" providerImpl=\"jupiterUserService\">\n\t\t<jupiter:property weight=\"100\" />\n\t</jupiter:provider>\n</beans>"
  },
  {
    "path": "motan-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>motan-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>motan-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.motan>1.1.3</version.motan>\n\t\t<version.spring>5.1.4.RELEASE</version.spring>\n\t\t<version.slf4j>1.7.25</version.slf4j>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>motan-core</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>motan-transport-netty</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>motan-springsupport</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>serialization-extension</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context</artifactId>\n\t\t\t<version>${version.spring}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${version.slf4j}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${version.slf4j}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-shade-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<createDependencyReducedPom>false</createDependencyReducedPom>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>shade</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<transformers>\n\t\t\t\t\t\t\t\t<transformer\n\t\t\t\t\t\t\t\t\timplementation=\"org.apache.maven.plugins.shade.resource.AppendingTransformer\">\n\t\t\t\t\t\t\t\t\t<resource>META-INF/services/com.weibo.api.motan.codec.Serialization</resource>\n\t\t\t\t\t\t\t\t</transformer>\n\t\t\t\t\t\t\t</transformers>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "motan-client/src/main/java/benchmark/bean/MotanUser.java",
    "content": "package benchmark.bean;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.List;\n\npublic class MotanUser implements Serializable {\n\tprivate static final long serialVersionUID = -2058903653284131263L;\n\n\tprivate long id;\n\tprivate String name;\n\tprivate int sex;\n\tprivate Date birthday;\n\tprivate String email;\n\tprivate String mobile;\n\tprivate String address;\n\tprivate String icon;\n\tprivate List<Integer> permissions;\n\tprivate int status;\n\tprivate Date createTime;\n\tprivate Date updateTime;\n\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic int getSex() {\n\t\treturn sex;\n\t}\n\n\tpublic void setSex(int sex) {\n\t\tthis.sex = sex;\n\t}\n\n\tpublic Date getBirthday() {\n\t\treturn birthday;\n\t}\n\n\tpublic void setBirthday(Date birthday) {\n\t\tthis.birthday = birthday;\n\t}\n\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\n\tpublic String getMobile() {\n\t\treturn mobile;\n\t}\n\n\tpublic void setMobile(String mobile) {\n\t\tthis.mobile = mobile;\n\t}\n\n\tpublic String getAddress() {\n\t\treturn address;\n\t}\n\n\tpublic void setAddress(String address) {\n\t\tthis.address = address;\n\t}\n\n\tpublic String getIcon() {\n\t\treturn icon;\n\t}\n\n\tpublic void setIcon(String icon) {\n\t\tthis.icon = icon;\n\t}\n\n\tpublic List<Integer> getPermissions() {\n\t\treturn permissions;\n\t}\n\n\tpublic void setPermissions(List<Integer> permissions) {\n\t\tthis.permissions = permissions;\n\t}\n\n\tpublic int getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(int status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic Date getCreateTime() {\n\t\treturn createTime;\n\t}\n\n\tpublic void setCreateTime(Date createTime) {\n\t\tthis.createTime = createTime;\n\t}\n\n\tpublic Date getUpdateTime() {\n\t\treturn updateTime;\n\t}\n\n\tpublic void setUpdateTime(Date updateTime) {\n\t\tthis.updateTime = updateTime;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"MotanUser{\" +\n\t\t\t\t\"id=\" + id +\n\t\t\t\t\", name='\" + name + '\\'' +\n\t\t\t\t\", sex=\" + sex +\n\t\t\t\t\", birthday=\" + birthday +\n\t\t\t\t\", email='\" + email + '\\'' +\n\t\t\t\t\", mobile='\" + mobile + '\\'' +\n\t\t\t\t\", address='\" + address + '\\'' +\n\t\t\t\t\", icon='\" + icon + '\\'' +\n\t\t\t\t\", permissions=\" + permissions +\n\t\t\t\t\", status=\" + status +\n\t\t\t\t\", createTime=\" + createTime +\n\t\t\t\t\", updateTime=\" + updateTime +\n\t\t\t\t'}';\n\t}\n}"
  },
  {
    "path": "motan-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\nimport com.weibo.api.motan.closable.ShutDownHook;\nimport com.weibo.api.motan.util.StatsUtil;\n\nimport benchmark.bean.MotanUser;\nimport benchmark.bean.Page;\nimport benchmark.service.MotanUserService;\nimport benchmark.service.MotanUserServiceServerImpl;\n\n@State(Scope.Benchmark)\npublic class Client {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final AtomicInteger counter = new AtomicInteger(0);\n\tprivate final MotanUserService _serviceUserService = new MotanUserServiceServerImpl();\n\n\tprivate final ClassPathXmlApplicationContext context;\n\tprivate final MotanUserService userService;\n\n\tpublic Client() {\n\t\tcontext = new ClassPathXmlApplicationContext(\"motan_client.xml\");\n\t\tcontext.start();\n\t\tuserService = (MotanUserService) context.getBean(\"userService\"); // 获取远程服务代理\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tcontext.close();\n\t\tShutDownHook.runHook(true);\n\n\t\tif (!StatsUtil.executorService.isShutdown()) {\n\t\t\tStatsUtil.executorService.shutdownNow();\n\t\t}\n\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic boolean existUser() throws Exception {\n\t\tString email = String.valueOf(counter.getAndIncrement());\n\t\treturn userService.existUser(email);\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic boolean createUser() throws Exception {\n\t\tint id = counter.getAndIncrement();\n\t\tMotanUser user = _serviceUserService.getUser(id);\n\t\treturn userService.createUser(user);\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic MotanUser getUser() throws Exception {\n\t\tint id = counter.getAndIncrement();\n\t\treturn userService.getUser(id);\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic Page<MotanUser> listUser() throws Exception {\n\t\tint pageNo = counter.getAndIncrement();\n\t\treturn userService.listUser(pageNo);\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tClient client = new Client();\n\n\t\tfor (int i = 0; i < 60; i++) {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(client.getUser().getAddress());\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\tThread.sleep(1000);\n\t\t\t}\n\t\t}\n\n\t\tclient.close();\n\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\n\t\tSystem.exit(1);\n\n\t\t// Client client = new Client();\n\t\t// System.out.println(client.getUser());\n\t}\n\n}\n"
  },
  {
    "path": "motan-client/src/main/java/benchmark/service/MotanUserService.java",
    "content": "package benchmark.service;\n\nimport benchmark.bean.MotanUser;\nimport benchmark.bean.Page;\n\npublic interface MotanUserService {\n\tpublic boolean existUser(String email);\n\n\tpublic boolean createUser(MotanUser user);\n\n\tpublic MotanUser getUser(long id);\n\n\tpublic Page<MotanUser> listUser(int pageNo);\n\n}\n"
  },
  {
    "path": "motan-client/src/main/java/benchmark/service/MotanUserServiceServerImpl.java",
    "content": "package benchmark.service;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\n\nimport benchmark.bean.MotanUser;\nimport benchmark.bean.Page;\n\n/**\n * only for server\n * \n * @author Hank\n *\n */\npublic class MotanUserServiceServerImpl implements MotanUserService {\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\tif (email == null || email.isEmpty()) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (email.charAt(email.length() - 1) < '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic MotanUser getUser(long id) {\n\t\tMotanUser user = new MotanUser();\n\n\t\tuser.setId(id);\n\t\tuser.setName(new String(\"Doug Lea\"));\n\t\tuser.setSex(1);\n\t\tuser.setBirthday(new Date());\n\t\tuser.setEmail(new String(\"dong.lea@gmail.com\"));\n\t\tuser.setMobile(new String(\"18612345678\"));\n\t\tuser.setAddress(new String(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\"));\n\t\tuser.setIcon(new String(\"https://www.baidu.com/img/bd_logo1.png\"));\n\t\tuser.setStatus(1);\n\t\tuser.setCreateTime(new Date());\n\t\tuser.setUpdateTime(new Date());\n\n\t\tList<java.lang.Integer> permissions = new ArrayList<java.lang.Integer>(\n\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\n\t\tuser.setPermissions(permissions);\n\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic Page<MotanUser> listUser(int pageNo) {\n\t\tList<MotanUser> userList = new ArrayList<>(15);\n\n\t\tfor (int i = 0; i < 15; i++) {\n\t\t\tMotanUser user = new MotanUser();\n\n\t\t\tuser.setId(i);\n\t\t\tuser.setName(\"Doug Lea\" + i);\n\t\t\tuser.setSex(1);\n\t\t\tuser.setBirthday(new Date());\n\t\t\tuser.setEmail(\"dong.lea@gmail.com\" + i);\n\t\t\tuser.setMobile(\"18612345678\" + i);\n\t\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\" + i);\n\t\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\" + i);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setCreateTime(new Date());\n\t\t\tuser.setUpdateTime(new Date());\n\n\t\t\tList<java.lang.Integer> permissions = new ArrayList<java.lang.Integer>(\n\t\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\t\tuser.setPermissions(permissions);\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tPage<MotanUser> page = new Page<>();\n\t\tpage.setPageNo(pageNo);\n\t\tpage.setTotal(1000);\n\t\tpage.setResult(userList);\n\n\t\treturn page;\n\t}\n\n\t@Override\n\tpublic boolean createUser(MotanUser user) {\n\t\tif (user == null) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "motan-client/src/main/resources/motan_client.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:motan=\"http://api.weibo.com/schema/motan\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\n   http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd\">\n\n\n\t<!-- 注册中心配置 使用不同注册中心需要依赖对应的jar包。 -->\n\t<motan:registry regProtocol=\"local\" name=\"localRegistry\"\n\t\tcheck=\"false\" />\n\n\t<!-- motan协议配置 -->\n\t<motan:protocol default=\"true\" name=\"motan\" haStrategy=\"failfast\"\n\t\tloadbalance=\"roundrobin\" maxClientConnection=\"10\" minClientConnection=\"2\" />\n\n\t<!-- 通用referer基础配置 -->\n\t<motan:basicReferer requestTimeout=\"5000\" accessLog=\"false\"\n\t\tretries=\"1\" group=\"motan-benchmark-rpc\" module=\"motan-benchmark-rpc\"\n\t\tapplication=\"myMotanBenchmark\" protocol=\"motan\" registry=\"localRegistry\"\n\t\tid=\"motanClientBasicConfig\" throwException=\"false\" check=\"false\" />\n\n\t<!-- 具体referer配置。使用方通过beanid使用服务接口类 -->\n\t<motan:referer id=\"userService\" directUrl=\"benchmark-server:8080\"\n\t\tinterface=\"benchmark.service.MotanUserService\" connectTimeout=\"5000\"\n\t\trequestTimeout=\"5000\" basicReferer=\"motanClientBasicConfig\" />\n</beans>"
  },
  {
    "path": "motan-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "motan-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>motan-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>motan-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.motan>1.1.3</version.motan>\n\t\t<version.spring>5.1.4.RELEASE</version.spring>\n\t\t<version.slf4j>1.7.25</version.slf4j>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>motan-core</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>motan-transport-netty</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>motan-extension</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t\t<type>pom</type>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>motan-springsupport</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.weibo</groupId>\n\t\t\t<artifactId>serialization-extension</artifactId>\n\t\t\t<version>${version.motan}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context</artifactId>\n\t\t\t<version>${version.spring}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${version.slf4j}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${version.slf4j}</version>\n\t\t</dependency>\n\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-shade-plugin</artifactId>\n\t\t\t\t<version>3.2.1</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<createDependencyReducedPom>false</createDependencyReducedPom>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>shade</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<transformers>\n\t\t\t\t\t\t\t\t<transformer\n\t\t\t\t\t\t\t\t\timplementation=\"org.apache.maven.plugins.shade.resource.AppendingTransformer\">\n\t\t\t\t\t\t\t\t\t<resource>META-INF/services/com.weibo.api.motan.codec.Serialization</resource>\n\t\t\t\t\t\t\t\t</transformer>\n\t\t\t\t\t\t\t</transformers>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "motan-server/src/main/java/benchmark/bean/MotanUser.java",
    "content": "package benchmark.bean;\n\nimport java.io.Serializable;\nimport java.util.Date;\nimport java.util.List;\n\npublic class MotanUser implements Serializable {\n\tprivate static final long serialVersionUID = -2058903653284131263L;\n\n\tprivate long id;\n\tprivate String name;\n\tprivate int sex;\n\tprivate Date birthday;\n\tprivate String email;\n\tprivate String mobile;\n\tprivate String address;\n\tprivate String icon;\n\tprivate List<Integer> permissions;\n\tprivate int status;\n\tprivate Date createTime;\n\tprivate Date updateTime;\n\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic int getSex() {\n\t\treturn sex;\n\t}\n\n\tpublic void setSex(int sex) {\n\t\tthis.sex = sex;\n\t}\n\n\tpublic Date getBirthday() {\n\t\treturn birthday;\n\t}\n\n\tpublic void setBirthday(Date birthday) {\n\t\tthis.birthday = birthday;\n\t}\n\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\n\tpublic String getMobile() {\n\t\treturn mobile;\n\t}\n\n\tpublic void setMobile(String mobile) {\n\t\tthis.mobile = mobile;\n\t}\n\n\tpublic String getAddress() {\n\t\treturn address;\n\t}\n\n\tpublic void setAddress(String address) {\n\t\tthis.address = address;\n\t}\n\n\tpublic String getIcon() {\n\t\treturn icon;\n\t}\n\n\tpublic void setIcon(String icon) {\n\t\tthis.icon = icon;\n\t}\n\n\tpublic List<Integer> getPermissions() {\n\t\treturn permissions;\n\t}\n\n\tpublic void setPermissions(List<Integer> permissions) {\n\t\tthis.permissions = permissions;\n\t}\n\n\tpublic int getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(int status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic Date getCreateTime() {\n\t\treturn createTime;\n\t}\n\n\tpublic void setCreateTime(Date createTime) {\n\t\tthis.createTime = createTime;\n\t}\n\n\tpublic Date getUpdateTime() {\n\t\treturn updateTime;\n\t}\n\n\tpublic void setUpdateTime(Date updateTime) {\n\t\tthis.updateTime = updateTime;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"MotanUser{\" +\n\t\t\t\t\"id=\" + id +\n\t\t\t\t\", name='\" + name + '\\'' +\n\t\t\t\t\", sex=\" + sex +\n\t\t\t\t\", birthday=\" + birthday +\n\t\t\t\t\", email='\" + email + '\\'' +\n\t\t\t\t\", mobile='\" + mobile + '\\'' +\n\t\t\t\t\", address='\" + address + '\\'' +\n\t\t\t\t\", icon='\" + icon + '\\'' +\n\t\t\t\t\", permissions=\" + permissions +\n\t\t\t\t\", status=\" + status +\n\t\t\t\t\", createTime=\" + createTime +\n\t\t\t\t\", updateTime=\" + updateTime +\n\t\t\t\t'}';\n\t}\n}"
  },
  {
    "path": "motan-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.springframework.context.support.ClassPathXmlApplicationContext;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws InterruptedException {\n\t\ttry (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"motan_server.xml\");) {\n\t\t\tcontext.start();\n\t\t\tThread.sleep(Integer.MAX_VALUE);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "motan-server/src/main/java/benchmark/service/MotanUserService.java",
    "content": "package benchmark.service;\n\nimport benchmark.bean.MotanUser;\nimport benchmark.bean.Page;\n\npublic interface MotanUserService {\n\tpublic boolean existUser(String email);\n\n\tpublic boolean createUser(MotanUser user);\n\n\tpublic MotanUser getUser(long id);\n\n\tpublic Page<MotanUser> listUser(int pageNo);\n\n}\n"
  },
  {
    "path": "motan-server/src/main/java/benchmark/service/MotanUserServiceServerImpl.java",
    "content": "package benchmark.service;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\n\nimport benchmark.bean.MotanUser;\nimport benchmark.bean.Page;\n\n/**\n * only for server\n * \n * @author Hank\n *\n */\npublic class MotanUserServiceServerImpl implements MotanUserService {\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\tif (email == null || email.isEmpty()) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (email.charAt(email.length() - 1) < '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic MotanUser getUser(long id) {\n\t\tMotanUser user = new MotanUser();\n\n\t\tuser.setId(id);\n\t\tuser.setName(new String(\"Doug Lea\"));\n\t\tuser.setSex(1);\n\t\tuser.setBirthday(new Date());\n\t\tuser.setEmail(new String(\"dong.lea@gmail.com\"));\n\t\tuser.setMobile(new String(\"18612345678\"));\n\t\tuser.setAddress(new String(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\"));\n\t\tuser.setIcon(new String(\"https://www.baidu.com/img/bd_logo1.png\"));\n\t\tuser.setStatus(1);\n\t\tuser.setCreateTime(new Date());\n\t\tuser.setUpdateTime(new Date());\n\n\t\tList<java.lang.Integer> permissions = new ArrayList<java.lang.Integer>(\n\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\n\t\tuser.setPermissions(permissions);\n\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic Page<MotanUser> listUser(int pageNo) {\n\t\tList<MotanUser> userList = new ArrayList<>(15);\n\n\t\tfor (int i = 0; i < 15; i++) {\n\t\t\tMotanUser user = new MotanUser();\n\n\t\t\tuser.setId(i);\n\t\t\tuser.setName(\"Doug Lea\" + i);\n\t\t\tuser.setSex(1);\n\t\t\tuser.setBirthday(new Date());\n\t\t\tuser.setEmail(\"dong.lea@gmail.com\" + i);\n\t\t\tuser.setMobile(\"18612345678\" + i);\n\t\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\" + i);\n\t\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\" + i);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setCreateTime(new Date());\n\t\t\tuser.setUpdateTime(new Date());\n\n\t\t\tList<java.lang.Integer> permissions = new ArrayList<java.lang.Integer>(\n\t\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\t\tuser.setPermissions(permissions);\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tPage<MotanUser> page = new Page<>();\n\t\tpage.setPageNo(pageNo);\n\t\tpage.setTotal(1000);\n\t\tpage.setResult(userList);\n\n\t\treturn page;\n\t}\n\n\t@Override\n\tpublic boolean createUser(MotanUser user) {\n\t\tif (user == null) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "motan-server/src/main/resources/motan_server.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:motan=\"http://api.weibo.com/schema/motan\"\n\txsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\n   http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd\">\n\n\n\t<!-- 业务具体实现类 -->\n\t<bean id=\"userServiceImpl\" class=\"benchmark.service.MotanUserServiceServerImpl\" />\n\n\t<!-- 注册中心配置 使用不同注册中心需要依赖对应的jar包。如果不使用注册中心，可以把check属性改为false，忽略注册失败。 -->\n\t<motan:registry regProtocol=\"local\" name=\"localRegistry\"\n\t\tcheck=\"false\" />\n\n\t<!-- 协议配置。为防止多个业务配置冲突，推荐使用id表示具体协议。 -->\n\t<motan:protocol id=\"benchmarkMotan\" default=\"true\" name=\"motan\"\n\t\trequestTimeout=\"5000\" maxServerConnection=\"100000\" maxContentLength=\"1048576\"\n\t\tmaxWorkerThread=\"800\" minWorkerThread=\"20\" />\n\n\t<!-- 通用配置，多个rpc服务使用相同的基础配置. group和module定义具体的服务池。export格式为“protocol id:提供服务的端口” -->\n\t<motan:basicService requestTimeout=\"5000\"\n\t\thost=\"benchmark-server\" export=\"benchmarkMotan:8080\" group=\"motan-benchmark-rpc\"\n\t\taccessLog=\"false\" shareChannel=\"true\" module=\"motan-benchmark-rpc\"\n\t\tapplication=\"myMotanBenchmark\" registry=\"localRegistry\" id=\"serviceBasicConfig\" />\n\n\t<!-- 具体rpc服务配置，声明实现的接口类。需要根据业务情况设置合适的超时时间 -->\n\t<motan:service interface=\"benchmark.service.MotanUserService\"\n\t\tref=\"userServiceImpl\" export=\"benchmarkMotan:8080\" basicService=\"serviceBasicConfig\"\n\t\trequestTimeout=\"5000\">\n\t</motan:service>\n</beans>"
  },
  {
    "path": "netty-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>netty-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>netty-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<netty.version>4.1.33.Final</netty.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.netty</groupId>\n\t\t\t<artifactId>netty-codec</artifactId>\n\t\t\t<version>${netty.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.netty</groupId>\n\t\t\t<artifactId>netty-transport-native-epoll</artifactId>\n\t\t\t<version>${netty.version}</version>\n\t\t\t<classifier>linux-x86_64</classifier>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.netty.client.UserServiceNettyClientImpl;\nimport benchmark.service.UserService;\nimport io.netty.util.ResourceLeakDetector;\nimport io.netty.util.ResourceLeakDetector.Level;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserServiceNettyClientImpl userService = new UserServiceNettyClientImpl();\n\t\n\tstatic {\n\t\tResourceLeakDetector.setLevel(Level.DISABLED);\n\t}\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tuserService.close();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/client/NettyClientConnector.java",
    "content": "package benchmark.rpc.netty.client;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ExecutionException;\nimport java.util.concurrent.ThreadLocalRandom;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.TimeoutException;\n\nimport benchmark.rpc.netty.client.future.FutureContainer;\nimport benchmark.rpc.netty.client.handler.BenchmarkChannelInitializer;\nimport benchmark.rpc.netty.serializer.FastestSerializer;\nimport benchmark.rpc.protocol.Request;\nimport benchmark.rpc.protocol.Response;\nimport io.netty.bootstrap.Bootstrap;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.Channel;\nimport io.netty.channel.ChannelOption;\nimport io.netty.channel.EventLoopGroup;\nimport io.netty.channel.WriteBufferWaterMark;\nimport io.netty.channel.epoll.Epoll;\nimport io.netty.channel.epoll.EpollChannelOption;\nimport io.netty.channel.epoll.EpollEventLoopGroup;\nimport io.netty.channel.epoll.EpollSocketChannel;\nimport io.netty.channel.nio.NioEventLoopGroup;\nimport io.netty.channel.socket.SocketChannel;\nimport io.netty.channel.socket.nio.NioSocketChannel;\nimport io.netty.util.ResourceLeakDetector;\nimport io.netty.util.ResourceLeakDetector.Level;\nimport io.netty.util.concurrent.DefaultThreadFactory;\nimport io.netty.util.internal.shaded.org.jctools.queues.atomic.MpscAtomicArrayQueue;\n\npublic class NettyClientConnector implements Closeable {\n\tstatic {\n\t\tResourceLeakDetector.setLevel(Level.DISABLED);\n\t}\n\n\tpublic static final int CONNECT_COUNT = 4;\n\n\tprivate final FutureContainer futureContainer = new FutureContainer();\n\n\tprivate final String host;\n\tprivate final int port;\n\tprivate long defaultTimeout = 15_000L;\n\tprivate EventLoopGroup eventLoopGroup;\n\tprivate final Channel[] channels = new Channel[CONNECT_COUNT];\n\t@SuppressWarnings(\"unchecked\")\n\tprivate final MpscAtomicArrayQueue<Request>[] queues = new MpscAtomicArrayQueue[CONNECT_COUNT];\n\n\tpublic NettyClientConnector(String host, int port) {\n\t\tthis.host = host;\n\t\tthis.port = port;\n\t}\n\n\tpublic void setDefaultTimeout(long defaultTimeout) {\n\t\tthis.defaultTimeout = defaultTimeout;\n\t}\n\n\tpublic Response execute(Request request) throws InterruptedException, ExecutionException, TimeoutException {\n\t\treturn execute(request, defaultTimeout, TimeUnit.MILLISECONDS);\n\t}\n\n\tpublic Response execute(Request request, long timeout, TimeUnit unit)\n\t\t\tthrows InterruptedException, ExecutionException, TimeoutException {\n\n\t\tfinal long requestId = request.getRequestId();\n\t\tfinal CompletableFuture<Response> future = new CompletableFuture<>();\n\n\t\ttry {\n\t\t\tfutureContainer.addFuture(requestId, future);\n\n\t\t\tint index = ThreadLocalRandom.current().nextInt(CONNECT_COUNT);\n\t\t\tChannel channel = channels[index];\n\t\t\tMpscAtomicArrayQueue<Request> queue = queues[index];\n\n\t\t\twhile (!queue.offer(request)) {\n\t\t\t\tbatchSend(channel, queue);\n\t\t\t}\n\n\t\t\tbatchSend(channel, queue);\n\n\t\t\treturn future.get();\n\t\t} finally {\n\t\t\tfutureContainer.remove(requestId);\n\t\t}\n\t}\n\n\tprivate void batchSend(Channel channel, MpscAtomicArrayQueue<Request> queue) {\n\t\tif (queue.isEmpty()) {\n\t\t\treturn;\n\t\t}\n\n\t\tchannel.eventLoop().execute(() -> {\n\t\t\tif (queue.isEmpty()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tByteBuf byteBuf = channel.alloc().ioBuffer(1024 * 4);\n\n\t\t\tfor (int i = 0; i < 64; i++) {\n\t\t\t\tRequest request = queue.poll();\n\n\t\t\t\tif (request == null) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tFastestSerializer.writeRequest(byteBuf, request);\n\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\tt.printStackTrace();\n\t\t\t\t\tchannel.close();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (byteBuf.isReadable()) {\n\t\t\t\tchannel.writeAndFlush(byteBuf, channel.voidPromise());\n\t\t\t} else {\n\t\t\t\tbyteBuf.release();\n\t\t\t}\n\t\t});\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\tfor (int i = 0; i < channels.length; i++) {\n\t\t\tchannels[i].close();\n\t\t}\n\n\t\tif (eventLoopGroup != null) {\n\t\t\teventLoopGroup.shutdownGracefully();\n\t\t}\n\n\t}\n\n\tpublic void connect() throws InterruptedException {\n\n\t\tif (Epoll.isAvailable()) {\n\t\t\tif (eventLoopGroup == null) {\n\t\t\t\teventLoopGroup = new EpollEventLoopGroup(0, new DefaultThreadFactory(NioEventLoopGroup.class));\n\t\t\t}\n\n\t\t\tdoConnect(eventLoopGroup, EpollSocketChannel.class, true);\n\t\t} else {\n\t\t\tif (eventLoopGroup == null) {\n\t\t\t\teventLoopGroup = new NioEventLoopGroup(0, new DefaultThreadFactory(NioEventLoopGroup.class));\n\t\t\t}\n\n\t\t\tdoConnect(eventLoopGroup, NioSocketChannel.class, false);\n\t\t}\n\t}\n\n\tprivate void doConnect(EventLoopGroup loupGroup, Class<? extends SocketChannel> serverChannelClass, boolean isEpoll)\n\t\t\tthrows InterruptedException {\n\n\t\tfinal Bootstrap bootstrap = new Bootstrap();\n\n\t\tif (isEpoll) {\n\t\t\tbootstrap.option(EpollChannelOption.SO_REUSEPORT, true);\n\t\t}\n\n\t\tbootstrap.option(ChannelOption.SO_REUSEADDR, true);\n\t\tbootstrap.option(ChannelOption.SO_RCVBUF, 256 * 1024);\n\t\tbootstrap.option(ChannelOption.SO_SNDBUF, 256 * 1024);\n\t\tbootstrap.option(ChannelOption.WRITE_BUFFER_WATER_MARK, //\n\t\t\t\tnew WriteBufferWaterMark(1024 * 1024, 2048 * 1024));\n\n\t\tbootstrap.group(loupGroup);\n\t\tbootstrap.channel(serverChannelClass);\n\t\tbootstrap.handler(new BenchmarkChannelInitializer(futureContainer));\n\n\t\tfor (int i = 0; i < CONNECT_COUNT; i++) {\n\t\t\tchannels[i] = bootstrap.connect(host, port).sync().channel();\n\t\t\tqueues[i] = new MpscAtomicArrayQueue<>(4 * 1024);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/client/UserServiceNettyClientImpl.java",
    "content": "package benchmark.rpc.netty.client;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.util.concurrent.atomic.AtomicLong;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.protocol.Request;\nimport benchmark.rpc.protocol.Response;\nimport benchmark.service.ServiceRegister;\nimport benchmark.service.UserService;\n\npublic class UserServiceNettyClientImpl implements UserService, Closeable {\n\n\tpublic static final String host = \"benchmark-server\";\n\tpublic static final int port = 8080;\n\n\tprivate final NettyClientConnector connector = new NettyClientConnector(host, port);\n\tprivate final AtomicLong requestCounter = new AtomicLong();\n\n\tpublic UserServiceNettyClientImpl() {\n\t\tconnect();\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\tconnector.close();\n\t}\n\n\tprivate void connect() {\n\t\ttry {\n\t\t\tconnector.connect();\n\t\t} catch (InterruptedException e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t@SuppressWarnings(\"unchecked\")\n\tprivate <T> T execute(int serviceId, Object... params) {\n\t\tlong requestId = requestCounter.getAndIncrement();\n\n\t\ttry {\n\t\t\tRequest request = new Request();\n\t\t\trequest.setRequestId(requestId);\n\t\t\trequest.setServiceId(serviceId);\n\t\t\trequest.setParams(params);\n\n\t\t\tResponse response = connector.execute(request);\n\t\t\treturn (T) response.getResult();\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\n\t}\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\treturn execute(ServiceRegister.EXIST_USER, email);\n\t}\n\n\t@Override\n\tpublic boolean createUser(User user) {\n\t\treturn execute(ServiceRegister.CREATE_USER, user);\n\t}\n\n\t@Override\n\tpublic User getUser(long id) {\n\t\treturn execute(ServiceRegister.GET_USER, id);\n\t}\n\n\t@Override\n\tpublic Page<User> listUser(int pageNo) {\n\t\treturn execute(ServiceRegister.LIST_USER, pageNo);\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/client/codec/ProtocolDecoder.java",
    "content": "package benchmark.rpc.netty.client.codec;\n\nimport benchmark.rpc.netty.serializer.FastestSerializer;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler.codec.LengthFieldBasedFrameDecoder;\n\npublic class ProtocolDecoder extends LengthFieldBasedFrameDecoder {\n\n\tprivate static final int HEADER_FIELD_LENGTH = 4;\n\n\tpublic ProtocolDecoder(int maxFrameLength) {\n\t\tsuper(maxFrameLength, 0, HEADER_FIELD_LENGTH, 0, HEADER_FIELD_LENGTH);\n\t}\n\n\t@Override\n\tprotected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {\n\t\tByteBuf buffer = (ByteBuf) super.decode(ctx, in);\n\n\t\tif (buffer != null) {\n\n\t\t\ttry {\n\t\t\t\treturn FastestSerializer.readResponse(buffer);\n\t\t\t} finally {\n\t\t\t\tbuffer.release();\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/client/codec/ProtocolEncoder.java",
    "content": "package benchmark.rpc.netty.client.codec;\n\nimport benchmark.rpc.netty.serializer.FastestSerializer;\nimport benchmark.rpc.protocol.Request;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler.codec.MessageToByteEncoder;\n\npublic class ProtocolEncoder extends MessageToByteEncoder<Request> {\n\n\tprotected void encode(ChannelHandlerContext ctx, Request request, ByteBuf buffer) throws Exception {\n\t\tFastestSerializer.writeRequest(buffer, request);\n\t}\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/client/future/FutureContainer.java",
    "content": "package benchmark.rpc.netty.client.future;\n\nimport java.util.concurrent.CompletableFuture;\nimport java.util.concurrent.ConcurrentHashMap;\n\nimport benchmark.rpc.protocol.Response;\n\n/**\n * \n * @author Hank\n *\n */\npublic final class FutureContainer {\n\tprivate final ConcurrentHashMap<Long, CompletableFuture<Response>> futureMap = new ConcurrentHashMap<>();\n\n\tpublic void addFuture(long requestId, CompletableFuture<Response> future) {\n\t\tfutureMap.put(requestId, future);\n\t}\n\n\tpublic void remove(long requestId) {\n\t\tfutureMap.remove(requestId);\n\t}\n\n\tpublic void notifyResponse(Response response) {\n\t\tCompletableFuture<Response> future = futureMap.remove(response.getRequestId());\n\n\t\tif (future == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tfuture.complete(response);\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/client/handler/BenchmarkChannelInitializer.java",
    "content": "package benchmark.rpc.netty.client.handler;\n\nimport benchmark.rpc.netty.client.codec.ProtocolDecoder;\nimport benchmark.rpc.netty.client.codec.ProtocolEncoder;\nimport benchmark.rpc.netty.client.future.FutureContainer;\nimport io.netty.channel.ChannelInitializer;\nimport io.netty.channel.socket.SocketChannel;\n\npublic class BenchmarkChannelInitializer extends ChannelInitializer<SocketChannel> {\n\n\tpublic static final int MAX_FRAME_LENGTH = 8 * 1024 * 1024;\n\n\tprivate final FutureContainer futureContainer;\n\n\tpublic BenchmarkChannelInitializer(FutureContainer futureContainer) {\n\t\tthis.futureContainer = futureContainer;\n\t}\n\n\t@Override\n\tpublic void initChannel(SocketChannel ch) throws Exception {\n\t\tch.pipeline()//\n\t\t\t\t.addLast(\"encoder\", new ProtocolEncoder())//\n\t\t\t\t.addLast(\"decoder\", new ProtocolDecoder(MAX_FRAME_LENGTH))//\n\t\t\t\t.addLast(\"handler\", new BenchmarkClientHandler(futureContainer));\n\t}\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/client/handler/BenchmarkClientHandler.java",
    "content": "package benchmark.rpc.netty.client.handler;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport benchmark.rpc.netty.client.future.FutureContainer;\nimport benchmark.rpc.protocol.Response;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.channel.SimpleChannelInboundHandler;\n\npublic class BenchmarkClientHandler extends SimpleChannelInboundHandler<Response> {\n\tprivate static final Logger LOGGER = LoggerFactory.getLogger(BenchmarkClientHandler.class);\n\n\tprivate final FutureContainer futureContainer;\n\n\tpublic BenchmarkClientHandler(FutureContainer futureContainer) {\n\t\tthis.futureContainer = futureContainer;\n\t}\n\n\tprotected void channelRead0(ChannelHandlerContext ctx, Response response) throws Exception {\n\t\tfutureContainer.notifyResponse(response);\n\t}\n\n\t@Override\n\tpublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {\n\t\tLOGGER.error(\"Exception caught on {}, \", ctx.channel(), cause);\n\t\tctx.channel().close();\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/BooleanSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class BooleanSerializer implements Serializer<Boolean> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Boolean value) {\n\t\tbyteBuf.writeBoolean(value);\n\t}\n\n\t@Override\n\tpublic Boolean read(ByteBuf byteBuf) {\n\t\treturn byteBuf.readBoolean();\n\t}\n\n\t@Override\n\tpublic Class<Boolean> typeClass() {\n\t\treturn Boolean.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/FastestSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.io.IOException;\n\nimport benchmark.rpc.protocol.Request;\nimport benchmark.rpc.protocol.Response;\nimport io.netty.buffer.ByteBuf;\n\npublic class FastestSerializer {\n\n\tprivate static final RequestSerializer requestSerializer = new RequestSerializer();\n\tprivate static final ResponseSerializer responseSerializer = new ResponseSerializer();\n\n\tpublic static void writeRequest(ByteBuf byteBuf, Request request) throws IOException {\n\t\tint beginWriterIndex = byteBuf.writerIndex();\n\t\tbyteBuf.writeInt(0);\n\n\t\trequestSerializer.write(byteBuf, request);\n\n\t\tint finishWriterIndex = byteBuf.writerIndex();\n\t\tint length = finishWriterIndex - beginWriterIndex - 4;\n\n\t\tbyteBuf.setInt(beginWriterIndex, length);\n\t}\n\n\tpublic static Request readRequest(ByteBuf byteBuf) throws IOException {\n\t\treturn requestSerializer.read(byteBuf);\n\t}\n\n\tpublic static void writeResponse(ByteBuf byteBuf, Response response) throws IOException {\n\t\tint beginWriterIndex = byteBuf.writerIndex();\n\t\tbyteBuf.writeInt(0);\n\n\t\tresponseSerializer.write(byteBuf, response);\n\n\t\tint finishWriterIndex = byteBuf.writerIndex();\n\t\tint length = finishWriterIndex - beginWriterIndex - 4;\n\n\t\tbyteBuf.setInt(beginWriterIndex, length);\n\t}\n\n\tpublic static Response readResponse(ByteBuf byteBuf) throws IOException {\n\t\treturn responseSerializer.read(byteBuf);\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/IntegerSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class IntegerSerializer implements Serializer<Integer> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Integer value) {\n\t\tbyteBuf.writeInt(value);\n\t}\n\n\t@Override\n\tpublic Integer read(ByteBuf byteBuf) {\n\t\treturn byteBuf.readInt();\n\t}\n\n\t@Override\n\tpublic Class<Integer> typeClass() {\n\t\treturn Integer.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/LocalDateSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.time.LocalDate;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class LocalDateSerializer implements Serializer<LocalDate> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, LocalDate localDate) {\n\t\tbyteBuf.writeShort(localDate.getYear());\n\t\tbyteBuf.writeByte(localDate.getMonthValue());\n\t\tbyteBuf.writeByte(localDate.getDayOfMonth());\n\t}\n\n\t@Override\n\tpublic LocalDate read(ByteBuf byteBuf) {\n\t\tint year = byteBuf.readShort();\n\t\tint month = byteBuf.readByte();\n\t\tint dayOfMonth = byteBuf.readByte();\n\n\t\treturn LocalDate.of(year, month, dayOfMonth);\n\t}\n\n\t@Override\n\tpublic Class<LocalDate> typeClass() {\n\t\treturn LocalDate.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/LocalDateTimeSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.LocalTime;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class LocalDateTimeSerializer implements Serializer<LocalDateTime> {\n\n\tprivate final LocalDateSerializer localDateSerializer = new LocalDateSerializer();\n\tprivate final LocalTimeSerializer localTimeSerializer = new LocalTimeSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, LocalDateTime localDateTime) {\n\t\tlocalDateSerializer.write(byteBuf, localDateTime.toLocalDate());\n\t\tlocalTimeSerializer.write(byteBuf, localDateTime.toLocalTime());\n\t}\n\n\t@Override\n\tpublic LocalDateTime read(ByteBuf byteBuf) {\n\t\tLocalDate localDate = localDateSerializer.read(byteBuf);\n\t\tLocalTime localTime = localTimeSerializer.read(byteBuf);\n\n\t\treturn LocalDateTime.of(localDate, localTime);\n\t}\n\n\t@Override\n\tpublic Class<LocalDateTime> typeClass() {\n\t\treturn LocalDateTime.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/LocalTimeSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.time.LocalTime;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class LocalTimeSerializer implements Serializer<LocalTime> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, LocalTime localTime) {\n\t\tbyteBuf.writeByte(localTime.getHour());\n\t\tbyteBuf.writeByte(localTime.getMinute());\n\t\tbyteBuf.writeByte(localTime.getSecond());\n\t\tbyteBuf.writeInt(localTime.getNano());\n\t}\n\n\t@Override\n\tpublic LocalTime read(ByteBuf byteBuf) {\n\t\tint hour = byteBuf.readByte();\n\t\tint minute = byteBuf.readByte();\n\t\tint second = byteBuf.readByte();\n\t\tint nanoOfSecond = byteBuf.readInt();\n\n\t\treturn LocalTime.of(hour, minute, second, nanoOfSecond);\n\t}\n\n\t@Override\n\tpublic Class<LocalTime> typeClass() {\n\t\treturn LocalTime.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/LongSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class LongSerializer implements Serializer<Long> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Long value) {\n\t\tbyteBuf.writeLong(value);\n\t}\n\n\t@Override\n\tpublic Long read(ByteBuf byteBuf) {\n\t\treturn byteBuf.readLong();\n\t}\n\n\t@Override\n\tpublic Class<Long> typeClass() {\n\t\treturn Long.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/ObjectSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\n@SuppressWarnings(\"unchecked\")\npublic class ObjectSerializer implements Serializer<Object> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Object object) {\n\t\tif (object == null) {\n\t\t\tbyteBuf.writeInt(0);\n\t\t\treturn;\n\t\t}\n\n\t\tClass<?> clazz = object.getClass();\n\n\t\tint id = Register.id(clazz);\n\t\tSerializer<Object> serializer = (Serializer<Object>) Register.serializer(id);\n\n\t\tbyteBuf.writeInt(id);\n\t\tserializer.write(byteBuf, object);\n\t}\n\n\t@Override\n\tpublic Object read(ByteBuf byteBuf) {\n\t\tint id = byteBuf.readInt();\n\t\tSerializer<Object> serializer = (Serializer<Object>) Register.serializer(id);\n\t\treturn serializer.read(byteBuf);\n\t}\n\n\t@Override\n\tpublic Class<Object> typeClass() {\n\t\treturn Object.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/Register.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.util.IdentityHashMap;\n\npublic class Register {\n\tprivate final static Serializer<?>[] idToSerializer = new Serializer[16];\n\tprivate final static IdentityHashMap<Class<?>, Integer> classToId = new IdentityHashMap<>();\n\tprivate final static IdentityHashMap<Class<?>, Serializer<?>> classToSerializer = new IdentityHashMap<>();\n\n\tstatic {\n\t\tint index = 0;\n\n\t\tidToSerializer[index++] = new VoidSerializer();\n\t\tidToSerializer[index++] = new IntegerSerializer();\n\t\tidToSerializer[index++] = new LongSerializer();\n\t\tidToSerializer[index++] = new BooleanSerializer();\n\t\tidToSerializer[index++] = new StringSerializer();\n\t\tidToSerializer[index++] = new LocalDateSerializer();\n\t\tidToSerializer[index++] = new LocalTimeSerializer();\n\t\tidToSerializer[index++] = new LocalDateTimeSerializer();\n\t\tidToSerializer[index++] = new UserSerializer();\n\t\tidToSerializer[index++] = new UserPageSerializer();\n\t\tidToSerializer[index++] = new RequestSerializer();\n\n\t\tfor (int i = 0; i < index; i++) {\n\t\t\tSerializer<?> serializer = idToSerializer[i];\n\t\t\tClass<?> clazz = serializer.typeClass();\n\n\t\t\tclassToSerializer.put(clazz, serializer);\n\t\t\tclassToId.put(clazz, i);\n\t\t}\n\t}\n\n\tpublic static Serializer<?> serializer(int id) {\n\t\treturn idToSerializer[id];\n\t}\n\n\tpublic static Serializer<?> serializer(Class<?> clazz) {\n\t\treturn classToSerializer.get(clazz);\n\t}\n\n\tpublic static int id(Class<?> clazz) {\n\t\treturn classToId.get(clazz);\n\t}\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/RequestSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport benchmark.rpc.protocol.Request;\nimport io.netty.buffer.ByteBuf;\n\npublic class RequestSerializer implements Serializer<Request> {\n\n\tprivate final ObjectSerializer objectSerializer = new ObjectSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Request request) {\n\t\tObject[] params = request.getParams();\n\n\t\tbyteBuf.writeLong(request.getRequestId());\n\t\tbyteBuf.writeInt(request.getServiceId());\n\n\t\tbyteBuf.writeInt(params.length);\n\t\tfor (int i = 0; i < params.length; i++) {\n\t\t\tobjectSerializer.write(byteBuf, params[i]);\n\t\t}\n\t}\n\n\t@Override\n\tpublic Request read(ByteBuf byteBuf) {\n\t\tlong requestId = byteBuf.readLong();\n\t\tint serviceId = byteBuf.readInt();\n\n\t\tint size = byteBuf.readInt();\n\t\tObject[] params = new Object[size];\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tparams[i] = objectSerializer.read(byteBuf);\n\t\t}\n\n\t\tRequest request = new Request();\n\t\trequest.setRequestId(requestId);\n\t\trequest.setServiceId(serviceId);\n\t\trequest.setParams(params);\n\n\t\treturn request;\n\t}\n\n\t@Override\n\tpublic Class<Request> typeClass() {\n\t\treturn Request.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/ResponseSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport benchmark.rpc.protocol.Response;\nimport io.netty.buffer.ByteBuf;\n\npublic class ResponseSerializer implements Serializer<Response> {\n\n\tprivate final ObjectSerializer objectSerializer = new ObjectSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Response response) {\n\t\tbyteBuf.writeLong(response.getRequestId());\n\t\tbyteBuf.writeByte(response.getStatusCode());\n\t\tobjectSerializer.write(byteBuf, response.getResult());\n\t}\n\n\t@Override\n\tpublic Response read(ByteBuf byteBuf) {\n\t\tlong requestId = byteBuf.readLong();\n\t\tbyte statusCode = byteBuf.readByte();\n\t\tObject result = objectSerializer.read(byteBuf);\n\n\t\tResponse response = new Response();\n\t\tresponse.setRequestId(requestId);\n\t\tresponse.setStatusCode(statusCode);\n\t\tresponse.setResult(result);\n\n\t\treturn response;\n\t}\n\n\t@Override\n\tpublic Class<Response> typeClass() {\n\t\treturn Response.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/Serializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic interface Serializer<T> {\n\n\tpublic void write(ByteBuf byteBuf, T object);\n\n\tpublic T read(ByteBuf byteBuf);\n\n\tpublic Class<? super T> typeClass();\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/StringSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.nio.charset.StandardCharsets;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class StringSerializer implements Serializer<String> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, String str) {\n\t\tbyte[] bytes = str.getBytes(StandardCharsets.UTF_8);\n\t\tbyteBuf.writeInt(bytes.length);\n\t\tbyteBuf.writeBytes(bytes);\n\t}\n\n\t@Override\n\tpublic String read(ByteBuf byteBuf) {\n\t\tint length = byteBuf.readInt();\n\t\tbyte[] bytes = new byte[length];\n\t\tbyteBuf.readBytes(bytes);\n\n\t\treturn new String(bytes, StandardCharsets.UTF_8);\n\t}\n\n\t@Override\n\tpublic Class<String> typeClass() {\n\t\treturn String.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/UserPageSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.RandomAccess;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport io.netty.buffer.ByteBuf;\n\npublic class UserPageSerializer implements Serializer<Page<User>> {\n\n\tprivate final UserSerializer userSerializer = new UserSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Page<User> userPage) {\n\t\tList<User> userList = userPage.getResult();\n\n\t\tbyteBuf.writeInt(userPage.getPageNo());\n\t\tbyteBuf.writeInt(userPage.getTotal());\n\t\tbyteBuf.writeInt(userList.size());\n\n\t\tif (userList instanceof RandomAccess) {\n\t\t\tfor (int i = 0; i < userList.size(); i++) {\n\t\t\t\tuserSerializer.write(byteBuf, userList.get(i));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (User user : userList) {\n\t\t\t\tuserSerializer.write(byteBuf, user);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic Page<User> read(ByteBuf byteBuf) {\n\t\tint pageNo = byteBuf.readInt();\n\t\tint total = byteBuf.readInt();\n\t\tint size = byteBuf.readInt();\n\n\t\tList<User> userList = new ArrayList<>(size);\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tuserList.add(userSerializer.read(byteBuf));\n\t\t}\n\n\t\tPage<User> userPage = new Page<>();\n\t\tuserPage.setPageNo(pageNo);\n\t\tuserPage.setTotal(total);\n\t\tuserPage.setResult(userList);\n\n\t\treturn userPage;\n\t}\n\n\t@Override\n\t@SuppressWarnings(\"rawtypes\")\n\tpublic Class<Page> typeClass() {\n\t\treturn Page.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/UserSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.RandomAccess;\n\nimport benchmark.bean.User;\nimport io.netty.buffer.ByteBuf;\n\npublic class UserSerializer implements Serializer<User> {\n\tprivate final StringSerializer stringSerializer = new StringSerializer();\n\tprivate final LocalDateSerializer localDateSerializer = new LocalDateSerializer();\n\tprivate final LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, User user) {\n\n\t\tbyteBuf.writeLong(user.getId());\n\t\tstringSerializer.write(byteBuf, user.getName());\n\t\tbyteBuf.writeInt(user.getSex());\n\t\tlocalDateSerializer.write(byteBuf, user.getBirthday());\n\t\tstringSerializer.write(byteBuf, user.getEmail());\n\t\tstringSerializer.write(byteBuf, user.getMobile());\n\t\tstringSerializer.write(byteBuf, user.getAddress());\n\t\tstringSerializer.write(byteBuf, user.getIcon());\n\n\t\tList<Integer> permissions = user.getPermissions();\n\t\tbyteBuf.writeInt(user.getPermissions().size());\n\t\tif (permissions instanceof RandomAccess) {\n\t\t\tfor (int i = 0; i < permissions.size(); i++) {\n\t\t\t\tbyteBuf.writeInt(permissions.get(i));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (int permission : permissions) {\n\t\t\t\tbyteBuf.writeInt(permission);\n\t\t\t}\n\t\t}\n\n\t\tbyteBuf.writeInt(user.getStatus());\n\t\tlocalDateTimeSerializer.write(byteBuf, user.getCreateTime());\n\t\tlocalDateTimeSerializer.write(byteBuf, user.getUpdateTime());\n\t}\n\n\t@Override\n\tpublic User read(ByteBuf byteBuf) {\n\t\tlong id = byteBuf.readLong();\n\t\tString name = stringSerializer.read(byteBuf);\n\t\tint sex = byteBuf.readInt();\n\t\tLocalDate birthday = localDateSerializer.read(byteBuf);\n\t\tString email = stringSerializer.read(byteBuf);\n\t\tString mobile = stringSerializer.read(byteBuf);\n\t\tString address = stringSerializer.read(byteBuf);\n\t\tString icon = stringSerializer.read(byteBuf);\n\n\t\tint size = byteBuf.readInt();\n\t\tList<Integer> permissions = new ArrayList<>(size);\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tpermissions.add(byteBuf.readInt());\n\t\t}\n\n\t\tint status = byteBuf.readInt();\n\t\tLocalDateTime createTime = localDateTimeSerializer.read(byteBuf);\n\t\tLocalDateTime updateTime = localDateTimeSerializer.read(byteBuf);\n\n\t\tUser user = new User();\n\t\tuser.setId(id);\n\t\tuser.setName(name);\n\t\tuser.setSex(sex);\n\t\tuser.setBirthday(birthday);\n\t\tuser.setEmail(email);\n\t\tuser.setMobile(mobile);\n\t\tuser.setAddress(address);\n\t\tuser.setIcon(icon);\n\t\tuser.setPermissions(permissions);\n\t\tuser.setStatus(status);\n\t\tuser.setCreateTime(createTime);\n\t\tuser.setUpdateTime(updateTime);\n\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic Class<User> typeClass() {\n\t\treturn User.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/java/benchmark/rpc/netty/serializer/VoidSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class VoidSerializer implements Serializer<Void> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Void value) {\n\t}\n\n\t@Override\n\tpublic Void read(ByteBuf byteBuf) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Class<Void> typeClass() {\n\t\treturn Void.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\"\n\t\tclass=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy\n\t\t\tclass=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-netty-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<appender-ref ref=\"console\" />\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "netty-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>rpc-benchmark</groupId>\n\t<artifactId>netty-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>netty-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<netty.version>4.1.33.Final</netty.version>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.netty</groupId>\n\t\t\t<artifactId>netty-codec</artifactId>\n\t\t\t<version>${netty.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.netty</groupId>\n\t\t\t<artifactId>netty-transport-native-epoll</artifactId>\n\t\t\t<version>${netty.version}</version>\n\t\t\t<classifier>linux-x86_64</classifier>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport java.net.InetSocketAddress;\n\nimport benchmark.rpc.netty.server.handler.BenchmarkChannelInitializer;\nimport io.netty.bootstrap.ServerBootstrap;\nimport io.netty.channel.Channel;\nimport io.netty.channel.ChannelOption;\nimport io.netty.channel.EventLoopGroup;\nimport io.netty.channel.ServerChannel;\nimport io.netty.channel.WriteBufferWaterMark;\nimport io.netty.channel.epoll.Epoll;\nimport io.netty.channel.epoll.EpollChannelOption;\nimport io.netty.channel.epoll.EpollEventLoopGroup;\nimport io.netty.channel.epoll.EpollServerSocketChannel;\nimport io.netty.channel.nio.NioEventLoopGroup;\nimport io.netty.channel.socket.nio.NioServerSocketChannel;\nimport io.netty.util.ResourceLeakDetector;\nimport io.netty.util.ResourceLeakDetector.Level;\n\npublic class Server {\n\n\tpublic static final String host = \"benchmark-server\";\n\tpublic static final int port = 8080;\n\n\tstatic {\n\t\tResourceLeakDetector.setLevel(Level.DISABLED);\n\t}\n\n\tpublic static void main(String[] args) throws InterruptedException {\n\t\tif (Epoll.isAvailable()) {\n\t\t\tdoRun(//\n\t\t\t\t\tnew EpollEventLoopGroup(), //\n\t\t\t\t\tEpollServerSocketChannel.class, //\n\t\t\t\t\ttrue);\n\t\t} else {\n\t\t\tdoRun(//\n\t\t\t\t\tnew NioEventLoopGroup(), //\n\t\t\t\t\tNioServerSocketChannel.class, //\n\t\t\t\t\tfalse);\n\t\t}\n\t}\n\n\tprivate static void doRun(EventLoopGroup loupGroup, Class<? extends ServerChannel> serverChannelClass,\n\t\t\tboolean isEpoll) throws InterruptedException {\n\t\ttry {\n\t\t\tInetSocketAddress inet = new InetSocketAddress(port);\n\n\t\t\tServerBootstrap b = new ServerBootstrap();\n\n\t\t\tif (isEpoll) {\n\t\t\t\tb.option(EpollChannelOption.SO_REUSEPORT, true);\n\t\t\t}\n\n\t\t\tb.option(ChannelOption.SO_BACKLOG, 1024 * 8);\n\t\t\tb.option(ChannelOption.SO_REUSEADDR, true);\n\t\t\tb.option(ChannelOption.SO_RCVBUF, 256 * 1024);\n\t\t\tb.group(loupGroup).channel(serverChannelClass).childHandler(new BenchmarkChannelInitializer());\n\t\t\tb.childOption(ChannelOption.SO_REUSEADDR, true);\n\n\t\t\tb.childOption(ChannelOption.SO_REUSEADDR, true);\n\t\t\tb.childOption(ChannelOption.SO_RCVBUF, 256 * 1024);\n\t\t\tb.childOption(ChannelOption.SO_SNDBUF, 256 * 1024);\n\t\t\tb.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, //\n\t\t\t\t\tnew WriteBufferWaterMark(1024 * 1024, 2048 * 1024));\n\n\t\t\tChannel ch = b.bind(inet).sync().channel();\n\n\t\t\tSystem.out.printf(\"Httpd started. Listening on: %s%n\", inet.toString());\n\n\t\t\tch.closeFuture().sync();\n\t\t} finally {\n\t\t\tloupGroup.shutdownGracefully().sync();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/BooleanSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class BooleanSerializer implements Serializer<Boolean> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Boolean value) {\n\t\tbyteBuf.writeBoolean(value);\n\t}\n\n\t@Override\n\tpublic Boolean read(ByteBuf byteBuf) {\n\t\treturn byteBuf.readBoolean();\n\t}\n\n\t@Override\n\tpublic Class<Boolean> typeClass() {\n\t\treturn Boolean.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/FastestSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.io.IOException;\n\nimport benchmark.rpc.protocol.Request;\nimport benchmark.rpc.protocol.Response;\nimport io.netty.buffer.ByteBuf;\n\npublic class FastestSerializer {\n\n\tprivate static final RequestSerializer requestSerializer = new RequestSerializer();\n\tprivate static final ResponseSerializer responseSerializer = new ResponseSerializer();\n\n\tpublic static void writeRequest(ByteBuf byteBuf, Request request) throws IOException {\n\t\tint beginWriterIndex = byteBuf.writerIndex();\n\t\tbyteBuf.writeInt(0);\n\n\t\trequestSerializer.write(byteBuf, request);\n\n\t\tint finishWriterIndex = byteBuf.writerIndex();\n\t\tint length = finishWriterIndex - beginWriterIndex - 4;\n\n\t\tbyteBuf.setInt(beginWriterIndex, length);\n\t}\n\n\tpublic static Request readRequest(ByteBuf byteBuf) throws IOException {\n\t\treturn requestSerializer.read(byteBuf);\n\t}\n\n\tpublic static void writeResponse(ByteBuf byteBuf, Response response) throws IOException {\n\t\tint beginWriterIndex = byteBuf.writerIndex();\n\t\tbyteBuf.writeInt(0);\n\n\t\tresponseSerializer.write(byteBuf, response);\n\n\t\tint finishWriterIndex = byteBuf.writerIndex();\n\t\tint length = finishWriterIndex - beginWriterIndex - 4;\n\n\t\tbyteBuf.setInt(beginWriterIndex, length);\n\t}\n\n\tpublic static Response readResponse(ByteBuf byteBuf) throws IOException {\n\t\treturn responseSerializer.read(byteBuf);\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/IntegerSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class IntegerSerializer implements Serializer<Integer> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Integer value) {\n\t\tbyteBuf.writeInt(value);\n\t}\n\n\t@Override\n\tpublic Integer read(ByteBuf byteBuf) {\n\t\treturn byteBuf.readInt();\n\t}\n\n\t@Override\n\tpublic Class<Integer> typeClass() {\n\t\treturn Integer.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/LocalDateSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.time.LocalDate;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class LocalDateSerializer implements Serializer<LocalDate> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, LocalDate localDate) {\n\t\tbyteBuf.writeShort(localDate.getYear());\n\t\tbyteBuf.writeByte(localDate.getMonthValue());\n\t\tbyteBuf.writeByte(localDate.getDayOfMonth());\n\t}\n\n\t@Override\n\tpublic LocalDate read(ByteBuf byteBuf) {\n\t\tint year = byteBuf.readShort();\n\t\tint month = byteBuf.readByte();\n\t\tint dayOfMonth = byteBuf.readByte();\n\n\t\treturn LocalDate.of(year, month, dayOfMonth);\n\t}\n\n\t@Override\n\tpublic Class<LocalDate> typeClass() {\n\t\treturn LocalDate.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/LocalDateTimeSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.LocalTime;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class LocalDateTimeSerializer implements Serializer<LocalDateTime> {\n\n\tprivate final LocalDateSerializer localDateSerializer = new LocalDateSerializer();\n\tprivate final LocalTimeSerializer localTimeSerializer = new LocalTimeSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, LocalDateTime localDateTime) {\n\t\tlocalDateSerializer.write(byteBuf, localDateTime.toLocalDate());\n\t\tlocalTimeSerializer.write(byteBuf, localDateTime.toLocalTime());\n\t}\n\n\t@Override\n\tpublic LocalDateTime read(ByteBuf byteBuf) {\n\t\tLocalDate localDate = localDateSerializer.read(byteBuf);\n\t\tLocalTime localTime = localTimeSerializer.read(byteBuf);\n\n\t\treturn LocalDateTime.of(localDate, localTime);\n\t}\n\n\t@Override\n\tpublic Class<LocalDateTime> typeClass() {\n\t\treturn LocalDateTime.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/LocalTimeSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.time.LocalTime;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class LocalTimeSerializer implements Serializer<LocalTime> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, LocalTime localTime) {\n\t\tbyteBuf.writeByte(localTime.getHour());\n\t\tbyteBuf.writeByte(localTime.getMinute());\n\t\tbyteBuf.writeByte(localTime.getSecond());\n\t\tbyteBuf.writeInt(localTime.getNano());\n\t}\n\n\t@Override\n\tpublic LocalTime read(ByteBuf byteBuf) {\n\t\tint hour = byteBuf.readByte();\n\t\tint minute = byteBuf.readByte();\n\t\tint second = byteBuf.readByte();\n\t\tint nanoOfSecond = byteBuf.readInt();\n\n\t\treturn LocalTime.of(hour, minute, second, nanoOfSecond);\n\t}\n\n\t@Override\n\tpublic Class<LocalTime> typeClass() {\n\t\treturn LocalTime.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/LongSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class LongSerializer implements Serializer<Long> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Long value) {\n\t\tbyteBuf.writeLong(value);\n\t}\n\n\t@Override\n\tpublic Long read(ByteBuf byteBuf) {\n\t\treturn byteBuf.readLong();\n\t}\n\n\t@Override\n\tpublic Class<Long> typeClass() {\n\t\treturn Long.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/ObjectSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\n@SuppressWarnings(\"unchecked\")\npublic class ObjectSerializer implements Serializer<Object> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Object object) {\n\t\tif (object == null) {\n\t\t\tbyteBuf.writeInt(0);\n\t\t\treturn;\n\t\t}\n\n\t\tClass<?> clazz = object.getClass();\n\n\t\tint id = Register.id(clazz);\n\t\tSerializer<Object> serializer = (Serializer<Object>) Register.serializer(id);\n\n\t\tbyteBuf.writeInt(id);\n\t\tserializer.write(byteBuf, object);\n\t}\n\n\t@Override\n\tpublic Object read(ByteBuf byteBuf) {\n\t\tint id = byteBuf.readInt();\n\t\tSerializer<Object> serializer = (Serializer<Object>) Register.serializer(id);\n\t\treturn serializer.read(byteBuf);\n\t}\n\n\t@Override\n\tpublic Class<Object> typeClass() {\n\t\treturn Object.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/Register.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.util.IdentityHashMap;\n\npublic class Register {\n\tprivate final static Serializer<?>[] idToSerializer = new Serializer[16];\n\tprivate final static IdentityHashMap<Class<?>, Integer> classToId = new IdentityHashMap<>();\n\tprivate final static IdentityHashMap<Class<?>, Serializer<?>> classToSerializer = new IdentityHashMap<>();\n\n\tstatic {\n\t\tint index = 0;\n\n\t\tidToSerializer[index++] = new VoidSerializer();\n\t\tidToSerializer[index++] = new IntegerSerializer();\n\t\tidToSerializer[index++] = new LongSerializer();\n\t\tidToSerializer[index++] = new BooleanSerializer();\n\t\tidToSerializer[index++] = new StringSerializer();\n\t\tidToSerializer[index++] = new LocalDateSerializer();\n\t\tidToSerializer[index++] = new LocalTimeSerializer();\n\t\tidToSerializer[index++] = new LocalDateTimeSerializer();\n\t\tidToSerializer[index++] = new UserSerializer();\n\t\tidToSerializer[index++] = new UserPageSerializer();\n\t\tidToSerializer[index++] = new RequestSerializer();\n\n\t\tfor (int i = 0; i < index; i++) {\n\t\t\tSerializer<?> serializer = idToSerializer[i];\n\t\t\tClass<?> clazz = serializer.typeClass();\n\n\t\t\tclassToSerializer.put(clazz, serializer);\n\t\t\tclassToId.put(clazz, i);\n\t\t}\n\t}\n\n\tpublic static Serializer<?> serializer(int id) {\n\t\treturn idToSerializer[id];\n\t}\n\n\tpublic static Serializer<?> serializer(Class<?> clazz) {\n\t\treturn classToSerializer.get(clazz);\n\t}\n\n\tpublic static int id(Class<?> clazz) {\n\t\treturn classToId.get(clazz);\n\t}\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/RequestSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport benchmark.rpc.protocol.Request;\nimport io.netty.buffer.ByteBuf;\n\npublic class RequestSerializer implements Serializer<Request> {\n\n\tprivate final ObjectSerializer objectSerializer = new ObjectSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Request request) {\n\t\tObject[] params = request.getParams();\n\n\t\tbyteBuf.writeLong(request.getRequestId());\n\t\tbyteBuf.writeInt(request.getServiceId());\n\n\t\tbyteBuf.writeInt(params.length);\n\t\tfor (int i = 0; i < params.length; i++) {\n\t\t\tobjectSerializer.write(byteBuf, params[i]);\n\t\t}\n\t}\n\n\t@Override\n\tpublic Request read(ByteBuf byteBuf) {\n\t\tlong requestId = byteBuf.readLong();\n\t\tint serviceId = byteBuf.readInt();\n\n\t\tint size = byteBuf.readInt();\n\t\tObject[] params = new Object[size];\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tparams[i] = objectSerializer.read(byteBuf);\n\t\t}\n\n\t\tRequest request = new Request();\n\t\trequest.setRequestId(requestId);\n\t\trequest.setServiceId(serviceId);\n\t\trequest.setParams(params);\n\n\t\treturn request;\n\t}\n\n\t@Override\n\tpublic Class<Request> typeClass() {\n\t\treturn Request.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/ResponseSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport benchmark.rpc.protocol.Response;\nimport io.netty.buffer.ByteBuf;\n\npublic class ResponseSerializer implements Serializer<Response> {\n\n\tprivate final ObjectSerializer objectSerializer = new ObjectSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Response response) {\n\t\tbyteBuf.writeLong(response.getRequestId());\n\t\tbyteBuf.writeByte(response.getStatusCode());\n\t\tobjectSerializer.write(byteBuf, response.getResult());\n\t}\n\n\t@Override\n\tpublic Response read(ByteBuf byteBuf) {\n\t\tlong requestId = byteBuf.readLong();\n\t\tbyte statusCode = byteBuf.readByte();\n\t\tObject result = objectSerializer.read(byteBuf);\n\n\t\tResponse response = new Response();\n\t\tresponse.setRequestId(requestId);\n\t\tresponse.setStatusCode(statusCode);\n\t\tresponse.setResult(result);\n\n\t\treturn response;\n\t}\n\n\t@Override\n\tpublic Class<Response> typeClass() {\n\t\treturn Response.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/Serializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic interface Serializer<T> {\n\n\tpublic void write(ByteBuf byteBuf, T object);\n\n\tpublic T read(ByteBuf byteBuf);\n\n\tpublic Class<? super T> typeClass();\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/StringSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.nio.charset.StandardCharsets;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class StringSerializer implements Serializer<String> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, String str) {\n\t\tbyte[] bytes = str.getBytes(StandardCharsets.UTF_8);\n\t\tbyteBuf.writeInt(bytes.length);\n\t\tbyteBuf.writeBytes(bytes);\n\t}\n\n\t@Override\n\tpublic String read(ByteBuf byteBuf) {\n\t\tint length = byteBuf.readInt();\n\t\tbyte[] bytes = new byte[length];\n\t\tbyteBuf.readBytes(bytes);\n\n\t\treturn new String(bytes, StandardCharsets.UTF_8);\n\t}\n\n\t@Override\n\tpublic Class<String> typeClass() {\n\t\treturn String.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/UserPageSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.RandomAccess;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport io.netty.buffer.ByteBuf;\n\npublic class UserPageSerializer implements Serializer<Page<User>> {\n\n\tprivate final UserSerializer userSerializer = new UserSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Page<User> userPage) {\n\t\tList<User> userList = userPage.getResult();\n\n\t\tbyteBuf.writeInt(userPage.getPageNo());\n\t\tbyteBuf.writeInt(userPage.getTotal());\n\t\tbyteBuf.writeInt(userList.size());\n\n\t\tif (userList instanceof RandomAccess) {\n\t\t\tfor (int i = 0; i < userList.size(); i++) {\n\t\t\t\tuserSerializer.write(byteBuf, userList.get(i));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (User user : userList) {\n\t\t\t\tuserSerializer.write(byteBuf, user);\n\t\t\t}\n\t\t}\n\t}\n\n\t@Override\n\tpublic Page<User> read(ByteBuf byteBuf) {\n\t\tint pageNo = byteBuf.readInt();\n\t\tint total = byteBuf.readInt();\n\t\tint size = byteBuf.readInt();\n\n\t\tList<User> userList = new ArrayList<>(size);\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tuserList.add(userSerializer.read(byteBuf));\n\t\t}\n\n\t\tPage<User> userPage = new Page<>();\n\t\tuserPage.setPageNo(pageNo);\n\t\tuserPage.setTotal(total);\n\t\tuserPage.setResult(userList);\n\n\t\treturn userPage;\n\t}\n\n\t@Override\n\t@SuppressWarnings(\"rawtypes\")\n\tpublic Class<Page> typeClass() {\n\t\treturn Page.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/UserSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.RandomAccess;\n\nimport benchmark.bean.User;\nimport io.netty.buffer.ByteBuf;\n\npublic class UserSerializer implements Serializer<User> {\n\tprivate final StringSerializer stringSerializer = new StringSerializer();\n\tprivate final LocalDateSerializer localDateSerializer = new LocalDateSerializer();\n\tprivate final LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer();\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, User user) {\n\n\t\tbyteBuf.writeLong(user.getId());\n\t\tstringSerializer.write(byteBuf, user.getName());\n\t\tbyteBuf.writeInt(user.getSex());\n\t\tlocalDateSerializer.write(byteBuf, user.getBirthday());\n\t\tstringSerializer.write(byteBuf, user.getEmail());\n\t\tstringSerializer.write(byteBuf, user.getMobile());\n\t\tstringSerializer.write(byteBuf, user.getAddress());\n\t\tstringSerializer.write(byteBuf, user.getIcon());\n\n\t\tList<Integer> permissions = user.getPermissions();\n\t\tbyteBuf.writeInt(user.getPermissions().size());\n\t\tif (permissions instanceof RandomAccess) {\n\t\t\tfor (int i = 0; i < permissions.size(); i++) {\n\t\t\t\tbyteBuf.writeInt(permissions.get(i));\n\t\t\t}\n\t\t} else {\n\t\t\tfor (int permission : permissions) {\n\t\t\t\tbyteBuf.writeInt(permission);\n\t\t\t}\n\t\t}\n\n\t\tbyteBuf.writeInt(user.getStatus());\n\t\tlocalDateTimeSerializer.write(byteBuf, user.getCreateTime());\n\t\tlocalDateTimeSerializer.write(byteBuf, user.getUpdateTime());\n\t}\n\n\t@Override\n\tpublic User read(ByteBuf byteBuf) {\n\t\tlong id = byteBuf.readLong();\n\t\tString name = stringSerializer.read(byteBuf);\n\t\tint sex = byteBuf.readInt();\n\t\tLocalDate birthday = localDateSerializer.read(byteBuf);\n\t\tString email = stringSerializer.read(byteBuf);\n\t\tString mobile = stringSerializer.read(byteBuf);\n\t\tString address = stringSerializer.read(byteBuf);\n\t\tString icon = stringSerializer.read(byteBuf);\n\n\t\tint size = byteBuf.readInt();\n\t\tList<Integer> permissions = new ArrayList<>(size);\n\t\tfor (int i = 0; i < size; i++) {\n\t\t\tpermissions.add(byteBuf.readInt());\n\t\t}\n\n\t\tint status = byteBuf.readInt();\n\t\tLocalDateTime createTime = localDateTimeSerializer.read(byteBuf);\n\t\tLocalDateTime updateTime = localDateTimeSerializer.read(byteBuf);\n\n\t\tUser user = new User();\n\t\tuser.setId(id);\n\t\tuser.setName(name);\n\t\tuser.setSex(sex);\n\t\tuser.setBirthday(birthday);\n\t\tuser.setEmail(email);\n\t\tuser.setMobile(mobile);\n\t\tuser.setAddress(address);\n\t\tuser.setIcon(icon);\n\t\tuser.setPermissions(permissions);\n\t\tuser.setStatus(status);\n\t\tuser.setCreateTime(createTime);\n\t\tuser.setUpdateTime(updateTime);\n\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic Class<User> typeClass() {\n\t\treturn User.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/serializer/VoidSerializer.java",
    "content": "package benchmark.rpc.netty.serializer;\n\nimport io.netty.buffer.ByteBuf;\n\npublic class VoidSerializer implements Serializer<Void> {\n\n\t@Override\n\tpublic void write(ByteBuf byteBuf, Void value) {\n\t}\n\n\t@Override\n\tpublic Void read(ByteBuf byteBuf) {\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic Class<Void> typeClass() {\n\t\treturn Void.class;\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/server/codec/ProtocolDecoder.java",
    "content": "package benchmark.rpc.netty.server.codec;\n\nimport benchmark.rpc.netty.serializer.FastestSerializer;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler.codec.LengthFieldBasedFrameDecoder;\n\npublic class ProtocolDecoder extends LengthFieldBasedFrameDecoder {\n\n\tprivate static final int HEADER_FIELD_LENGTH = 4;\n\n\tpublic ProtocolDecoder(int maxFrameLength) {\n\t\tsuper(maxFrameLength, 0, HEADER_FIELD_LENGTH, 0, HEADER_FIELD_LENGTH);\n\t}\n\n\t@Override\n\tprotected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {\n\t\tByteBuf buffer = (ByteBuf) super.decode(ctx, in);\n\n\t\tif (buffer != null) {\n\n\t\t\ttry {\n\t\t\t\treturn FastestSerializer.readRequest(buffer);\n\t\t\t} finally {\n\t\t\t\tbuffer.release();\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/server/codec/ProtocolEncoder.java",
    "content": "package benchmark.rpc.netty.server.codec;\n\nimport benchmark.rpc.netty.serializer.FastestSerializer;\nimport benchmark.rpc.protocol.Response;\nimport io.netty.buffer.ByteBuf;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.handler.codec.MessageToByteEncoder;\n\npublic class ProtocolEncoder extends MessageToByteEncoder<Response> {\n\n\tprotected void encode(ChannelHandlerContext ctx, Response response, ByteBuf buffer) throws Exception {\n\t\tFastestSerializer.writeResponse(buffer, response);\n\t}\n\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/server/handler/BenchmarkChannelInitializer.java",
    "content": "package benchmark.rpc.netty.server.handler;\n\nimport benchmark.rpc.netty.server.codec.ProtocolDecoder;\nimport benchmark.rpc.netty.server.codec.ProtocolEncoder;\nimport io.netty.channel.ChannelInitializer;\nimport io.netty.channel.socket.SocketChannel;\n\npublic class BenchmarkChannelInitializer extends ChannelInitializer<SocketChannel> {\n\n\tpublic static final int MAX_FRAME_LENGTH = 8 * 1024 * 1024;\n\n\t@Override\n\tpublic void initChannel(SocketChannel ch) throws Exception {\n\t\tch.pipeline()//\n\t\t\t\t.addLast(\"encoder\", new ProtocolEncoder())//\n\t\t\t\t.addLast(\"decoder\", new ProtocolDecoder(MAX_FRAME_LENGTH))//\n\t\t\t\t.addLast(\"handler\", new BenchmarkServerHandler());\n\t}\n}\n"
  },
  {
    "path": "netty-server/src/main/java/benchmark/rpc/netty/server/handler/BenchmarkServerHandler.java",
    "content": "package benchmark.rpc.netty.server.handler;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport benchmark.rpc.protocol.Request;\nimport benchmark.rpc.protocol.Response;\nimport benchmark.rpc.route.RouteService;\nimport io.netty.channel.ChannelHandlerContext;\nimport io.netty.channel.SimpleChannelInboundHandler;\n\npublic class BenchmarkServerHandler extends SimpleChannelInboundHandler<Request> {\n\tprivate static final Logger LOGGER = LoggerFactory.getLogger(BenchmarkServerHandler.class);\n\n\tprivate final RouteService routeService = new RouteService();\n\n\tprotected void channelRead0(ChannelHandlerContext ctx, Request msg) throws Exception {\n\t\tfinal long requestId = msg.getRequestId();\n\t\tfinal int serviceId = msg.getServiceId();\n\t\tfinal Object[] params = msg.getParams();\n\n\t\tObject result = routeService.invoke(serviceId, params);\n\n\t\tResponse response = new Response();\n\n\t\tresponse.setRequestId(requestId);\n\t\tresponse.setStatusCode((byte) 1);\n\t\tresponse.setResult(result);\n\n\t\tctx.writeAndFlush(response, ctx.voidPromise());\n\t}\n\t\n\t\n\n\t@Override\n\tpublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {\n\t\tLOGGER.error(\"Exception caught on {}, \", ctx.channel(), cause);\n\t\tctx.channel().close();\n\t}\n}\n"
  },
  {
    "path": "pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>benchmark.rpc</groupId>\n    <artifactId>rpc-benchmark</artifactId>\n    <version>round-5</version>\n    <packaging>pom</packaging>\n\n    <name>rpc-benchmark</name>\n\n    <modules>\n        <module>benchmark-base</module>\n        <module>armeria-client</module>\n        <module>armeria-server</module>\n        <module>dubbo-client</module>\n        <module>dubbo-server</module>\n        <module>dubbo-kryo-client</module>\n        <module>dubbo-kryo-server</module>\n        <module>grpc-client</module>\n        <module>grpc-server</module>\n        <module>hprose-client</module>\n        <module>hprose-server</module>\n        <module>jupiter-client</module>\n        <module>jupiter-server</module>\n        <module>motan-client</module>\n        <module>motan-server</module>\n        <module>netty-client</module>\n        <module>netty-server</module>\n        <module>rapidoid-client</module>\n        <module>rapidoid-server</module>\n        <module>servicecomb-client</module>\n        <module>servicecomb-server</module>\n        <module>sofa-client</module>\n        <module>sofa-server</module>\n        <module>springboot-client</module>\n        <module>springboot-server</module>\n        <module>springboot-undertow-client</module>\n        <module>springboot-undertow-server</module>\n        <module>springwebflux-client</module>\n        <module>springwebflux-server</module>\n        <module>thrift-client</module>\n        <module>thrift-server</module>\n        <module>turbo-rpc-client</module>\n        <module>turbo-rpc-server</module>\n        <module>turbo-rest-client</module>\n        <module>turbo-rest-server</module>\n        <module>undertow-async-client</module>\n        <module>undertow-async-server</module>\n        <module>undertow-client</module>\n        <module>undertow-server</module>\n        <module>brpc-client</module>\n        <module>brpc-server</module>\n        <module>rsocket-server</module>\n        <module>rsocket-client</module>\n    </modules>\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.0</version>\n                <configuration>\n                    <source>11</source>\n                    <target>11</target>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n</project>\n"
  },
  {
    "path": "rapidoid-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>rapidoid-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>rapidoid-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "rapidoid-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceJsonHttpClientImpl;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserService userService = new UserServiceJsonHttpClientImpl(CONCURRENCY);\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "rapidoid-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "rapidoid-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>rapidoid-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>rapidoid-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.rapidoid>5.5.5</version.rapidoid>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.rapidoid</groupId>\n\t\t\t<artifactId>rapidoid-web</artifactId>\n\t\t\t<version>${version.rapidoid}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "rapidoid-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.rapidoid.config.Conf;\nimport org.rapidoid.setup.App;\nimport org.rapidoid.setup.My;\nimport org.rapidoid.setup.On;\n\nimport benchmark.rpc.util.JsonUtils;\n\npublic class Server {\n\n\tpublic static final String host = \"benchmark-server\";\n\tpublic static final int port = 8080;\n\n\tpublic static void main(String[] args) {\n\n\t\tApp.bootstrap(args);\n\n\t\tMy.custom().objectMapper(JsonUtils.objectMapper);\n\n\t\tConf.HTTP.set(\"maxPipeline\", 256);\n\t\tConf.HTTP.set(\"timeout\", 0);\n\t\tConf.HTTP.sub(\"mandatoryHeaders\").set(\"connection\", false);\n\n\t\tOn.port(port);\n\t}\n\n}\n"
  },
  {
    "path": "rapidoid-server/src/main/java/benchmark/rpc/rapidoid/server/CreateUserController.java",
    "content": "package benchmark.rpc.rapidoid.server;\n\nimport org.rapidoid.annotation.Controller;\nimport org.rapidoid.annotation.GET;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@Controller\npublic class CreateUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GET(\"create-user\")\n\tpublic boolean createUser(User user) {\n\t\treturn userService.createUser(user);\n\t}\n}\n"
  },
  {
    "path": "rapidoid-server/src/main/java/benchmark/rpc/rapidoid/server/GetUserController.java",
    "content": "package benchmark.rpc.rapidoid.server;\n\nimport org.rapidoid.annotation.Controller;\nimport org.rapidoid.annotation.GET;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@Controller\npublic class GetUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GET(\"get-user\")\n\tpublic User getUser(int id) {\n\t\tUser user = userService.getUser(id);\n\t\treturn user;\n\t}\n}\n"
  },
  {
    "path": "rapidoid-server/src/main/java/benchmark/rpc/rapidoid/server/ListUserController.java",
    "content": "package benchmark.rpc.rapidoid.server;\n\nimport org.rapidoid.annotation.Controller;\nimport org.rapidoid.annotation.GET;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@Controller\npublic class ListUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GET(\"list-user\")\n\tpublic Page<User> getUser(int pageNo) {\n\t\tPage<User> userList = userService.listUser(pageNo);\n\t\treturn userList;\n\t}\n}\n"
  },
  {
    "path": "rapidoid-server/src/main/java/benchmark/rpc/rapidoid/server/UserExistController.java",
    "content": "package benchmark.rpc.rapidoid.server;\n\nimport org.rapidoid.annotation.Controller;\nimport org.rapidoid.annotation.GET;\n\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@Controller\npublic class UserExistController {\n\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GET(\"user-exist\")\n\tpublic boolean emailExist(String email) {\n\t\treturn userService.existUser(email);\n\t}\n}\n"
  },
  {
    "path": "rsocket-client/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <parent>\n        <artifactId>rpc-benchmark</artifactId>\n        <groupId>benchmark.rpc</groupId>\n        <version>round-5</version>\n    </parent>\n    <modelVersion>4.0.0</modelVersion>\n\n    <artifactId>rsocket-client</artifactId>\n\n    <name>rsocket-client</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <maven.compiler.source>11</maven.compiler.source>\n        <maven.compiler.target>11</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <version.benchmark-base>round-5</version.benchmark-base>\n        <version.rsocket-rpc-core>0.2.17</version.rsocket-rpc-core>\n        <version.rsocket-transport-netty>0.12.2-RC4</version.rsocket-transport-netty>\n        <version.grpc>1.18.0</version.grpc>\n        <version.protobuf>3.6.1</version.protobuf>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>benchmark.rpc</groupId>\n            <artifactId>benchmark-base</artifactId>\n            <version>${version.benchmark-base}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>io.rsocket</groupId>\n            <artifactId>rsocket-transport-netty</artifactId>\n            <version>${version.rsocket-transport-netty}</version>\n        </dependency>\n        <dependency>\n            <groupId>io.rsocket.rpc</groupId>\n            <artifactId>rsocket-rpc-core</artifactId>\n            <version>${version.rsocket-rpc-core}</version>\n            <exclusions>\n                <exclusion>\n                    <groupId>io.rsocket.rpc</groupId>\n                    <artifactId>rsocket-rpc-protobuf</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>com.google.protobuf</groupId>\n            <artifactId>protobuf-java</artifactId>\n            <version>${version.protobuf}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <version>4.11</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <extensions>\n            <extension>\n                <groupId>kr.motd.maven</groupId>\n                <artifactId>os-maven-plugin</artifactId>\n                <version>1.6.1</version>\n            </extension>\n        </extensions>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${project.build.directory}/generated-sources/protobuf/java</source>\n                                <source>${project.build.directory}/generated-sources/protobuf/rsocketRpc</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.xolstice.maven.plugins</groupId>\n                <artifactId>protobuf-maven-plugin</artifactId>\n                <version>0.6.1</version>\n                <configuration>\n                    <protocArtifact>com.google.protobuf:protoc:3.6.0:exe:${os.detected.classifier}</protocArtifact>\n                    <pluginId>rsocketRpc</pluginId>\n                    <pluginArtifact>\n                        io.rsocket.rpc:rsocket-rpc-protobuf:${version.rsocket-rpc-core}:exe:${os.detected.classifier}\n                    </pluginArtifact>\n                </configuration>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>compile</goal>\n                            <goal>compile-custom</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.0</version>\n                <configuration>\n\n                    <source>${maven.compiler.source}</source>\n                    <target>${maven.compiler.target}</target>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-resources-plugin</artifactId>\n                <version>3.1.0</version>\n                <configuration>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n\n            <plugin>\n                <artifactId>maven-assembly-plugin</artifactId>\n                <version>3.1.0</version>\n                <configuration>\n                    <descriptorRefs>\n                        <descriptorRef>jar-with-dependencies</descriptorRef>\n                    </descriptorRefs>\n                    <archive>\n                        <manifest>\n                            <mainClass>benchmark.rpc.Client</mainClass>\n                        </manifest>\n                    </archive>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>make-assembly</id> <!-- this is used for inheritance merges -->\n                        <phase>package</phase> <!-- bind to the packaging phase -->\n                        <goals>\n                            <goal>single</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n        <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n            </resource>\n            <resource>\n                <directory>src/main/proto</directory>\n            </resource>\n        </resources>\n    </build>\n</project>\n"
  },
  {
    "path": "rsocket-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.rsocket.UserServiceRsocketClientImpl;\nimport benchmark.service.UserService;\nimport org.openjdk.jmh.annotations.*;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient{\n\n    public static final int CONCURRENCY = 32;\n\n    UserServiceRsocketClientImpl userService = new UserServiceRsocketClientImpl();\n\n    @Override\n    protected UserService getUserService() {\n        return userService;\n    }\n\n    @TearDown\n    public void close() throws IOException {\n        userService.close();\n    }\n\n    @Benchmark\n    @BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public boolean existUser() throws Exception {\n        return super.existUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public boolean createUser() throws Exception {\n        return super.createUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public User getUser() throws Exception {\n        return super.getUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public Page<User> listUser() throws Exception {\n        return super.listUser();\n    }\n\n    public static void main(String[] args) throws Exception {\n        Client client = new Client();\n\n        for (int i = 0; i < 60; i++) {\n            try {\n                System.out.println(client.getUser());\n                break;\n            } catch (Exception e) {\n                Thread.sleep(1000);\n            }\n        }\n\n        client.close();\n\n        Options opt = new OptionsBuilder()//\n                .include(Client.class.getSimpleName())//\n                .warmupIterations(3)//\n                .warmupTime(TimeValue.seconds(10))//\n                .measurementIterations(3)//\n                .measurementTime(TimeValue.seconds(10))//\n                .threads(CONCURRENCY)//\n                .forks(1)//\n                .build();\n\n        new Runner(opt).run();\n    }\n}\n"
  },
  {
    "path": "rsocket-client/src/main/java/benchmark/rpc/rsocket/UserServiceRsocketClientImpl.java",
    "content": "package benchmark.rpc.rsocket;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.grpc.UserServiceClient;\nimport benchmark.rpc.grpc.UserServiceOuterClass;\nimport benchmark.service.UserService;\nimport io.rsocket.RSocket;\nimport io.rsocket.RSocketFactory;\nimport io.rsocket.transport.netty.client.TcpClientTransport;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.ZoneOffset;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\npublic class UserServiceRsocketClientImpl implements UserService, Closeable {\n\n    RSocket rSocket;\n    UserServiceClient userServiceClient;\n\n    public UserServiceRsocketClientImpl() {\n        this.rSocket =\n                RSocketFactory.connect().transport(TcpClientTransport.create(8080)).start().block();\n        this.userServiceClient = new UserServiceClient(rSocket);\n    }\n\n    @Override\n    public boolean existUser(String email) {\n        UserServiceOuterClass.UserExistRequest request = UserServiceOuterClass.UserExistRequest.newBuilder()\n                .setEmail(email)\n                .build();\n        return userServiceClient.userExist(request).block().getExist();\n    }\n\n    @Override\n    public boolean createUser(User user) {\n        UserServiceOuterClass.User param = UserServiceOuterClass.User.newBuilder()\n                .setId(user.getId())//\n                .setName(user.getName())//\n                .setSex(user.getSex())//\n                .setBirthday((int) (user.getBirthday().toEpochDay()))//\n                .setEmail(user.getEmail())//\n                .setMobile(user.getMobile())//\n                .setAddress(user.getAddress())//\n                .setIcon(user.getIcon())//\n                .addAllPermissions(user.getPermissions())//\n                .setStatus(user.getStatus())//\n                .setCreateTime(user.getCreateTime().toEpochSecond(ZoneOffset.UTC))//\n                .setUpdateTime(user.getUpdateTime().toEpochSecond(ZoneOffset.UTC))//\n                .build();\n        return userServiceClient.createUser(param).block().getSuccess();\n    }\n\n    @Override\n    public User getUser(long id) {\n        UserServiceOuterClass.GetUserRequest request = UserServiceOuterClass.GetUserRequest.newBuilder()\n                .setId(id)\n                .build();\n        return userServiceClient.getUser(request).map(response -> {\n\n            return from(response);\n        }).block();\n    }\n\n    private User from(UserServiceOuterClass.User response){\n        User user = new User();\n        user.setId(response.getId());\n        user.setName(response.getName());\n        user.setSex(response.getSex());\n        user.setBirthday(LocalDate.ofEpochDay(response.getBirthday()));\n        user.setEmail(response.getEmail());\n        user.setMobile(response.getMobile());\n        user.setAddress(response.getAddress());\n        user.setIcon(response.getIcon());\n        user.setPermissions(response.getPermissionsList());\n        user.setStatus(response.getStatus());\n        user.setCreateTime(LocalDateTime.ofEpochSecond(response.getCreateTime(), 0, ZoneOffset.UTC));\n        user.setUpdateTime(LocalDateTime.ofEpochSecond(response.getUpdateTime(), 0, ZoneOffset.UTC));\n        return user;\n    }\n\n    @Override\n    public Page<User> listUser(int pageNo) {\n        UserServiceOuterClass.ListUserRequest request = UserServiceOuterClass.ListUserRequest.newBuilder()\n                .setPageNo(pageNo)\n                .build();\n        Page<User> page = new Page<>();\n\n        UserServiceOuterClass.UserPage userPage = userServiceClient.listUser(request).block();\n        page.setPageNo(userPage.getPageNo());\n        page.setTotal(userPage.getTotal());\n\n        List<User> userList = userPage.getResultList()\n                .stream()\n                .map(response -> from(response))\n                .collect(Collectors.toList());\n\n        page.setResult(userList);\n\n        return page;\n    }\n\n    @Override\n    public void close() throws IOException {\n\n    }\n}\n"
  },
  {
    "path": "rsocket-client/src/main/proto/UserService.proto",
    "content": "syntax = \"proto3\";\npackage grpc;\n\nimport public \"google/protobuf/timestamp.proto\"; \n\noption java_package = \"benchmark.rpc.grpc\";\n\nservice UserService {\n  rpc userExist (UserExistRequest) returns (UserExistResponse) {}\n  \n  rpc createUser (User) returns (CreateUserResponse) {}\n  \n  rpc getUser (GetUserRequest) returns (User) {}\n  \n  rpc listUser (ListUserRequest) returns (UserPage) {}\n}\n\nmessage UserExistRequest {\n  string email = 1;\n}\n\nmessage UserExistResponse {\n  bool exist = 1;\n}\n\nmessage GetUserRequest {\n  int64 id = 1;\n}\n\nmessage User {\n\tint64 id = 1;\n\tstring name = 2;\n\tint32 sex = 3;\n\tint32 birthday = 4;\n\tstring email = 5;\n\tstring mobile = 6;\n\tstring address = 7;\n\tstring icon = 8;\n\trepeated int32 permissions = 9;\n\tint32 status = 10;\n\tint64 createTime = 11;\n\tint64 updateTime = 12;\n}\n\nmessage CreateUserResponse {\n  bool success = 1;\n}\n\nmessage ListUserRequest {\n  int32 pageNo = 1;\n}\n\nmessage UserPage {\n  \tint32 pageNo = 1;\n\tint32 total = 2;\n\trepeated User result = 3;\n}"
  },
  {
    "path": "rsocket-server/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>benchmark.rpc</groupId>\n    <artifactId>rsocket-server</artifactId>\n    <version>round-5</version>\n    <packaging>jar</packaging>\n\n    <name>rsocket-server</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <maven.compiler.source>11</maven.compiler.source>\n        <maven.compiler.target>11</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <version.benchmark-base>round-5</version.benchmark-base>\n        <version.rsocket-rpc-core>0.2.17</version.rsocket-rpc-core>\n        <version.rsocket-transport-netty>0.12.2-RC4</version.rsocket-transport-netty>\n        <version.grpc>1.18.0</version.grpc>\n        <version.protobuf>3.6.1</version.protobuf>\n<!--        <version.log4j2>2.9.1</version.log4j2>-->\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>benchmark.rpc</groupId>\n            <artifactId>benchmark-base</artifactId>\n            <version>${version.benchmark-base}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>io.rsocket</groupId>\n            <artifactId>rsocket-transport-netty</artifactId>\n            <version>${version.rsocket-transport-netty}</version>\n        </dependency>\n        <dependency>\n            <groupId>io.rsocket.rpc</groupId>\n            <artifactId>rsocket-rpc-core</artifactId>\n            <version>${version.rsocket-rpc-core}</version>\n            <exclusions>\n                <exclusion>\n                    <groupId>io.rsocket.rpc</groupId>\n                    <artifactId>rsocket-rpc-protobuf</artifactId>\n                </exclusion>\n            </exclusions>\n        </dependency>\n\n        <dependency>\n            <groupId>com.google.protobuf</groupId>\n            <artifactId>protobuf-java</artifactId>\n            <version>${version.protobuf}</version>\n        </dependency>\n\n<!--        <dependency>-->\n<!--            <groupId>org.apache.logging.log4j</groupId>-->\n<!--            <artifactId>log4j-api</artifactId>-->\n<!--            <version>${version.log4j2}</version>-->\n<!--        </dependency>-->\n<!--        <dependency>-->\n<!--            <groupId>org.apache.logging.log4j</groupId>-->\n<!--            <artifactId>log4j-core</artifactId>-->\n<!--            <version>${version.log4j2}</version>-->\n<!--        </dependency>-->\n<!--        <dependency>-->\n<!--            <groupId>org.apache.logging.log4j</groupId>-->\n<!--            <artifactId>log4j-slf4j-impl</artifactId>-->\n<!--            <version>${version.log4j2}</version>-->\n<!--        </dependency>-->\n\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <version>4.11</version>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <extensions>\n            <extension>\n                <groupId>kr.motd.maven</groupId>\n                <artifactId>os-maven-plugin</artifactId>\n                <version>1.6.1</version>\n            </extension>\n        </extensions>\n        <plugins>\n            <plugin>\n                <groupId>org.codehaus.mojo</groupId>\n                <artifactId>build-helper-maven-plugin</artifactId>\n                <executions>\n                    <execution>\n                        <phase>generate-sources</phase>\n                        <goals>\n                            <goal>add-source</goal>\n                        </goals>\n                        <configuration>\n                            <sources>\n                                <source>${project.build.directory}/generated-sources/protobuf/java</source>\n                                <source>${project.build.directory}/generated-sources/protobuf/rsocketRpc</source>\n                            </sources>\n                        </configuration>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.xolstice.maven.plugins</groupId>\n                <artifactId>protobuf-maven-plugin</artifactId>\n                <version>0.6.1</version>\n                <configuration>\n                    <protocArtifact>com.google.protobuf:protoc:3.6.0:exe:${os.detected.classifier}</protocArtifact>\n                    <pluginId>rsocketRpc</pluginId>\n                    <pluginArtifact>\n                        io.rsocket.rpc:rsocket-rpc-protobuf:${version.rsocket-rpc-core}:exe:${os.detected.classifier}\n                    </pluginArtifact>\n                </configuration>\n                <executions>\n                    <execution>\n                        <goals>\n                            <goal>compile</goal>\n                            <goal>compile-custom</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.0</version>\n                <configuration>\n\n                    <source>${maven.compiler.source}</source>\n                    <target>${maven.compiler.target}</target>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-resources-plugin</artifactId>\n                <version>3.1.0</version>\n                <configuration>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n\n            <plugin>\n                <artifactId>maven-assembly-plugin</artifactId>\n                <version>3.1.0</version>\n                <configuration>\n                    <descriptorRefs>\n                        <descriptorRef>jar-with-dependencies</descriptorRef>\n                    </descriptorRefs>\n                    <archive>\n                        <manifest>\n                            <mainClass>benchmark.rpc.Server</mainClass>\n                        </manifest>\n                    </archive>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>make-assembly</id> <!-- this is used for inheritance merges -->\n                        <phase>package</phase> <!-- bind to the packaging phase -->\n                        <goals>\n                            <goal>single</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n        <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n            </resource>\n            <resource>\n                <directory>src/main/proto</directory>\n            </resource>\n        </resources>\n    </build>\n\n</project>\n"
  },
  {
    "path": "rsocket-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.rpc.grpc.UserServiceServer;\nimport benchmark.rpc.rsocket.server.UserServiceRsocketServerImpl;\nimport io.rsocket.RSocketFactory;\nimport io.rsocket.rpc.rsocket.RequestHandlingRSocket;\nimport io.rsocket.transport.netty.server.CloseableChannel;\nimport io.rsocket.transport.netty.server.TcpServerTransport;\nimport reactor.core.publisher.Mono;\n\nimport java.util.Optional;\n\npublic class Server {\n\n    public static void main(String[] args){\n        UserServiceServer userServiceServer = new UserServiceServer(new UserServiceRsocketServerImpl(), Optional.empty(), Optional.empty());\n        CloseableChannel closeableChannel =\n                RSocketFactory.receive()\n                        .acceptor(\n                                (setup, sendingSocket) -> Mono.just(new RequestHandlingRSocket(userServiceServer)))\n                        .transport(TcpServerTransport.create(8080))\n                        .start()\n                        .block();\n\n        // Block so we don't exit\n        closeableChannel.onClose().block();\n    }\n}\n"
  },
  {
    "path": "rsocket-server/src/main/java/benchmark/rpc/rsocket/server/UserServiceRsocketServerImpl.java",
    "content": "package benchmark.rpc.rsocket.server;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.grpc.UserService;\nimport benchmark.rpc.grpc.UserServiceOuterClass;\nimport benchmark.service.UserServiceServerImpl;\nimport io.netty.buffer.ByteBuf;\nimport reactor.core.publisher.Mono;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.ZoneOffset;\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class UserServiceRsocketServerImpl implements UserService {\n\n    private final benchmark.service.UserService userService = new UserServiceServerImpl();\n\n    @Override\n    public Mono<UserServiceOuterClass.UserExistResponse> userExist(UserServiceOuterClass.UserExistRequest message, ByteBuf metadata) {\n        String email = message.getEmail();\n        boolean isExist = userService.existUser(email);\n        return Mono.just(UserServiceOuterClass.UserExistResponse.newBuilder().setExist(isExist).build());\n    }\n\n    @Override\n    public Mono<UserServiceOuterClass.CreateUserResponse> createUser(UserServiceOuterClass.User message, ByteBuf metadata) {\n        benchmark.bean.User user = new benchmark.bean.User();\n\n        user.setId(message.getId());\n        user.setName(message.getName());\n        user.setSex(message.getSex());\n        user.setBirthday(LocalDate.ofEpochDay(message.getBirthday()));\n        user.setEmail(message.getEmail());\n        user.setMobile(message.getMobile());\n        user.setAddress(message.getAddress());\n        user.setIcon(message.getIcon());\n        user.setPermissions(message.getPermissionsList());\n        user.setStatus(message.getStatus());\n        user.setCreateTime(LocalDateTime.ofEpochSecond(message.getCreateTime(), 0, ZoneOffset.UTC));\n        user.setUpdateTime(LocalDateTime.ofEpochSecond(message.getUpdateTime(), 0, ZoneOffset.UTC));\n\n        boolean success = userService.createUser(user);\n\n        UserServiceOuterClass.CreateUserResponse reply = UserServiceOuterClass.CreateUserResponse.newBuilder().setSuccess(success).build();\n        return Mono.just(reply);\n    }\n\n    @Override\n    public Mono<UserServiceOuterClass.User> getUser(UserServiceOuterClass.GetUserRequest message, ByteBuf metadata) {\n        long id = message.getId();\n        benchmark.bean.User user = userService.getUser(id);\n\n        UserServiceOuterClass.User reply = UserServiceOuterClass.User.newBuilder()//\n                .setId(user.getId())//\n                .setName(user.getName())//\n                .setSex(user.getSex())//\n                .setBirthday((int) (user.getBirthday().toEpochDay()))//\n                .setEmail(user.getEmail())//\n                .setMobile(user.getMobile())//\n                .setAddress(user.getAddress())//\n                .setIcon(user.getIcon())//\n                .addAllPermissions(user.getPermissions())//\n                .setStatus(user.getStatus())//\n                .setCreateTime(user.getCreateTime().toEpochSecond(ZoneOffset.UTC))//\n                .setUpdateTime(user.getUpdateTime().toEpochSecond(ZoneOffset.UTC))//\n                .build();\n        return Mono.just(reply);\n    }\n\n    @Override\n    public Mono<UserServiceOuterClass.UserPage> listUser(UserServiceOuterClass.ListUserRequest message, ByteBuf metadata) {\n        int pageNo = message.getPageNo();\n\n        Page<User> page = userService.listUser(pageNo);\n\n        List<UserServiceOuterClass.User> userList = new ArrayList<>(page.getResult().size());\n\n        for (benchmark.bean.User user : page.getResult()) {\n            UserServiceOuterClass.User u = UserServiceOuterClass.User.newBuilder()//\n                    .setId(user.getId())//\n                    .setName(user.getName())//\n                    .setSex(user.getSex())//\n                    .setBirthday((int) (user.getBirthday().toEpochDay()))//\n                    .setEmail(user.getEmail())//\n                    .setMobile(user.getMobile())//\n                    .setAddress(user.getAddress())//\n                    .setIcon(user.getIcon())//\n                    .addAllPermissions(user.getPermissions())//\n                    .setStatus(user.getStatus())//\n                    .setCreateTime(user.getCreateTime().toEpochSecond(ZoneOffset.UTC))//\n                    .setUpdateTime(user.getUpdateTime().toEpochSecond(ZoneOffset.UTC))//\n                    .build();\n\n            userList.add(u);\n        }\n\n        UserServiceOuterClass.UserPage reply = UserServiceOuterClass.UserPage.newBuilder()//\n                .setPageNo(page.getPageNo())//\n                .setTotal(page.getTotal())//\n                .addAllResult(userList)//\n                .build();\n        return Mono.just(reply);\n    }\n}\n"
  },
  {
    "path": "rsocket-server/src/main/proto/UserService.proto",
    "content": "syntax = \"proto3\";\npackage grpc;\n\nimport public \"google/protobuf/timestamp.proto\"; \n\noption java_package = \"benchmark.rpc.grpc\";\n\nservice UserService {\n  rpc userExist (UserExistRequest) returns (UserExistResponse) {}\n  \n  rpc createUser (User) returns (CreateUserResponse) {}\n  \n  rpc getUser (GetUserRequest) returns (User) {}\n  \n  rpc listUser (ListUserRequest) returns (UserPage) {}\n}\n\nmessage UserExistRequest {\n  string email = 1;\n}\n\nmessage UserExistResponse {\n  bool exist = 1;\n}\n\nmessage GetUserRequest {\n  int64 id = 1;\n}\n\nmessage User {\n\tint64 id = 1;\n\tstring name = 2;\n\tint32 sex = 3;\n\tint32 birthday = 4;\n\tstring email = 5;\n\tstring mobile = 6;\n\tstring address = 7;\n\tstring icon = 8;\n\trepeated int32 permissions = 9;\n\tint32 status = 10;\n\tint64 createTime = 11;\n\tint64 updateTime = 12;\n}\n\nmessage CreateUserResponse {\n  bool success = 1;\n}\n\nmessage ListUserRequest {\n  int32 pageNo = 1;\n}\n\nmessage UserPage {\n  \tint32 pageNo = 1;\n\tint32 total = 2;\n\trepeated User result = 3;\n}"
  },
  {
    "path": "servicecomb-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>servicecomb-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>servicecomb-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<servicecomb.version>1.1.0</servicecomb.version>\n\t\t<version.commons-lang3>3.8.1</version.commons-lang3>\n\t\t<version.slf4j>1.7.25</version.slf4j>\n\t\t<version.jaxws-api>2.3.1</version.jaxws-api>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>ch.qos.logback</groupId>\n\t\t\t\t\t<artifactId>logback-classic</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.servicecomb</groupId>\n\t\t\t<artifactId>provider-pojo</artifactId>\n\t\t\t<version>${servicecomb.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.servicecomb</groupId>\n\t\t\t<artifactId>transport-highway</artifactId>\n\t\t\t<version>${servicecomb.version}</version>\n\t\t</dependency>\n\t\t<!-- Upgrade the commons-lang3 version to support JDK9 and JDK10 -->\n\t\t<dependency>\n\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t<artifactId>commons-lang3</artifactId>\n\t\t\t<version>${version.commons-lang3}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${version.slf4j}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>javax.xml.ws</groupId>\n\t\t\t<artifactId>jaxws-api</artifactId>\n\t\t\t<version>${version.jaxws-api}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>repackage</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "servicecomb-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.apache.servicecomb.foundation.common.utils.BeanUtils;\nimport org.apache.servicecomb.foundation.common.utils.Log4jUtils;\nimport org.apache.servicecomb.provider.pojo.RpcReference;\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\nimport org.springframework.stereotype.Component;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport io.netty.util.concurrent.GlobalEventExecutor;\n\n@State(Scope.Benchmark)\n@Component\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\t@RpcReference(microserviceName = \"benchmark\", schemaId = \"benchmark\")\n\tprivate static UserService userService;\n\n\tstatic {\n\t\tObject exec = GlobalEventExecutor.INSTANCE;\n\t\tSystem.out.println(exec);\n\n\t\ttry {\n\t\t\tLog4jUtils.init();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\tBeanUtils.init();\n\t}\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tClient client = new Client();\n\n\t\tfor (int i = 0; i < 60; i++) {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(client.existUser());\n\t\t\t\tSystem.out.println(client.createUser());\n\t\t\t\tSystem.out.println(client.getUser());\n\t\t\t\tSystem.out.println(client.listUser());\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\tThread.sleep(1000);\n\t\t\t}\n\t\t}\n\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(0)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\n\t\tSystem.exit(1);\n\t}\n\n}\n"
  },
  {
    "path": "servicecomb-client/src/main/resources/META-INF/spring/benchmark.consumer.bean.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Licensed to the Apache Software Foundation (ASF) under one or more\n  ~ contributor license agreements.  See the NOTICE file distributed with\n  ~ this work for additional information regarding copyright ownership.\n  ~ The ASF licenses this file to You under the Apache License, Version 2.0\n  ~ (the \"License\"); you may not use this file except in compliance with\n  ~ the License.  You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:context=\"http://www.springframework.org/schema/context\"\n  xsi:schemaLocation=\"\n\t\thttp://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd\n\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd\">\n\n  <context:component-scan base-package=\"benchmark\"/>\n</beans>\n"
  },
  {
    "path": "servicecomb-client/src/main/resources/config/log4j.demo.properties",
    "content": "#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the NOTICE file distributed with\n# this work for additional information regarding copyright ownership.\n# The ASF licenses this file to You under the Apache License, Version 2.0\n# (the \"License\"); you may not use this file except in compliance with\n# the License.  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\npaas.logs.dir=target/logs/\npaas.logs.file=benchmark.log\n\nlog4j.rootLogger=WARN,paas,stdout\n"
  },
  {
    "path": "servicecomb-client/src/main/resources/log4j.properties",
    "content": "#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the NOTICE file distributed with\n# this work for additional information regarding copyright ownership.\n# The ASF licenses this file to You under the Apache License, Version 2.0\n# (the \"License\"); you may not use this file except in compliance with\n# the License.  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\npaas.logs.dir=target/logs/\npaas.logs.file=benchmark.log\n\nlog4j.rootLogger=WARN,paas,stdout\n"
  },
  {
    "path": "servicecomb-client/src/main/resources/microservice.yaml",
    "content": "﻿## ---------------------------------------------------------------------------\n## Licensed to the Apache Software Foundation (ASF) under one or more\n## contributor license agreements.  See the NOTICE file distributed with\n## this work for additional information regarding copyright ownership.\n## The ASF licenses this file to You under the Apache License, Version 2.0\n## (the \"License\"); you may not use this file except in compliance with\n## the License.  You may obtain a copy of the License at\n##\n##      http://www.apache.org/licenses/LICENSE-2.0\n##\n## Unless required by applicable law or agreed to in writing, software\n## distributed under the License is distributed on an \"AS IS\" BASIS,\n## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n## See the License for the specific language governing permissions and\n## limitations under the License.\n## ---------------------------------------------------------------------------\n\nAPPLICATION_ID: rpc-benchmark\nservice_description:\n  name: benchmarkClient\n  version: 0.0.1\nservicecomb:\n  service:\n    registry:\n      address: http://benchmark-server:30100\n  highway:\n    client:\n      thread-count: 2\n  isolation:\n    Consumer:\n      enabled: false\n  references:\n    benchmark:\n      version-rule: 0.0.1\n"
  },
  {
    "path": "servicecomb-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>servicecomb-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>servicecomb-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<servicecomb.version>1.1.0</servicecomb.version>\n\t\t<version.commons-lang3>3.8.1</version.commons-lang3>\n\t\t<version.slf4j>1.7.25</version.slf4j>\n\t\t<version.jaxws-api>2.3.1</version.jaxws-api>\n\t</properties>\n\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>ch.qos.logback</groupId>\n\t\t\t\t\t<artifactId>logback-classic</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.servicecomb</groupId>\n\t\t\t<artifactId>provider-pojo</artifactId>\n\t\t\t<version>${servicecomb.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.servicecomb</groupId>\n\t\t\t<artifactId>transport-highway</artifactId>\n\t\t\t<version>${servicecomb.version}</version>\n\t\t</dependency>\n\t\t<!-- Upgrade the commons-lang3 version to support JDK9 and JDK10 -->\n\t\t<dependency>\n\t\t\t<groupId>org.apache.commons</groupId>\n\t\t\t<artifactId>commons-lang3</artifactId>\n\t\t\t<version>${version.commons-lang3}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${version.slf4j}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>javax.xml.ws</groupId>\n\t\t\t<artifactId>jaxws-api</artifactId>\n\t\t\t<version>${version.jaxws-api}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>repackage</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "servicecomb-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.apache.servicecomb.foundation.common.utils.BeanUtils;\nimport org.apache.servicecomb.foundation.common.utils.Log4jUtils;\n\nimport io.netty.util.concurrent.GlobalEventExecutor;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tObject exec = GlobalEventExecutor.INSTANCE;\n\t\tSystem.out.println(exec);\n\n\t\tLog4jUtils.init();\n\t\tBeanUtils.init();\n\t}\n\n}\n"
  },
  {
    "path": "servicecomb-server/src/main/java/benchmark/service/ServiceCombUserServiceServerImpl.java",
    "content": "package benchmark.service;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport org.apache.servicecomb.provider.pojo.RpcSchema;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\n\n@RpcSchema(schemaId = \"benchmark\")\npublic class ServiceCombUserServiceServerImpl implements UserService {\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\tif (email == null || email.isEmpty()) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (email.charAt(email.length() - 1) < '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic User getUser(long id) {\n\t\tUser user = new User();\n\n\t\tuser.setId(id);\n\t\tuser.setName(new String(\"Doug Lea\"));\n\t\tuser.setSex(1);\n\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\tuser.setEmail(new String(\"dong.lea@gmail.com\"));\n\t\tuser.setMobile(new String(\"18612345678\"));\n\t\tuser.setAddress(new String(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\"));\n\t\tuser.setIcon(new String(\"https://www.baidu.com/img/bd_logo1.png\"));\n\t\tuser.setStatus(1);\n\t\tuser.setCreateTime(LocalDateTime.now());\n\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\tList<Integer> permissions = new ArrayList<Integer>(\n\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\n\t\tuser.setPermissions(permissions);\n\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic Page<User> listUser(int pageNo) {\n\t\tList<User> userList = new ArrayList<>(15);\n\n\t\tfor (int i = 0; i < 15; i++) {\n\t\t\tUser user = new User();\n\n\t\t\tuser.setId(i);\n\t\t\tuser.setName(\"Doug Lea\" + i);\n\t\t\tuser.setSex(1);\n\t\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\t\tuser.setEmail(\"dong.lea@gmail.com\" + i);\n\t\t\tuser.setMobile(\"18612345678\" + i);\n\t\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\" + i);\n\t\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\" + i);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setCreateTime(LocalDateTime.now());\n\t\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\t\tList<Integer> permissions = new ArrayList<Integer>(\n\t\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\t\tuser.setPermissions(permissions);\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tPage<User> page = new Page<>();\n\t\tpage.setPageNo(pageNo);\n\t\tpage.setTotal(1000);\n\t\tpage.setResult(userList);\n\n\t\treturn page;\n\t}\n\n\t@Override\n\tpublic boolean createUser(User user) {\n\t\tif (user == null) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "servicecomb-server/src/main/resources/META-INF/spring/benchmark.provider.bean.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Licensed to the Apache Software Foundation (ASF) under one or more\n  ~ contributor license agreements.  See the NOTICE file distributed with\n  ~ this work for additional information regarding copyright ownership.\n  ~ The ASF licenses this file to You under the Apache License, Version 2.0\n  ~ (the \"License\"); you may not use this file except in compliance with\n  ~ the License.  You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:context=\"http://www.springframework.org/schema/context\"\n  xsi:schemaLocation=\"\n\t\thttp://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd\n\t\thttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd\">\n\n  <context:component-scan base-package=\"benchmark\"/>\n</beans>\n"
  },
  {
    "path": "servicecomb-server/src/main/resources/config/log4j.demo.properties",
    "content": "#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the NOTICE file distributed with\n# this work for additional information regarding copyright ownership.\n# The ASF licenses this file to You under the Apache License, Version 2.0\n# (the \"License\"); you may not use this file except in compliance with\n# the License.  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\npaas.logs.dir=target/logs/\npaas.logs.file=benchmark.log\n\nlog4j.rootLogger=WARN,paas,stdout\n"
  },
  {
    "path": "servicecomb-server/src/main/resources/log4j.properties",
    "content": "#\n# Licensed to the Apache Software Foundation (ASF) under one or more\n# contributor license agreements.  See the NOTICE file distributed with\n# this work for additional information regarding copyright ownership.\n# The ASF licenses this file to You under the Apache License, Version 2.0\n# (the \"License\"); you may not use this file except in compliance with\n# the License.  You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\npaas.logs.dir=target/logs/\npaas.logs.file=benchmark.log\n\nlog4j.rootLogger=WARN,paas,stdout\n"
  },
  {
    "path": "servicecomb-server/src/main/resources/microservice.yaml",
    "content": "## ---------------------------------------------------------------------------\n## Licensed to the Apache Software Foundation (ASF) under one or more\n## contributor license agreements.  See the NOTICE file distributed with\n## this work for additional information regarding copyright ownership.\n## The ASF licenses this file to You under the Apache License, Version 2.0\n## (the \"License\"); you may not use this file except in compliance with\n## the License.  You may obtain a copy of the License at\n##\n##      http://www.apache.org/licenses/LICENSE-2.0\n##\n## Unless required by applicable law or agreed to in writing, software\n## distributed under the License is distributed on an \"AS IS\" BASIS,\n## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n## See the License for the specific language governing permissions and\n## limitations under the License.\n## ---------------------------------------------------------------------------\n\nAPPLICATION_ID: rpc-benchmark\nservice_description:\n  name: benchmark\n  version: 0.0.1\nservicecomb:\n  service:\n    registry:\n      address: http://benchmark-server:30100\n  highway:\n    address: benchmark-server:8080\n    server:\n      thread-count: 2\n"
  },
  {
    "path": "sofa-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>benchmark.rpc</groupId>\n    <artifactId>sofa-client</artifactId>\n    <version>round-5</version>\n    <packaging>jar</packaging>\n\n    <name>sofa-client</name>\n    <url>http://maven.apache.org</url>\n\n    <properties>\n        <maven.compiler.source>11</maven.compiler.source>\n        <maven.compiler.target>11</maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <version.benchmark-base>round-5</version.benchmark-base>\n        <version.sofa>5.5.0</version.sofa>\n    </properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>benchmark.rpc</groupId>\n            <artifactId>benchmark-base</artifactId>\n            <version>${version.benchmark-base}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>com.alipay.sofa</groupId>\n            <artifactId>sofa-rpc-all</artifactId>\n            <version>${version.sofa}</version>\n        </dependency>\n\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <version>4.12</version>\n            <scope>test</scope>\n        </dependency>\n\n    </dependencies>\n\n\n    <build>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-compiler-plugin</artifactId>\n                <version>3.8.0</version>\n                <configuration>\n                    <defaultLibBundleDir>lib</defaultLibBundleDir>\n                    <source>${maven.compiler.source}</source>\n                    <target>${maven.compiler.target}</target>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n            <plugin>\n                <groupId>org.apache.maven.plugins</groupId>\n                <artifactId>maven-resources-plugin</artifactId>\n                <version>3.1.0</version>\n                <configuration>\n                    <encoding>UTF-8</encoding>\n                </configuration>\n            </plugin>\n\n            <plugin>\n                <artifactId>maven-assembly-plugin</artifactId>\n                <version>3.1.0</version>\n                <configuration>\n                    <descriptorRefs>\n                        <descriptorRef>jar-with-dependencies</descriptorRef>\n                    </descriptorRefs>\n                    <archive>\n                        <manifest>\n                            <mainClass>benchmark.rpc.Client</mainClass>\n                        </manifest>\n                    </archive>\n                </configuration>\n                <executions>\n                    <execution>\n                        <id>make-assembly</id> <!-- this is used for inheritance merges -->\n                        <phase>package</phase> <!-- bind to the packaging phase -->\n                        <goals>\n                            <goal>single</goal>\n                        </goals>\n                    </execution>\n                </executions>\n            </plugin>\n        </plugins>\n        <resources>\n            <resource>\n                <directory>src/main/resources</directory>\n            </resource>\n        </resources>\n    </build>\n</project>\n"
  },
  {
    "path": "sofa-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport com.alipay.sofa.rpc.config.ConsumerConfig;\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n    public static final int CONCURRENCY = 32;\n\n    private final UserService userService;\n\n    public Client() {\n        ConsumerConfig<UserService> consumerConfig = new ConsumerConfig<UserService>()\n                .setInterfaceId(UserService.class.getName())\n                .setProtocol(\"bolt\") // 指定协议\n                .setDirectUrl(\"bolt://benchmark-server:12200\");\n        userService = consumerConfig.refer();\n    }\n\n    @Override\n    protected UserService getUserService() {\n        return userService;\n    }\n\n    @TearDown\n    public void close() throws IOException {\n\n    }\n\n    @Benchmark\n    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public boolean existUser() throws Exception {\n        return super.existUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public boolean createUser() throws Exception {\n        return super.createUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public User getUser() throws Exception {\n        return super.getUser();\n    }\n\n    @Benchmark\n    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})\n    @OutputTimeUnit(TimeUnit.MILLISECONDS)\n    @Override\n    public Page<User> listUser() throws Exception {\n        return super.listUser();\n    }\n\n    public static void main(String[] args) throws Exception {\n        Options opt = new OptionsBuilder()//\n                .include(Client.class.getSimpleName())//\n                .warmupIterations(3)//\n                .warmupTime(TimeValue.seconds(10))//\n                .measurementIterations(3)//\n                .measurementTime(TimeValue.seconds(10))//\n                .threads(CONCURRENCY)//\n                .forks(1)//\n                .build();\n\n        new Runner(opt).run();\n    }\n\n}\n"
  },
  {
    "path": "sofa-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "sofa-server/.gitignore",
    "content": "/bin/\n"
  },
  {
    "path": "sofa-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>sofa-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>sofa-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.sofa>5.5.0</version.sofa>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>com.alipay.sofa</groupId>\n\t\t\t<artifactId>sofa-rpc-all</artifactId>\n\t\t\t<version>${version.sofa}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "sofa-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport com.alipay.sofa.rpc.config.ProviderConfig;\nimport com.alipay.sofa.rpc.config.ServerConfig;\n\npublic class Server {\n\n    public static void main(String[] args) {\n        ServerConfig serverConfig = new ServerConfig()\n                .setProtocol(\"bolt\")\n                .setPort(12200)\n                .setDaemon(false);\n\n        ProviderConfig<UserService> providerConfig = new ProviderConfig<UserService>()\n                .setInterfaceId(UserService.class.getName())\n                .setRef(new UserServiceServerImpl())\n                .setServer(serverConfig);\n\n        providerConfig.export();\n    }\n\n}\n"
  },
  {
    "path": "sofa-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "springboot-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>springboot-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>springboot-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "springboot-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceJsonHttpClientImpl;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserService userService = new UserServiceJsonHttpClientImpl(CONCURRENCY);\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException, InterruptedException {\n\t\tClient client = new Client();\n\n\t\tfor (int i = 0; i < 60; i++) {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(client.getUser());\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\tThread.sleep(1000);\n\t\t\t}\n\t\t}\n\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "springboot-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "springboot-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>springboot-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>springboot-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.spring-boot>2.1.2.RELEASE</version.spring-boot>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t\t<version>${version.spring-boot}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>repackage</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "springboot-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication(scanBasePackages = { \"benchmark.rpc.springboot\" })\npublic class Server {\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Server.class, args);\n\t}\n}\n"
  },
  {
    "path": "springboot-server/src/main/java/benchmark/rpc/springboot/server/CreateUserController.java",
    "content": "package benchmark.rpc.springboot.server;\n\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@RestController\npublic class CreateUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@PostMapping(\"create-user\")\n\tpublic boolean createUser(User user) {\n\t\treturn userService.createUser(user);\n\t}\n}\n"
  },
  {
    "path": "springboot-server/src/main/java/benchmark/rpc/springboot/server/GetUserController.java",
    "content": "package benchmark.rpc.springboot.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@RestController\npublic class GetUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"get-user\")\n\tpublic User getUser(int id) {\n\t\tUser user = userService.getUser(id);\n\t\treturn user;\n\t}\n}\n"
  },
  {
    "path": "springboot-server/src/main/java/benchmark/rpc/springboot/server/ListUserController.java",
    "content": "package benchmark.rpc.springboot.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@RestController\npublic class ListUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"list-user\")\n\tpublic Page<User> getUser(int pageNo) {\n\t\tPage<User> userList = userService.listUser(pageNo);\n\t\treturn userList;\n\t}\n}\n"
  },
  {
    "path": "springboot-server/src/main/java/benchmark/rpc/springboot/server/UserExistController.java",
    "content": "package benchmark.rpc.springboot.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@RestController\npublic class UserExistController {\n\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"user-exist\")\n\tpublic boolean emailExist(String email) {\n\t\treturn userService.existUser(email);\n\t}\n}\n"
  },
  {
    "path": "springboot-server/src/main/resources/application.yml",
    "content": "server:\n    address: benchmark-server\n    port: 8080"
  },
  {
    "path": "springboot-undertow-client/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "springboot-undertow-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>springboot-undertow-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>springboot-undertow-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "springboot-undertow-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceJsonHttpClientImpl;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserService userService = new UserServiceJsonHttpClientImpl(CONCURRENCY);\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException, InterruptedException {\n\t\tClient client = new Client();\n\n\t\tfor (int i = 0; i < 60; i++) {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(client.getUser());\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\tThread.sleep(1000);\n\t\t\t}\n\t\t}\n\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "springboot-undertow-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "springboot-undertow-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>springboot-undertow-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>springboot-undertow-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.spring-boot>2.1.2.RELEASE</version.spring-boot>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t\t<version>${version.spring-boot}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t\t<artifactId>spring-boot-starter-tomcat</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-undertow</artifactId>\n\t\t\t<version>${version.spring-boot}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>repackage</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "springboot-undertow-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication(scanBasePackages = { \"benchmark.rpc.springboot\" })\npublic class Server {\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Server.class, args);\n\t}\n}\n"
  },
  {
    "path": "springboot-undertow-server/src/main/java/benchmark/rpc/springboot/server/CreateUserController.java",
    "content": "package benchmark.rpc.springboot.server;\n\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@RestController\npublic class CreateUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@PostMapping(\"create-user\")\n\tpublic boolean createUser(User user) {\n\t\treturn userService.createUser(user);\n\t}\n}\n"
  },
  {
    "path": "springboot-undertow-server/src/main/java/benchmark/rpc/springboot/server/GetUserController.java",
    "content": "package benchmark.rpc.springboot.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@RestController\npublic class GetUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"get-user\")\n\tpublic User getUser(int id) {\n\t\tUser user = userService.getUser(id);\n\t\treturn user;\n\t}\n}\n"
  },
  {
    "path": "springboot-undertow-server/src/main/java/benchmark/rpc/springboot/server/ListUserController.java",
    "content": "package benchmark.rpc.springboot.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@RestController\npublic class ListUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"list-user\")\n\tpublic Page<User> getUser(int pageNo) {\n\t\tPage<User> userList = userService.listUser(pageNo);\n\t\treturn userList;\n\t}\n}\n"
  },
  {
    "path": "springboot-undertow-server/src/main/java/benchmark/rpc/springboot/server/UserExistController.java",
    "content": "package benchmark.rpc.springboot.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\n\n@RestController\npublic class UserExistController {\n\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"user-exist\")\n\tpublic boolean emailExist(String email) {\n\t\treturn userService.existUser(email);\n\t}\n}\n"
  },
  {
    "path": "springboot-undertow-server/src/main/resources/application.yml",
    "content": "server:\n    address: benchmark-server\n    port: 8080"
  },
  {
    "path": "springwebflux-client/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "springwebflux-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>springwebflux-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>springwebflux-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "springwebflux-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceJsonHttpClientImpl;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserService userService = new UserServiceJsonHttpClientImpl(CONCURRENCY);\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException, InterruptedException {\n\t\tClient client = new Client();\n\n\t\tfor (int i = 0; i < 60; i++) {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(client.getUser());\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\tThread.sleep(1000);\n\t\t\t}\n\t\t}\n\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "springwebflux-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "springwebflux-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>springwebflux-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>springwebflux-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<spring-boot.version>2.1.2.RELEASE</spring-boot.version>\n\t</properties>\n\n\t<repositories>\n\t\t<repository>\n\t\t\t<id>central</id>\n\t\t\t<name>Central Repository</name>\n\t\t\t<url>http://repo1.maven.org/maven2/</url>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t\t<repository>\n\t\t\t<id>io.spring.repo.maven.release</id>\n\t\t\t<url>http://repo.spring.io/release/</url>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t\t<repository>\n\t\t\t<id>io.spring.repo.maven.milestone</id>\n\t\t\t<url>http://repo.spring.io/milestone/</url>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t</repositories>\n\t\n\t\n\t<pluginRepositories>\n\t\t<pluginRepository>\n\t\t\t<id>central</id>\n\t\t\t<name>Central Repository</name>\n\t\t\t<url>http://repo1.maven.org/maven2/</url>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</snapshots>\n\t\t</pluginRepository>\n\t\t<pluginRepository>\n\t\t\t<id>io.spring.repo.maven.release</id>\n\t\t\t<url>http://repo.spring.io/release/</url>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t</pluginRepository>\n\t\t<pluginRepository>\n\t\t\t<id>io.spring.repo.maven.milestone</id>\n\t\t\t<url>http://repo.spring.io/milestone/</url>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t</pluginRepository>\n\t</pluginRepositories>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t\t<version>${spring-boot.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-webflux</artifactId>\n\t\t\t<version>${spring-boot.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<version>${spring-boot.version}</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<fork>true</fork>\n\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>repackage</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "springwebflux-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Primary;\nimport org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;\nimport org.springframework.web.reactive.config.EnableWebFlux;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport com.fasterxml.jackson.datatype.jdk8.Jdk8Module;\nimport com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;\nimport com.fasterxml.jackson.module.afterburner.AfterburnerModule;\n\n@SpringBootApplication(scanBasePackages = { \"benchmark.rpc.webflux\" })\n@EnableWebFlux\npublic class Server {\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Server.class, args);\n\t}\n\n\t@Bean\n\t@Primary\n\tpublic ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {\n\t\tObjectMapper objectMapper = builder.createXmlMapper(false).build();\n\n\t\tobjectMapper.registerModule(new Jdk8Module());\n\t\tobjectMapper.registerModule(new JavaTimeModule());\n\t\tobjectMapper.registerModule(new AfterburnerModule());\n\n\t\treturn objectMapper;\n\t}\n}\n"
  },
  {
    "path": "springwebflux-server/src/main/java/benchmark/rpc/webflux/server/CreateUserController.java",
    "content": "package benchmark.rpc.webflux.server;\n\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport reactor.core.publisher.Mono;\n\n@RestController\npublic class CreateUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@PostMapping(\"create-user\")\n\tpublic Mono<Boolean> createUser(User user) {\n\t\treturn Mono.fromCallable(() -> userService.createUser(user));\n\n\t}\n}\n"
  },
  {
    "path": "springwebflux-server/src/main/java/benchmark/rpc/webflux/server/GetUserController.java",
    "content": "package benchmark.rpc.webflux.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport reactor.core.publisher.Mono;\n\n@RestController\npublic class GetUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"get-user\")\n\tpublic Mono<User> getUser(int id) {\n\t\treturn Mono.fromCallable(() -> userService.getUser(id));\n\t}\n}\n"
  },
  {
    "path": "springwebflux-server/src/main/java/benchmark/rpc/webflux/server/ListUserController.java",
    "content": "package benchmark.rpc.webflux.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport reactor.core.publisher.Mono;\n\n@RestController\npublic class ListUserController {\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"list-user\")\n\tpublic Mono<Page<User>> getUser(int pageNo) {\n\t\treturn Mono.fromCallable(() -> userService.listUser(pageNo));\n\t}\n\n}\n"
  },
  {
    "path": "springwebflux-server/src/main/java/benchmark/rpc/webflux/server/UserExistController.java",
    "content": "package benchmark.rpc.webflux.server;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport reactor.core.publisher.Mono;\n\n@RestController\npublic class UserExistController {\n\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@GetMapping(\"user-exist\")\n\tpublic Mono<Boolean> emailExist(String email) {\n\t\treturn Mono.fromCallable(() -> userService.existUser(email));\n\t}\n}\n"
  },
  {
    "path": "springwebflux-server/src/main/resources/application.yml",
    "content": "server:\n    address: benchmark-server\n    port: 8080"
  },
  {
    "path": "thrift-client/.gitignore",
    "content": "/bin/\n"
  },
  {
    "path": "thrift-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>thrift-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>thrift-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.thrift>0.12.0</version.thrift>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.thrift</groupId>\n\t\t\t<artifactId>libthrift</artifactId>\n\t\t\t<version>${version.thrift}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/thrift</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "thrift-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.thrift.UserServiceThriftClientImpl;\nimport benchmark.service.UserService;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserServiceThriftClientImpl userService = new UserServiceThriftClientImpl();\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tuserService.close();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tClient client = new Client();\n\n\t\tfor (int i = 0; i < 60; i++) {\n\t\t\ttry {\n\t\t\t\tSystem.out.println(client.getUser());\n\t\t\t\tbreak;\n\t\t\t} catch (Exception e) {\n\t\t\t\tThread.sleep(1000);\n\t\t\t}\n\t\t}\n\t\t\n\t\tclient.close();\n\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "thrift-client/src/main/java/benchmark/rpc/thrift/Converter.java",
    "content": "package benchmark.rpc.thrift;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.ZoneOffset;\n\npublic class Converter {\n\n\tpublic static benchmark.rpc.thrift.User toThrift(benchmark.bean.User user) {\n\t\tbenchmark.rpc.thrift.User thriftUser = new benchmark.rpc.thrift.User();\n\n\t\tthriftUser.setId(user.getId());\n\t\tthriftUser.setName(user.getName());\n\t\tthriftUser.setSex(user.getSex());\n\t\tthriftUser.setBirthday((int) (user.getBirthday().toEpochDay()));\n\t\tthriftUser.setEmail(user.getEmail());\n\t\tthriftUser.setMobile(user.getMobile());\n\t\tthriftUser.setAddress(user.getAddress());\n\t\tthriftUser.setIcon(user.getIcon());\n\t\tthriftUser.setPermissions(user.getPermissions());\n\t\tthriftUser.setStatus(user.getStatus());\n\t\tthriftUser.setCreateTime(user.getCreateTime().toEpochSecond(ZoneOffset.UTC));\n\t\tthriftUser.setUpdateTime(user.getUpdateTime().toEpochSecond(ZoneOffset.UTC));\n\n\t\treturn thriftUser;\n\t}\n\n\tpublic static benchmark.bean.User toRaw(benchmark.rpc.thrift.User user) {\n\t\tbenchmark.bean.User rawUser = new benchmark.bean.User();\n\n\t\trawUser.setId(user.getId());\n\t\trawUser.setName(user.getName());\n\t\trawUser.setSex(user.getSex());\n\t\trawUser.setBirthday(LocalDate.ofEpochDay(user.getBirthday()));\n\t\trawUser.setEmail(user.getEmail());\n\t\trawUser.setMobile(user.getMobile());\n\t\trawUser.setAddress(user.getAddress());\n\t\trawUser.setIcon(user.getIcon());\n\t\trawUser.setPermissions(user.getPermissions());\n\t\trawUser.setStatus(user.getStatus());\n\t\trawUser.setCreateTime(LocalDateTime.ofEpochSecond(user.getCreateTime(), 0, ZoneOffset.UTC));\n\t\trawUser.setUpdateTime(LocalDateTime.ofEpochSecond(user.getUpdateTime(), 0, ZoneOffset.UTC));\n\n\t\treturn rawUser;\n\t}\n}\n"
  },
  {
    "path": "thrift-client/src/main/java/benchmark/rpc/thrift/TServiceClientNoPrint.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements. See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership. The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License. You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied. See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\npackage benchmark.rpc.thrift;\n\nimport org.apache.thrift.TApplicationException;\nimport org.apache.thrift.TBase;\nimport org.apache.thrift.TException;\nimport org.apache.thrift.protocol.TMessage;\nimport org.apache.thrift.protocol.TMessageType;\nimport org.apache.thrift.protocol.TProtocol;\n\n/**\n * A TServiceClient is used to communicate with a TService implementation across\n * protocols and transports.\n */\npublic abstract class TServiceClientNoPrint extends org.apache.thrift.TServiceClient {\n\n\tpublic TServiceClientNoPrint(TProtocol prot) {\n\t\tsuper(prot);\n\t}\n\n\tpublic TServiceClientNoPrint(TProtocol iprot, TProtocol oprot) {\n\t\tsuper(iprot, oprot);\n\t}\n\n\t@Override\n\tprotected void receiveBase(TBase<?, ?> result, String methodName) throws TException {\n\t\tTMessage msg = iprot_.readMessageBegin();\n\t\tif (msg.type == TMessageType.EXCEPTION) {\n\t\t\tTApplicationException x = new TApplicationException();\n\t\t\tx.read(iprot_);\n\t\t\tiprot_.readMessageEnd();\n\t\t\tthrow x;\n\t\t}\n\t\t// System.out.format(\"Received %d%n\", msg.seqid);\n\t\tif (msg.seqid != seqid_) {\n\t\t\tthrow new TApplicationException(TApplicationException.BAD_SEQUENCE_ID, String.format(\n\t\t\t\t\t\"%s failed: out of sequence response: expected %d but got %d\", methodName, seqid_, msg.seqid));\n\t\t}\n\t\tresult.read(iprot_);\n\t\tiprot_.readMessageEnd();\n\t}\n\n}\n"
  },
  {
    "path": "thrift-client/src/main/java/benchmark/rpc/thrift/ThriftUserServiceClient.java",
    "content": "package benchmark.rpc.thrift;\n\nimport java.io.Closeable;\nimport java.io.IOException;\n\nimport org.apache.thrift.protocol.TBinaryProtocol;\nimport org.apache.thrift.protocol.TProtocol;\nimport org.apache.thrift.transport.TFramedTransport;\nimport org.apache.thrift.transport.TSocket;\nimport org.apache.thrift.transport.TTransport;\nimport org.apache.thrift.transport.TTransportException;\n\npublic class ThriftUserServiceClient implements Closeable {\n\n\t// not thread safe\n\tpublic final TTransport transport;\n\tpublic final TProtocol protocol;\n\tpublic final UserService.Client client;\n\n\tpublic ThriftUserServiceClient(String host, int port) {\n\t\ttransport = new TFramedTransport(new TSocket(host, port));\n\t\tprotocol = new TBinaryProtocol(transport);\n\t\tclient = new UserService.Client(protocol);\n\n\t\ttry {\n\t\t\ttransport.open();\n\t\t} catch (TTransportException e) {\n\t\t\tthrow new Error(e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\ttransport.close();\n\t}\n\n}\n"
  },
  {
    "path": "thrift-client/src/main/java/benchmark/rpc/thrift/User.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class User implements org.apache.thrift.TBase<User, User._Fields>, java.io.Serializable, Cloneable, Comparable<User> {\n  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"User\");\n\n  private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField(\"id\", org.apache.thrift.protocol.TType.I64, (short)1);\n  private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"name\", org.apache.thrift.protocol.TType.STRING, (short)2);\n  private static final org.apache.thrift.protocol.TField SEX_FIELD_DESC = new org.apache.thrift.protocol.TField(\"sex\", org.apache.thrift.protocol.TType.I32, (short)3);\n  private static final org.apache.thrift.protocol.TField BIRTHDAY_FIELD_DESC = new org.apache.thrift.protocol.TField(\"birthday\", org.apache.thrift.protocol.TType.I32, (short)4);\n  private static final org.apache.thrift.protocol.TField EMAIL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"email\", org.apache.thrift.protocol.TType.STRING, (short)5);\n  private static final org.apache.thrift.protocol.TField MOBILE_FIELD_DESC = new org.apache.thrift.protocol.TField(\"mobile\", org.apache.thrift.protocol.TType.STRING, (short)6);\n  private static final org.apache.thrift.protocol.TField ADDRESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"address\", org.apache.thrift.protocol.TType.STRING, (short)7);\n  private static final org.apache.thrift.protocol.TField ICON_FIELD_DESC = new org.apache.thrift.protocol.TField(\"icon\", org.apache.thrift.protocol.TType.STRING, (short)8);\n  private static final org.apache.thrift.protocol.TField PERMISSIONS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"permissions\", org.apache.thrift.protocol.TType.LIST, (short)9);\n  private static final org.apache.thrift.protocol.TField STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"status\", org.apache.thrift.protocol.TType.I32, (short)10);\n  private static final org.apache.thrift.protocol.TField CREATE_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"createTime\", org.apache.thrift.protocol.TType.I64, (short)11);\n  private static final org.apache.thrift.protocol.TField UPDATE_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"updateTime\", org.apache.thrift.protocol.TType.I64, (short)12);\n\n  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new UserStandardSchemeFactory();\n  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new UserTupleSchemeFactory();\n\n  public long id; // required\n  public java.lang.String name; // required\n  public int sex; // required\n  public int birthday; // required\n  public java.lang.String email; // required\n  public java.lang.String mobile; // required\n  public java.lang.String address; // required\n  public java.lang.String icon; // required\n  public java.util.List<java.lang.Integer> permissions; // required\n  public int status; // required\n  public long createTime; // required\n  public long updateTime; // required\n\n  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n  public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n    ID((short)1, \"id\"),\n    NAME((short)2, \"name\"),\n    SEX((short)3, \"sex\"),\n    BIRTHDAY((short)4, \"birthday\"),\n    EMAIL((short)5, \"email\"),\n    MOBILE((short)6, \"mobile\"),\n    ADDRESS((short)7, \"address\"),\n    ICON((short)8, \"icon\"),\n    PERMISSIONS((short)9, \"permissions\"),\n    STATUS((short)10, \"status\"),\n    CREATE_TIME((short)11, \"createTime\"),\n    UPDATE_TIME((short)12, \"updateTime\");\n\n    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n    static {\n      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n        byName.put(field.getFieldName(), field);\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, or null if its not found.\n     */\n    public static _Fields findByThriftId(int fieldId) {\n      switch(fieldId) {\n        case 1: // ID\n          return ID;\n        case 2: // NAME\n          return NAME;\n        case 3: // SEX\n          return SEX;\n        case 4: // BIRTHDAY\n          return BIRTHDAY;\n        case 5: // EMAIL\n          return EMAIL;\n        case 6: // MOBILE\n          return MOBILE;\n        case 7: // ADDRESS\n          return ADDRESS;\n        case 8: // ICON\n          return ICON;\n        case 9: // PERMISSIONS\n          return PERMISSIONS;\n        case 10: // STATUS\n          return STATUS;\n        case 11: // CREATE_TIME\n          return CREATE_TIME;\n        case 12: // UPDATE_TIME\n          return UPDATE_TIME;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, throwing an exception\n     * if it is not found.\n     */\n    public static _Fields findByThriftIdOrThrow(int fieldId) {\n      _Fields fields = findByThriftId(fieldId);\n      if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n      return fields;\n    }\n\n    /**\n     * Find the _Fields constant that matches name, or null if its not found.\n     */\n    public static _Fields findByName(java.lang.String name) {\n      return byName.get(name);\n    }\n\n    private final short _thriftId;\n    private final java.lang.String _fieldName;\n\n    _Fields(short thriftId, java.lang.String fieldName) {\n      _thriftId = thriftId;\n      _fieldName = fieldName;\n    }\n\n    public short getThriftFieldId() {\n      return _thriftId;\n    }\n\n    public java.lang.String getFieldName() {\n      return _fieldName;\n    }\n  }\n\n  // isset id assignments\n  private static final int __ID_ISSET_ID = 0;\n  private static final int __SEX_ISSET_ID = 1;\n  private static final int __BIRTHDAY_ISSET_ID = 2;\n  private static final int __STATUS_ISSET_ID = 3;\n  private static final int __CREATETIME_ISSET_ID = 4;\n  private static final int __UPDATETIME_ISSET_ID = 5;\n  private byte __isset_bitfield = 0;\n  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n  static {\n    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n    tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData(\"id\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    tmpMap.put(_Fields.NAME, new org.apache.thrift.meta_data.FieldMetaData(\"name\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.SEX, new org.apache.thrift.meta_data.FieldMetaData(\"sex\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.BIRTHDAY, new org.apache.thrift.meta_data.FieldMetaData(\"birthday\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.EMAIL, new org.apache.thrift.meta_data.FieldMetaData(\"email\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.MOBILE, new org.apache.thrift.meta_data.FieldMetaData(\"mobile\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.ADDRESS, new org.apache.thrift.meta_data.FieldMetaData(\"address\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.ICON, new org.apache.thrift.meta_data.FieldMetaData(\"icon\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.PERMISSIONS, new org.apache.thrift.meta_data.FieldMetaData(\"permissions\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, \n            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32))));\n    tmpMap.put(_Fields.STATUS, new org.apache.thrift.meta_data.FieldMetaData(\"status\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.CREATE_TIME, new org.apache.thrift.meta_data.FieldMetaData(\"createTime\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    tmpMap.put(_Fields.UPDATE_TIME, new org.apache.thrift.meta_data.FieldMetaData(\"updateTime\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(User.class, metaDataMap);\n  }\n\n  public User() {\n  }\n\n  public User(\n    long id,\n    java.lang.String name,\n    int sex,\n    int birthday,\n    java.lang.String email,\n    java.lang.String mobile,\n    java.lang.String address,\n    java.lang.String icon,\n    java.util.List<java.lang.Integer> permissions,\n    int status,\n    long createTime,\n    long updateTime)\n  {\n    this();\n    this.id = id;\n    setIdIsSet(true);\n    this.name = name;\n    this.sex = sex;\n    setSexIsSet(true);\n    this.birthday = birthday;\n    setBirthdayIsSet(true);\n    this.email = email;\n    this.mobile = mobile;\n    this.address = address;\n    this.icon = icon;\n    this.permissions = permissions;\n    this.status = status;\n    setStatusIsSet(true);\n    this.createTime = createTime;\n    setCreateTimeIsSet(true);\n    this.updateTime = updateTime;\n    setUpdateTimeIsSet(true);\n  }\n\n  /**\n   * Performs a deep copy on <i>other</i>.\n   */\n  public User(User other) {\n    __isset_bitfield = other.__isset_bitfield;\n    this.id = other.id;\n    if (other.isSetName()) {\n      this.name = other.name;\n    }\n    this.sex = other.sex;\n    this.birthday = other.birthday;\n    if (other.isSetEmail()) {\n      this.email = other.email;\n    }\n    if (other.isSetMobile()) {\n      this.mobile = other.mobile;\n    }\n    if (other.isSetAddress()) {\n      this.address = other.address;\n    }\n    if (other.isSetIcon()) {\n      this.icon = other.icon;\n    }\n    if (other.isSetPermissions()) {\n      java.util.List<java.lang.Integer> __this__permissions = new java.util.ArrayList<java.lang.Integer>(other.permissions);\n      this.permissions = __this__permissions;\n    }\n    this.status = other.status;\n    this.createTime = other.createTime;\n    this.updateTime = other.updateTime;\n  }\n\n  public User deepCopy() {\n    return new User(this);\n  }\n\n  @Override\n  public void clear() {\n    setIdIsSet(false);\n    this.id = 0;\n    this.name = null;\n    setSexIsSet(false);\n    this.sex = 0;\n    setBirthdayIsSet(false);\n    this.birthday = 0;\n    this.email = null;\n    this.mobile = null;\n    this.address = null;\n    this.icon = null;\n    this.permissions = null;\n    setStatusIsSet(false);\n    this.status = 0;\n    setCreateTimeIsSet(false);\n    this.createTime = 0;\n    setUpdateTimeIsSet(false);\n    this.updateTime = 0;\n  }\n\n  public long getId() {\n    return this.id;\n  }\n\n  public User setId(long id) {\n    this.id = id;\n    setIdIsSet(true);\n    return this;\n  }\n\n  public void unsetId() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ID_ISSET_ID);\n  }\n\n  /** Returns true if field id is set (has been assigned a value) and false otherwise */\n  public boolean isSetId() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ID_ISSET_ID);\n  }\n\n  public void setIdIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ID_ISSET_ID, value);\n  }\n\n  public java.lang.String getName() {\n    return this.name;\n  }\n\n  public User setName(java.lang.String name) {\n    this.name = name;\n    return this;\n  }\n\n  public void unsetName() {\n    this.name = null;\n  }\n\n  /** Returns true if field name is set (has been assigned a value) and false otherwise */\n  public boolean isSetName() {\n    return this.name != null;\n  }\n\n  public void setNameIsSet(boolean value) {\n    if (!value) {\n      this.name = null;\n    }\n  }\n\n  public int getSex() {\n    return this.sex;\n  }\n\n  public User setSex(int sex) {\n    this.sex = sex;\n    setSexIsSet(true);\n    return this;\n  }\n\n  public void unsetSex() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SEX_ISSET_ID);\n  }\n\n  /** Returns true if field sex is set (has been assigned a value) and false otherwise */\n  public boolean isSetSex() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SEX_ISSET_ID);\n  }\n\n  public void setSexIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SEX_ISSET_ID, value);\n  }\n\n  public int getBirthday() {\n    return this.birthday;\n  }\n\n  public User setBirthday(int birthday) {\n    this.birthday = birthday;\n    setBirthdayIsSet(true);\n    return this;\n  }\n\n  public void unsetBirthday() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __BIRTHDAY_ISSET_ID);\n  }\n\n  /** Returns true if field birthday is set (has been assigned a value) and false otherwise */\n  public boolean isSetBirthday() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __BIRTHDAY_ISSET_ID);\n  }\n\n  public void setBirthdayIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __BIRTHDAY_ISSET_ID, value);\n  }\n\n  public java.lang.String getEmail() {\n    return this.email;\n  }\n\n  public User setEmail(java.lang.String email) {\n    this.email = email;\n    return this;\n  }\n\n  public void unsetEmail() {\n    this.email = null;\n  }\n\n  /** Returns true if field email is set (has been assigned a value) and false otherwise */\n  public boolean isSetEmail() {\n    return this.email != null;\n  }\n\n  public void setEmailIsSet(boolean value) {\n    if (!value) {\n      this.email = null;\n    }\n  }\n\n  public java.lang.String getMobile() {\n    return this.mobile;\n  }\n\n  public User setMobile(java.lang.String mobile) {\n    this.mobile = mobile;\n    return this;\n  }\n\n  public void unsetMobile() {\n    this.mobile = null;\n  }\n\n  /** Returns true if field mobile is set (has been assigned a value) and false otherwise */\n  public boolean isSetMobile() {\n    return this.mobile != null;\n  }\n\n  public void setMobileIsSet(boolean value) {\n    if (!value) {\n      this.mobile = null;\n    }\n  }\n\n  public java.lang.String getAddress() {\n    return this.address;\n  }\n\n  public User setAddress(java.lang.String address) {\n    this.address = address;\n    return this;\n  }\n\n  public void unsetAddress() {\n    this.address = null;\n  }\n\n  /** Returns true if field address is set (has been assigned a value) and false otherwise */\n  public boolean isSetAddress() {\n    return this.address != null;\n  }\n\n  public void setAddressIsSet(boolean value) {\n    if (!value) {\n      this.address = null;\n    }\n  }\n\n  public java.lang.String getIcon() {\n    return this.icon;\n  }\n\n  public User setIcon(java.lang.String icon) {\n    this.icon = icon;\n    return this;\n  }\n\n  public void unsetIcon() {\n    this.icon = null;\n  }\n\n  /** Returns true if field icon is set (has been assigned a value) and false otherwise */\n  public boolean isSetIcon() {\n    return this.icon != null;\n  }\n\n  public void setIconIsSet(boolean value) {\n    if (!value) {\n      this.icon = null;\n    }\n  }\n\n  public int getPermissionsSize() {\n    return (this.permissions == null) ? 0 : this.permissions.size();\n  }\n\n  public java.util.Iterator<java.lang.Integer> getPermissionsIterator() {\n    return (this.permissions == null) ? null : this.permissions.iterator();\n  }\n\n  public void addToPermissions(int elem) {\n    if (this.permissions == null) {\n      this.permissions = new java.util.ArrayList<java.lang.Integer>();\n    }\n    this.permissions.add(elem);\n  }\n\n  public java.util.List<java.lang.Integer> getPermissions() {\n    return this.permissions;\n  }\n\n  public User setPermissions(java.util.List<java.lang.Integer> permissions) {\n    this.permissions = permissions;\n    return this;\n  }\n\n  public void unsetPermissions() {\n    this.permissions = null;\n  }\n\n  /** Returns true if field permissions is set (has been assigned a value) and false otherwise */\n  public boolean isSetPermissions() {\n    return this.permissions != null;\n  }\n\n  public void setPermissionsIsSet(boolean value) {\n    if (!value) {\n      this.permissions = null;\n    }\n  }\n\n  public int getStatus() {\n    return this.status;\n  }\n\n  public User setStatus(int status) {\n    this.status = status;\n    setStatusIsSet(true);\n    return this;\n  }\n\n  public void unsetStatus() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __STATUS_ISSET_ID);\n  }\n\n  /** Returns true if field status is set (has been assigned a value) and false otherwise */\n  public boolean isSetStatus() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __STATUS_ISSET_ID);\n  }\n\n  public void setStatusIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __STATUS_ISSET_ID, value);\n  }\n\n  public long getCreateTime() {\n    return this.createTime;\n  }\n\n  public User setCreateTime(long createTime) {\n    this.createTime = createTime;\n    setCreateTimeIsSet(true);\n    return this;\n  }\n\n  public void unsetCreateTime() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __CREATETIME_ISSET_ID);\n  }\n\n  /** Returns true if field createTime is set (has been assigned a value) and false otherwise */\n  public boolean isSetCreateTime() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __CREATETIME_ISSET_ID);\n  }\n\n  public void setCreateTimeIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __CREATETIME_ISSET_ID, value);\n  }\n\n  public long getUpdateTime() {\n    return this.updateTime;\n  }\n\n  public User setUpdateTime(long updateTime) {\n    this.updateTime = updateTime;\n    setUpdateTimeIsSet(true);\n    return this;\n  }\n\n  public void unsetUpdateTime() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __UPDATETIME_ISSET_ID);\n  }\n\n  /** Returns true if field updateTime is set (has been assigned a value) and false otherwise */\n  public boolean isSetUpdateTime() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __UPDATETIME_ISSET_ID);\n  }\n\n  public void setUpdateTimeIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __UPDATETIME_ISSET_ID, value);\n  }\n\n  public void setFieldValue(_Fields field, java.lang.Object value) {\n    switch (field) {\n    case ID:\n      if (value == null) {\n        unsetId();\n      } else {\n        setId((java.lang.Long)value);\n      }\n      break;\n\n    case NAME:\n      if (value == null) {\n        unsetName();\n      } else {\n        setName((java.lang.String)value);\n      }\n      break;\n\n    case SEX:\n      if (value == null) {\n        unsetSex();\n      } else {\n        setSex((java.lang.Integer)value);\n      }\n      break;\n\n    case BIRTHDAY:\n      if (value == null) {\n        unsetBirthday();\n      } else {\n        setBirthday((java.lang.Integer)value);\n      }\n      break;\n\n    case EMAIL:\n      if (value == null) {\n        unsetEmail();\n      } else {\n        setEmail((java.lang.String)value);\n      }\n      break;\n\n    case MOBILE:\n      if (value == null) {\n        unsetMobile();\n      } else {\n        setMobile((java.lang.String)value);\n      }\n      break;\n\n    case ADDRESS:\n      if (value == null) {\n        unsetAddress();\n      } else {\n        setAddress((java.lang.String)value);\n      }\n      break;\n\n    case ICON:\n      if (value == null) {\n        unsetIcon();\n      } else {\n        setIcon((java.lang.String)value);\n      }\n      break;\n\n    case PERMISSIONS:\n      if (value == null) {\n        unsetPermissions();\n      } else {\n        setPermissions((java.util.List<java.lang.Integer>)value);\n      }\n      break;\n\n    case STATUS:\n      if (value == null) {\n        unsetStatus();\n      } else {\n        setStatus((java.lang.Integer)value);\n      }\n      break;\n\n    case CREATE_TIME:\n      if (value == null) {\n        unsetCreateTime();\n      } else {\n        setCreateTime((java.lang.Long)value);\n      }\n      break;\n\n    case UPDATE_TIME:\n      if (value == null) {\n        unsetUpdateTime();\n      } else {\n        setUpdateTime((java.lang.Long)value);\n      }\n      break;\n\n    }\n  }\n\n  public java.lang.Object getFieldValue(_Fields field) {\n    switch (field) {\n    case ID:\n      return getId();\n\n    case NAME:\n      return getName();\n\n    case SEX:\n      return getSex();\n\n    case BIRTHDAY:\n      return getBirthday();\n\n    case EMAIL:\n      return getEmail();\n\n    case MOBILE:\n      return getMobile();\n\n    case ADDRESS:\n      return getAddress();\n\n    case ICON:\n      return getIcon();\n\n    case PERMISSIONS:\n      return getPermissions();\n\n    case STATUS:\n      return getStatus();\n\n    case CREATE_TIME:\n      return getCreateTime();\n\n    case UPDATE_TIME:\n      return getUpdateTime();\n\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n  public boolean isSet(_Fields field) {\n    if (field == null) {\n      throw new java.lang.IllegalArgumentException();\n    }\n\n    switch (field) {\n    case ID:\n      return isSetId();\n    case NAME:\n      return isSetName();\n    case SEX:\n      return isSetSex();\n    case BIRTHDAY:\n      return isSetBirthday();\n    case EMAIL:\n      return isSetEmail();\n    case MOBILE:\n      return isSetMobile();\n    case ADDRESS:\n      return isSetAddress();\n    case ICON:\n      return isSetIcon();\n    case PERMISSIONS:\n      return isSetPermissions();\n    case STATUS:\n      return isSetStatus();\n    case CREATE_TIME:\n      return isSetCreateTime();\n    case UPDATE_TIME:\n      return isSetUpdateTime();\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  @Override\n  public boolean equals(java.lang.Object that) {\n    if (that == null)\n      return false;\n    if (that instanceof User)\n      return this.equals((User)that);\n    return false;\n  }\n\n  public boolean equals(User that) {\n    if (that == null)\n      return false;\n    if (this == that)\n      return true;\n\n    boolean this_present_id = true;\n    boolean that_present_id = true;\n    if (this_present_id || that_present_id) {\n      if (!(this_present_id && that_present_id))\n        return false;\n      if (this.id != that.id)\n        return false;\n    }\n\n    boolean this_present_name = true && this.isSetName();\n    boolean that_present_name = true && that.isSetName();\n    if (this_present_name || that_present_name) {\n      if (!(this_present_name && that_present_name))\n        return false;\n      if (!this.name.equals(that.name))\n        return false;\n    }\n\n    boolean this_present_sex = true;\n    boolean that_present_sex = true;\n    if (this_present_sex || that_present_sex) {\n      if (!(this_present_sex && that_present_sex))\n        return false;\n      if (this.sex != that.sex)\n        return false;\n    }\n\n    boolean this_present_birthday = true;\n    boolean that_present_birthday = true;\n    if (this_present_birthday || that_present_birthday) {\n      if (!(this_present_birthday && that_present_birthday))\n        return false;\n      if (this.birthday != that.birthday)\n        return false;\n    }\n\n    boolean this_present_email = true && this.isSetEmail();\n    boolean that_present_email = true && that.isSetEmail();\n    if (this_present_email || that_present_email) {\n      if (!(this_present_email && that_present_email))\n        return false;\n      if (!this.email.equals(that.email))\n        return false;\n    }\n\n    boolean this_present_mobile = true && this.isSetMobile();\n    boolean that_present_mobile = true && that.isSetMobile();\n    if (this_present_mobile || that_present_mobile) {\n      if (!(this_present_mobile && that_present_mobile))\n        return false;\n      if (!this.mobile.equals(that.mobile))\n        return false;\n    }\n\n    boolean this_present_address = true && this.isSetAddress();\n    boolean that_present_address = true && that.isSetAddress();\n    if (this_present_address || that_present_address) {\n      if (!(this_present_address && that_present_address))\n        return false;\n      if (!this.address.equals(that.address))\n        return false;\n    }\n\n    boolean this_present_icon = true && this.isSetIcon();\n    boolean that_present_icon = true && that.isSetIcon();\n    if (this_present_icon || that_present_icon) {\n      if (!(this_present_icon && that_present_icon))\n        return false;\n      if (!this.icon.equals(that.icon))\n        return false;\n    }\n\n    boolean this_present_permissions = true && this.isSetPermissions();\n    boolean that_present_permissions = true && that.isSetPermissions();\n    if (this_present_permissions || that_present_permissions) {\n      if (!(this_present_permissions && that_present_permissions))\n        return false;\n      if (!this.permissions.equals(that.permissions))\n        return false;\n    }\n\n    boolean this_present_status = true;\n    boolean that_present_status = true;\n    if (this_present_status || that_present_status) {\n      if (!(this_present_status && that_present_status))\n        return false;\n      if (this.status != that.status)\n        return false;\n    }\n\n    boolean this_present_createTime = true;\n    boolean that_present_createTime = true;\n    if (this_present_createTime || that_present_createTime) {\n      if (!(this_present_createTime && that_present_createTime))\n        return false;\n      if (this.createTime != that.createTime)\n        return false;\n    }\n\n    boolean this_present_updateTime = true;\n    boolean that_present_updateTime = true;\n    if (this_present_updateTime || that_present_updateTime) {\n      if (!(this_present_updateTime && that_present_updateTime))\n        return false;\n      if (this.updateTime != that.updateTime)\n        return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    int hashCode = 1;\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(id);\n\n    hashCode = hashCode * 8191 + ((isSetName()) ? 131071 : 524287);\n    if (isSetName())\n      hashCode = hashCode * 8191 + name.hashCode();\n\n    hashCode = hashCode * 8191 + sex;\n\n    hashCode = hashCode * 8191 + birthday;\n\n    hashCode = hashCode * 8191 + ((isSetEmail()) ? 131071 : 524287);\n    if (isSetEmail())\n      hashCode = hashCode * 8191 + email.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetMobile()) ? 131071 : 524287);\n    if (isSetMobile())\n      hashCode = hashCode * 8191 + mobile.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetAddress()) ? 131071 : 524287);\n    if (isSetAddress())\n      hashCode = hashCode * 8191 + address.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetIcon()) ? 131071 : 524287);\n    if (isSetIcon())\n      hashCode = hashCode * 8191 + icon.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetPermissions()) ? 131071 : 524287);\n    if (isSetPermissions())\n      hashCode = hashCode * 8191 + permissions.hashCode();\n\n    hashCode = hashCode * 8191 + status;\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(createTime);\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(updateTime);\n\n    return hashCode;\n  }\n\n  @Override\n  public int compareTo(User other) {\n    if (!getClass().equals(other.getClass())) {\n      return getClass().getName().compareTo(other.getClass().getName());\n    }\n\n    int lastComparison = 0;\n\n    lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetId()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetName()).compareTo(other.isSetName());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetName()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.name, other.name);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetSex()).compareTo(other.isSetSex());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetSex()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.sex, other.sex);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetBirthday()).compareTo(other.isSetBirthday());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetBirthday()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.birthday, other.birthday);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetEmail()).compareTo(other.isSetEmail());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetEmail()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.email, other.email);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetMobile()).compareTo(other.isSetMobile());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetMobile()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.mobile, other.mobile);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetAddress()).compareTo(other.isSetAddress());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetAddress()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.address, other.address);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetIcon()).compareTo(other.isSetIcon());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetIcon()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.icon, other.icon);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetPermissions()).compareTo(other.isSetPermissions());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetPermissions()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.permissions, other.permissions);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetStatus()).compareTo(other.isSetStatus());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetStatus()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.status, other.status);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetCreateTime()).compareTo(other.isSetCreateTime());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetCreateTime()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.createTime, other.createTime);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetUpdateTime()).compareTo(other.isSetUpdateTime());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetUpdateTime()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.updateTime, other.updateTime);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    return 0;\n  }\n\n  public _Fields fieldForId(int fieldId) {\n    return _Fields.findByThriftId(fieldId);\n  }\n\n  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n    scheme(iprot).read(iprot, this);\n  }\n\n  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n    scheme(oprot).write(oprot, this);\n  }\n\n  @Override\n  public java.lang.String toString() {\n    java.lang.StringBuilder sb = new java.lang.StringBuilder(\"User(\");\n    boolean first = true;\n\n    sb.append(\"id:\");\n    sb.append(this.id);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"name:\");\n    if (this.name == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.name);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"sex:\");\n    sb.append(this.sex);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"birthday:\");\n    sb.append(this.birthday);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"email:\");\n    if (this.email == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.email);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"mobile:\");\n    if (this.mobile == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.mobile);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"address:\");\n    if (this.address == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.address);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"icon:\");\n    if (this.icon == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.icon);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"permissions:\");\n    if (this.permissions == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.permissions);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"status:\");\n    sb.append(this.status);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"createTime:\");\n    sb.append(this.createTime);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"updateTime:\");\n    sb.append(this.updateTime);\n    first = false;\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  public void validate() throws org.apache.thrift.TException {\n    // check for required fields\n    // check for sub-struct validity\n  }\n\n  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n    try {\n      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n    try {\n      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n      __isset_bitfield = 0;\n      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private static class UserStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserStandardScheme getScheme() {\n      return new UserStandardScheme();\n    }\n  }\n\n  private static class UserStandardScheme extends org.apache.thrift.scheme.StandardScheme<User> {\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TField schemeField;\n      iprot.readStructBegin();\n      while (true)\n      {\n        schemeField = iprot.readFieldBegin();\n        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n          break;\n        }\n        switch (schemeField.id) {\n          case 1: // ID\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.id = iprot.readI64();\n              struct.setIdIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 2: // NAME\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.name = iprot.readString();\n              struct.setNameIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 3: // SEX\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.sex = iprot.readI32();\n              struct.setSexIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 4: // BIRTHDAY\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.birthday = iprot.readI32();\n              struct.setBirthdayIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 5: // EMAIL\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.email = iprot.readString();\n              struct.setEmailIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 6: // MOBILE\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.mobile = iprot.readString();\n              struct.setMobileIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 7: // ADDRESS\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.address = iprot.readString();\n              struct.setAddressIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 8: // ICON\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.icon = iprot.readString();\n              struct.setIconIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 9: // PERMISSIONS\n            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {\n              {\n                org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();\n                struct.permissions = new java.util.ArrayList<java.lang.Integer>(_list0.size);\n                int _elem1;\n                for (int _i2 = 0; _i2 < _list0.size; ++_i2)\n                {\n                  _elem1 = iprot.readI32();\n                  struct.permissions.add(_elem1);\n                }\n                iprot.readListEnd();\n              }\n              struct.setPermissionsIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 10: // STATUS\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.status = iprot.readI32();\n              struct.setStatusIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 11: // CREATE_TIME\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.createTime = iprot.readI64();\n              struct.setCreateTimeIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 12: // UPDATE_TIME\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.updateTime = iprot.readI64();\n              struct.setUpdateTimeIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          default:\n            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n        }\n        iprot.readFieldEnd();\n      }\n      iprot.readStructEnd();\n\n      // check for required fields of primitive type, which can't be checked in the validate method\n      struct.validate();\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot, User struct) throws org.apache.thrift.TException {\n      struct.validate();\n\n      oprot.writeStructBegin(STRUCT_DESC);\n      oprot.writeFieldBegin(ID_FIELD_DESC);\n      oprot.writeI64(struct.id);\n      oprot.writeFieldEnd();\n      if (struct.name != null) {\n        oprot.writeFieldBegin(NAME_FIELD_DESC);\n        oprot.writeString(struct.name);\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldBegin(SEX_FIELD_DESC);\n      oprot.writeI32(struct.sex);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(BIRTHDAY_FIELD_DESC);\n      oprot.writeI32(struct.birthday);\n      oprot.writeFieldEnd();\n      if (struct.email != null) {\n        oprot.writeFieldBegin(EMAIL_FIELD_DESC);\n        oprot.writeString(struct.email);\n        oprot.writeFieldEnd();\n      }\n      if (struct.mobile != null) {\n        oprot.writeFieldBegin(MOBILE_FIELD_DESC);\n        oprot.writeString(struct.mobile);\n        oprot.writeFieldEnd();\n      }\n      if (struct.address != null) {\n        oprot.writeFieldBegin(ADDRESS_FIELD_DESC);\n        oprot.writeString(struct.address);\n        oprot.writeFieldEnd();\n      }\n      if (struct.icon != null) {\n        oprot.writeFieldBegin(ICON_FIELD_DESC);\n        oprot.writeString(struct.icon);\n        oprot.writeFieldEnd();\n      }\n      if (struct.permissions != null) {\n        oprot.writeFieldBegin(PERMISSIONS_FIELD_DESC);\n        {\n          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.I32, struct.permissions.size()));\n          for (int _iter3 : struct.permissions)\n          {\n            oprot.writeI32(_iter3);\n          }\n          oprot.writeListEnd();\n        }\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldBegin(STATUS_FIELD_DESC);\n      oprot.writeI32(struct.status);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(CREATE_TIME_FIELD_DESC);\n      oprot.writeI64(struct.createTime);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(UPDATE_TIME_FIELD_DESC);\n      oprot.writeI64(struct.updateTime);\n      oprot.writeFieldEnd();\n      oprot.writeFieldStop();\n      oprot.writeStructEnd();\n    }\n\n  }\n\n  private static class UserTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserTupleScheme getScheme() {\n      return new UserTupleScheme();\n    }\n  }\n\n  private static class UserTupleScheme extends org.apache.thrift.scheme.TupleScheme<User> {\n\n    @Override\n    public void write(org.apache.thrift.protocol.TProtocol prot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet optionals = new java.util.BitSet();\n      if (struct.isSetId()) {\n        optionals.set(0);\n      }\n      if (struct.isSetName()) {\n        optionals.set(1);\n      }\n      if (struct.isSetSex()) {\n        optionals.set(2);\n      }\n      if (struct.isSetBirthday()) {\n        optionals.set(3);\n      }\n      if (struct.isSetEmail()) {\n        optionals.set(4);\n      }\n      if (struct.isSetMobile()) {\n        optionals.set(5);\n      }\n      if (struct.isSetAddress()) {\n        optionals.set(6);\n      }\n      if (struct.isSetIcon()) {\n        optionals.set(7);\n      }\n      if (struct.isSetPermissions()) {\n        optionals.set(8);\n      }\n      if (struct.isSetStatus()) {\n        optionals.set(9);\n      }\n      if (struct.isSetCreateTime()) {\n        optionals.set(10);\n      }\n      if (struct.isSetUpdateTime()) {\n        optionals.set(11);\n      }\n      oprot.writeBitSet(optionals, 12);\n      if (struct.isSetId()) {\n        oprot.writeI64(struct.id);\n      }\n      if (struct.isSetName()) {\n        oprot.writeString(struct.name);\n      }\n      if (struct.isSetSex()) {\n        oprot.writeI32(struct.sex);\n      }\n      if (struct.isSetBirthday()) {\n        oprot.writeI32(struct.birthday);\n      }\n      if (struct.isSetEmail()) {\n        oprot.writeString(struct.email);\n      }\n      if (struct.isSetMobile()) {\n        oprot.writeString(struct.mobile);\n      }\n      if (struct.isSetAddress()) {\n        oprot.writeString(struct.address);\n      }\n      if (struct.isSetIcon()) {\n        oprot.writeString(struct.icon);\n      }\n      if (struct.isSetPermissions()) {\n        {\n          oprot.writeI32(struct.permissions.size());\n          for (int _iter4 : struct.permissions)\n          {\n            oprot.writeI32(_iter4);\n          }\n        }\n      }\n      if (struct.isSetStatus()) {\n        oprot.writeI32(struct.status);\n      }\n      if (struct.isSetCreateTime()) {\n        oprot.writeI64(struct.createTime);\n      }\n      if (struct.isSetUpdateTime()) {\n        oprot.writeI64(struct.updateTime);\n      }\n    }\n\n    @Override\n    public void read(org.apache.thrift.protocol.TProtocol prot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet incoming = iprot.readBitSet(12);\n      if (incoming.get(0)) {\n        struct.id = iprot.readI64();\n        struct.setIdIsSet(true);\n      }\n      if (incoming.get(1)) {\n        struct.name = iprot.readString();\n        struct.setNameIsSet(true);\n      }\n      if (incoming.get(2)) {\n        struct.sex = iprot.readI32();\n        struct.setSexIsSet(true);\n      }\n      if (incoming.get(3)) {\n        struct.birthday = iprot.readI32();\n        struct.setBirthdayIsSet(true);\n      }\n      if (incoming.get(4)) {\n        struct.email = iprot.readString();\n        struct.setEmailIsSet(true);\n      }\n      if (incoming.get(5)) {\n        struct.mobile = iprot.readString();\n        struct.setMobileIsSet(true);\n      }\n      if (incoming.get(6)) {\n        struct.address = iprot.readString();\n        struct.setAddressIsSet(true);\n      }\n      if (incoming.get(7)) {\n        struct.icon = iprot.readString();\n        struct.setIconIsSet(true);\n      }\n      if (incoming.get(8)) {\n        {\n          org.apache.thrift.protocol.TList _list5 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.I32, iprot.readI32());\n          struct.permissions = new java.util.ArrayList<java.lang.Integer>(_list5.size);\n          int _elem6;\n          for (int _i7 = 0; _i7 < _list5.size; ++_i7)\n          {\n            _elem6 = iprot.readI32();\n            struct.permissions.add(_elem6);\n          }\n        }\n        struct.setPermissionsIsSet(true);\n      }\n      if (incoming.get(9)) {\n        struct.status = iprot.readI32();\n        struct.setStatusIsSet(true);\n      }\n      if (incoming.get(10)) {\n        struct.createTime = iprot.readI64();\n        struct.setCreateTimeIsSet(true);\n      }\n      if (incoming.get(11)) {\n        struct.updateTime = iprot.readI64();\n        struct.setUpdateTimeIsSet(true);\n      }\n    }\n  }\n\n  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n  }\n}\n\n"
  },
  {
    "path": "thrift-client/src/main/java/benchmark/rpc/thrift/UserPage.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class UserPage implements org.apache.thrift.TBase<UserPage, UserPage._Fields>, java.io.Serializable, Cloneable, Comparable<UserPage> {\n  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"UserPage\");\n\n  private static final org.apache.thrift.protocol.TField PAGE_NO_FIELD_DESC = new org.apache.thrift.protocol.TField(\"pageNo\", org.apache.thrift.protocol.TType.I32, (short)1);\n  private static final org.apache.thrift.protocol.TField TOTAL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"total\", org.apache.thrift.protocol.TType.I32, (short)2);\n  private static final org.apache.thrift.protocol.TField RESULT_FIELD_DESC = new org.apache.thrift.protocol.TField(\"result\", org.apache.thrift.protocol.TType.LIST, (short)3);\n\n  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new UserPageStandardSchemeFactory();\n  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new UserPageTupleSchemeFactory();\n\n  public int pageNo; // required\n  public int total; // required\n  public java.util.List<User> result; // required\n\n  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n  public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n    PAGE_NO((short)1, \"pageNo\"),\n    TOTAL((short)2, \"total\"),\n    RESULT((short)3, \"result\");\n\n    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n    static {\n      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n        byName.put(field.getFieldName(), field);\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, or null if its not found.\n     */\n    public static _Fields findByThriftId(int fieldId) {\n      switch(fieldId) {\n        case 1: // PAGE_NO\n          return PAGE_NO;\n        case 2: // TOTAL\n          return TOTAL;\n        case 3: // RESULT\n          return RESULT;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, throwing an exception\n     * if it is not found.\n     */\n    public static _Fields findByThriftIdOrThrow(int fieldId) {\n      _Fields fields = findByThriftId(fieldId);\n      if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n      return fields;\n    }\n\n    /**\n     * Find the _Fields constant that matches name, or null if its not found.\n     */\n    public static _Fields findByName(java.lang.String name) {\n      return byName.get(name);\n    }\n\n    private final short _thriftId;\n    private final java.lang.String _fieldName;\n\n    _Fields(short thriftId, java.lang.String fieldName) {\n      _thriftId = thriftId;\n      _fieldName = fieldName;\n    }\n\n    public short getThriftFieldId() {\n      return _thriftId;\n    }\n\n    public java.lang.String getFieldName() {\n      return _fieldName;\n    }\n  }\n\n  // isset id assignments\n  private static final int __PAGENO_ISSET_ID = 0;\n  private static final int __TOTAL_ISSET_ID = 1;\n  private byte __isset_bitfield = 0;\n  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n  static {\n    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n    tmpMap.put(_Fields.PAGE_NO, new org.apache.thrift.meta_data.FieldMetaData(\"pageNo\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.TOTAL, new org.apache.thrift.meta_data.FieldMetaData(\"total\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.RESULT, new org.apache.thrift.meta_data.FieldMetaData(\"result\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, \n            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class))));\n    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(UserPage.class, metaDataMap);\n  }\n\n  public UserPage() {\n  }\n\n  public UserPage(\n    int pageNo,\n    int total,\n    java.util.List<User> result)\n  {\n    this();\n    this.pageNo = pageNo;\n    setPageNoIsSet(true);\n    this.total = total;\n    setTotalIsSet(true);\n    this.result = result;\n  }\n\n  /**\n   * Performs a deep copy on <i>other</i>.\n   */\n  public UserPage(UserPage other) {\n    __isset_bitfield = other.__isset_bitfield;\n    this.pageNo = other.pageNo;\n    this.total = other.total;\n    if (other.isSetResult()) {\n      java.util.List<User> __this__result = new java.util.ArrayList<User>(other.result.size());\n      for (User other_element : other.result) {\n        __this__result.add(new User(other_element));\n      }\n      this.result = __this__result;\n    }\n  }\n\n  public UserPage deepCopy() {\n    return new UserPage(this);\n  }\n\n  @Override\n  public void clear() {\n    setPageNoIsSet(false);\n    this.pageNo = 0;\n    setTotalIsSet(false);\n    this.total = 0;\n    this.result = null;\n  }\n\n  public int getPageNo() {\n    return this.pageNo;\n  }\n\n  public UserPage setPageNo(int pageNo) {\n    this.pageNo = pageNo;\n    setPageNoIsSet(true);\n    return this;\n  }\n\n  public void unsetPageNo() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PAGENO_ISSET_ID);\n  }\n\n  /** Returns true if field pageNo is set (has been assigned a value) and false otherwise */\n  public boolean isSetPageNo() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PAGENO_ISSET_ID);\n  }\n\n  public void setPageNoIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PAGENO_ISSET_ID, value);\n  }\n\n  public int getTotal() {\n    return this.total;\n  }\n\n  public UserPage setTotal(int total) {\n    this.total = total;\n    setTotalIsSet(true);\n    return this;\n  }\n\n  public void unsetTotal() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __TOTAL_ISSET_ID);\n  }\n\n  /** Returns true if field total is set (has been assigned a value) and false otherwise */\n  public boolean isSetTotal() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __TOTAL_ISSET_ID);\n  }\n\n  public void setTotalIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __TOTAL_ISSET_ID, value);\n  }\n\n  public int getResultSize() {\n    return (this.result == null) ? 0 : this.result.size();\n  }\n\n  public java.util.Iterator<User> getResultIterator() {\n    return (this.result == null) ? null : this.result.iterator();\n  }\n\n  public void addToResult(User elem) {\n    if (this.result == null) {\n      this.result = new java.util.ArrayList<User>();\n    }\n    this.result.add(elem);\n  }\n\n  public java.util.List<User> getResult() {\n    return this.result;\n  }\n\n  public UserPage setResult(java.util.List<User> result) {\n    this.result = result;\n    return this;\n  }\n\n  public void unsetResult() {\n    this.result = null;\n  }\n\n  /** Returns true if field result is set (has been assigned a value) and false otherwise */\n  public boolean isSetResult() {\n    return this.result != null;\n  }\n\n  public void setResultIsSet(boolean value) {\n    if (!value) {\n      this.result = null;\n    }\n  }\n\n  public void setFieldValue(_Fields field, java.lang.Object value) {\n    switch (field) {\n    case PAGE_NO:\n      if (value == null) {\n        unsetPageNo();\n      } else {\n        setPageNo((java.lang.Integer)value);\n      }\n      break;\n\n    case TOTAL:\n      if (value == null) {\n        unsetTotal();\n      } else {\n        setTotal((java.lang.Integer)value);\n      }\n      break;\n\n    case RESULT:\n      if (value == null) {\n        unsetResult();\n      } else {\n        setResult((java.util.List<User>)value);\n      }\n      break;\n\n    }\n  }\n\n  public java.lang.Object getFieldValue(_Fields field) {\n    switch (field) {\n    case PAGE_NO:\n      return getPageNo();\n\n    case TOTAL:\n      return getTotal();\n\n    case RESULT:\n      return getResult();\n\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n  public boolean isSet(_Fields field) {\n    if (field == null) {\n      throw new java.lang.IllegalArgumentException();\n    }\n\n    switch (field) {\n    case PAGE_NO:\n      return isSetPageNo();\n    case TOTAL:\n      return isSetTotal();\n    case RESULT:\n      return isSetResult();\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  @Override\n  public boolean equals(java.lang.Object that) {\n    if (that == null)\n      return false;\n    if (that instanceof UserPage)\n      return this.equals((UserPage)that);\n    return false;\n  }\n\n  public boolean equals(UserPage that) {\n    if (that == null)\n      return false;\n    if (this == that)\n      return true;\n\n    boolean this_present_pageNo = true;\n    boolean that_present_pageNo = true;\n    if (this_present_pageNo || that_present_pageNo) {\n      if (!(this_present_pageNo && that_present_pageNo))\n        return false;\n      if (this.pageNo != that.pageNo)\n        return false;\n    }\n\n    boolean this_present_total = true;\n    boolean that_present_total = true;\n    if (this_present_total || that_present_total) {\n      if (!(this_present_total && that_present_total))\n        return false;\n      if (this.total != that.total)\n        return false;\n    }\n\n    boolean this_present_result = true && this.isSetResult();\n    boolean that_present_result = true && that.isSetResult();\n    if (this_present_result || that_present_result) {\n      if (!(this_present_result && that_present_result))\n        return false;\n      if (!this.result.equals(that.result))\n        return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    int hashCode = 1;\n\n    hashCode = hashCode * 8191 + pageNo;\n\n    hashCode = hashCode * 8191 + total;\n\n    hashCode = hashCode * 8191 + ((isSetResult()) ? 131071 : 524287);\n    if (isSetResult())\n      hashCode = hashCode * 8191 + result.hashCode();\n\n    return hashCode;\n  }\n\n  @Override\n  public int compareTo(UserPage other) {\n    if (!getClass().equals(other.getClass())) {\n      return getClass().getName().compareTo(other.getClass().getName());\n    }\n\n    int lastComparison = 0;\n\n    lastComparison = java.lang.Boolean.valueOf(isSetPageNo()).compareTo(other.isSetPageNo());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetPageNo()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.pageNo, other.pageNo);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetTotal()).compareTo(other.isSetTotal());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetTotal()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.total, other.total);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetResult()).compareTo(other.isSetResult());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetResult()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.result, other.result);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    return 0;\n  }\n\n  public _Fields fieldForId(int fieldId) {\n    return _Fields.findByThriftId(fieldId);\n  }\n\n  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n    scheme(iprot).read(iprot, this);\n  }\n\n  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n    scheme(oprot).write(oprot, this);\n  }\n\n  @Override\n  public java.lang.String toString() {\n    java.lang.StringBuilder sb = new java.lang.StringBuilder(\"UserPage(\");\n    boolean first = true;\n\n    sb.append(\"pageNo:\");\n    sb.append(this.pageNo);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"total:\");\n    sb.append(this.total);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"result:\");\n    if (this.result == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.result);\n    }\n    first = false;\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  public void validate() throws org.apache.thrift.TException {\n    // check for required fields\n    // check for sub-struct validity\n  }\n\n  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n    try {\n      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n    try {\n      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n      __isset_bitfield = 0;\n      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private static class UserPageStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserPageStandardScheme getScheme() {\n      return new UserPageStandardScheme();\n    }\n  }\n\n  private static class UserPageStandardScheme extends org.apache.thrift.scheme.StandardScheme<UserPage> {\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TField schemeField;\n      iprot.readStructBegin();\n      while (true)\n      {\n        schemeField = iprot.readFieldBegin();\n        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n          break;\n        }\n        switch (schemeField.id) {\n          case 1: // PAGE_NO\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.pageNo = iprot.readI32();\n              struct.setPageNoIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 2: // TOTAL\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.total = iprot.readI32();\n              struct.setTotalIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 3: // RESULT\n            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {\n              {\n                org.apache.thrift.protocol.TList _list8 = iprot.readListBegin();\n                struct.result = new java.util.ArrayList<User>(_list8.size);\n                User _elem9;\n                for (int _i10 = 0; _i10 < _list8.size; ++_i10)\n                {\n                  _elem9 = new User();\n                  _elem9.read(iprot);\n                  struct.result.add(_elem9);\n                }\n                iprot.readListEnd();\n              }\n              struct.setResultIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          default:\n            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n        }\n        iprot.readFieldEnd();\n      }\n      iprot.readStructEnd();\n\n      // check for required fields of primitive type, which can't be checked in the validate method\n      struct.validate();\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot, UserPage struct) throws org.apache.thrift.TException {\n      struct.validate();\n\n      oprot.writeStructBegin(STRUCT_DESC);\n      oprot.writeFieldBegin(PAGE_NO_FIELD_DESC);\n      oprot.writeI32(struct.pageNo);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(TOTAL_FIELD_DESC);\n      oprot.writeI32(struct.total);\n      oprot.writeFieldEnd();\n      if (struct.result != null) {\n        oprot.writeFieldBegin(RESULT_FIELD_DESC);\n        {\n          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.result.size()));\n          for (User _iter11 : struct.result)\n          {\n            _iter11.write(oprot);\n          }\n          oprot.writeListEnd();\n        }\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldStop();\n      oprot.writeStructEnd();\n    }\n\n  }\n\n  private static class UserPageTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserPageTupleScheme getScheme() {\n      return new UserPageTupleScheme();\n    }\n  }\n\n  private static class UserPageTupleScheme extends org.apache.thrift.scheme.TupleScheme<UserPage> {\n\n    @Override\n    public void write(org.apache.thrift.protocol.TProtocol prot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet optionals = new java.util.BitSet();\n      if (struct.isSetPageNo()) {\n        optionals.set(0);\n      }\n      if (struct.isSetTotal()) {\n        optionals.set(1);\n      }\n      if (struct.isSetResult()) {\n        optionals.set(2);\n      }\n      oprot.writeBitSet(optionals, 3);\n      if (struct.isSetPageNo()) {\n        oprot.writeI32(struct.pageNo);\n      }\n      if (struct.isSetTotal()) {\n        oprot.writeI32(struct.total);\n      }\n      if (struct.isSetResult()) {\n        {\n          oprot.writeI32(struct.result.size());\n          for (User _iter12 : struct.result)\n          {\n            _iter12.write(oprot);\n          }\n        }\n      }\n    }\n\n    @Override\n    public void read(org.apache.thrift.protocol.TProtocol prot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet incoming = iprot.readBitSet(3);\n      if (incoming.get(0)) {\n        struct.pageNo = iprot.readI32();\n        struct.setPageNoIsSet(true);\n      }\n      if (incoming.get(1)) {\n        struct.total = iprot.readI32();\n        struct.setTotalIsSet(true);\n      }\n      if (incoming.get(2)) {\n        {\n          org.apache.thrift.protocol.TList _list13 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());\n          struct.result = new java.util.ArrayList<User>(_list13.size);\n          User _elem14;\n          for (int _i15 = 0; _i15 < _list13.size; ++_i15)\n          {\n            _elem14 = new User();\n            _elem14.read(iprot);\n            struct.result.add(_elem14);\n          }\n        }\n        struct.setResultIsSet(true);\n      }\n    }\n  }\n\n  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n  }\n}\n\n"
  },
  {
    "path": "thrift-client/src/main/java/benchmark/rpc/thrift/UserService.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class UserService {\n\n  public interface Iface {\n\n    public boolean userExist(java.lang.String email) throws org.apache.thrift.TException;\n\n    public boolean createUser(User user) throws org.apache.thrift.TException;\n\n    public User getUser(long id) throws org.apache.thrift.TException;\n\n    public UserPage listUser(int pageNo) throws org.apache.thrift.TException;\n\n  }\n\n  public interface AsyncIface {\n\n    public void userExist(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;\n\n    public void createUser(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;\n\n    public void getUser(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException;\n\n    public void listUser(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException;\n\n  }\n\n  public static class Client extends TServiceClientNoPrint implements Iface {\n    public static class Factory implements org.apache.thrift.TServiceClientFactory<Client> {\n      public Factory() {}\n      public Client getClient(org.apache.thrift.protocol.TProtocol prot) {\n        return new Client(prot);\n      }\n      public Client getClient(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n        return new Client(iprot, oprot);\n      }\n    }\n\n    public Client(org.apache.thrift.protocol.TProtocol prot)\n    {\n      super(prot, prot);\n    }\n\n    public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n      super(iprot, oprot);\n    }\n\n    public boolean userExist(java.lang.String email) throws org.apache.thrift.TException\n    {\n      send_userExist(email);\n      return recv_userExist();\n    }\n\n    public void send_userExist(java.lang.String email) throws org.apache.thrift.TException\n    {\n      userExist_args args = new userExist_args();\n      args.setEmail(email);\n      sendBase(\"userExist\", args);\n    }\n\n    public boolean recv_userExist() throws org.apache.thrift.TException\n    {\n      userExist_result result = new userExist_result();\n      receiveBase(result, \"userExist\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"userExist failed: unknown result\");\n    }\n\n    public boolean createUser(User user) throws org.apache.thrift.TException\n    {\n      send_createUser(user);\n      return recv_createUser();\n    }\n\n    public void send_createUser(User user) throws org.apache.thrift.TException\n    {\n      createUser_args args = new createUser_args();\n      args.setUser(user);\n      sendBase(\"createUser\", args);\n    }\n\n    public boolean recv_createUser() throws org.apache.thrift.TException\n    {\n      createUser_result result = new createUser_result();\n      receiveBase(result, \"createUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"createUser failed: unknown result\");\n    }\n\n    public User getUser(long id) throws org.apache.thrift.TException\n    {\n      send_getUser(id);\n      return recv_getUser();\n    }\n\n    public void send_getUser(long id) throws org.apache.thrift.TException\n    {\n      getUser_args args = new getUser_args();\n      args.setId(id);\n      sendBase(\"getUser\", args);\n    }\n\n    public User recv_getUser() throws org.apache.thrift.TException\n    {\n      getUser_result result = new getUser_result();\n      receiveBase(result, \"getUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"getUser failed: unknown result\");\n    }\n\n    public UserPage listUser(int pageNo) throws org.apache.thrift.TException\n    {\n      send_listUser(pageNo);\n      return recv_listUser();\n    }\n\n    public void send_listUser(int pageNo) throws org.apache.thrift.TException\n    {\n      listUser_args args = new listUser_args();\n      args.setPageNo(pageNo);\n      sendBase(\"listUser\", args);\n    }\n\n    public UserPage recv_listUser() throws org.apache.thrift.TException\n    {\n      listUser_result result = new listUser_result();\n      receiveBase(result, \"listUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"listUser failed: unknown result\");\n    }\n\n  }\n  public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface {\n    public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {\n      private org.apache.thrift.async.TAsyncClientManager clientManager;\n      private org.apache.thrift.protocol.TProtocolFactory protocolFactory;\n      public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) {\n        this.clientManager = clientManager;\n        this.protocolFactory = protocolFactory;\n      }\n      public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) {\n        return new AsyncClient(protocolFactory, clientManager, transport);\n      }\n    }\n\n    public AsyncClient(org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.transport.TNonblockingTransport transport) {\n      super(protocolFactory, clientManager, transport);\n    }\n\n    public void userExist(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      userExist_call method_call = new userExist_call(email, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class userExist_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {\n      private java.lang.String email;\n      public userExist_call(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.email = email;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"userExist\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        userExist_args args = new userExist_args();\n        args.setEmail(email);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public java.lang.Boolean getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_userExist();\n      }\n    }\n\n    public void createUser(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      createUser_call method_call = new createUser_call(user, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class createUser_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {\n      private User user;\n      public createUser_call(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.user = user;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"createUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        createUser_args args = new createUser_args();\n        args.setUser(user);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public java.lang.Boolean getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_createUser();\n      }\n    }\n\n    public void getUser(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      getUser_call method_call = new getUser_call(id, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class getUser_call extends org.apache.thrift.async.TAsyncMethodCall<User> {\n      private long id;\n      public getUser_call(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.id = id;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"getUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        getUser_args args = new getUser_args();\n        args.setId(id);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public User getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_getUser();\n      }\n    }\n\n    public void listUser(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      listUser_call method_call = new listUser_call(pageNo, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class listUser_call extends org.apache.thrift.async.TAsyncMethodCall<UserPage> {\n      private int pageNo;\n      public listUser_call(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.pageNo = pageNo;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"listUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        listUser_args args = new listUser_args();\n        args.setPageNo(pageNo);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public UserPage getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_listUser();\n      }\n    }\n\n  }\n\n  public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor {\n    private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(Processor.class.getName());\n    public Processor(I iface) {\n      super(iface, getProcessMap(new java.util.HashMap<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>>()));\n    }\n\n    protected Processor(I iface, java.util.Map<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> processMap) {\n      super(iface, getProcessMap(processMap));\n    }\n\n    private static <I extends Iface> java.util.Map<java.lang.String,  org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> getProcessMap(java.util.Map<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) {\n      processMap.put(\"userExist\", new userExist());\n      processMap.put(\"createUser\", new createUser());\n      processMap.put(\"getUser\", new getUser());\n      processMap.put(\"listUser\", new listUser());\n      return processMap;\n    }\n\n    public static class userExist<I extends Iface> extends org.apache.thrift.ProcessFunction<I, userExist_args> {\n      public userExist() {\n        super(\"userExist\");\n      }\n\n      public userExist_args getEmptyArgsInstance() {\n        return new userExist_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public userExist_result getResult(I iface, userExist_args args) throws org.apache.thrift.TException {\n        userExist_result result = new userExist_result();\n        result.success = iface.userExist(args.email);\n        result.setSuccessIsSet(true);\n        return result;\n      }\n    }\n\n    public static class createUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, createUser_args> {\n      public createUser() {\n        super(\"createUser\");\n      }\n\n      public createUser_args getEmptyArgsInstance() {\n        return new createUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public createUser_result getResult(I iface, createUser_args args) throws org.apache.thrift.TException {\n        createUser_result result = new createUser_result();\n        result.success = iface.createUser(args.user);\n        result.setSuccessIsSet(true);\n        return result;\n      }\n    }\n\n    public static class getUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, getUser_args> {\n      public getUser() {\n        super(\"getUser\");\n      }\n\n      public getUser_args getEmptyArgsInstance() {\n        return new getUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public getUser_result getResult(I iface, getUser_args args) throws org.apache.thrift.TException {\n        getUser_result result = new getUser_result();\n        result.success = iface.getUser(args.id);\n        return result;\n      }\n    }\n\n    public static class listUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, listUser_args> {\n      public listUser() {\n        super(\"listUser\");\n      }\n\n      public listUser_args getEmptyArgsInstance() {\n        return new listUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public listUser_result getResult(I iface, listUser_args args) throws org.apache.thrift.TException {\n        listUser_result result = new listUser_result();\n        result.success = iface.listUser(args.pageNo);\n        return result;\n      }\n    }\n\n  }\n\n  public static class AsyncProcessor<I extends AsyncIface> extends org.apache.thrift.TBaseAsyncProcessor<I> {\n    private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(AsyncProcessor.class.getName());\n    public AsyncProcessor(I iface) {\n      super(iface, getProcessMap(new java.util.HashMap<java.lang.String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>>()));\n    }\n\n    protected AsyncProcessor(I iface, java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {\n      super(iface, getProcessMap(processMap));\n    }\n\n    private static <I extends AsyncIface> java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase,?>> getProcessMap(java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {\n      processMap.put(\"userExist\", new userExist());\n      processMap.put(\"createUser\", new createUser());\n      processMap.put(\"getUser\", new getUser());\n      processMap.put(\"listUser\", new listUser());\n      return processMap;\n    }\n\n    public static class userExist<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, userExist_args, java.lang.Boolean> {\n      public userExist() {\n        super(\"userExist\");\n      }\n\n      public userExist_args getEmptyArgsInstance() {\n        return new userExist_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean>() { \n          public void onComplete(java.lang.Boolean o) {\n            userExist_result result = new userExist_result();\n            result.success = o;\n            result.setSuccessIsSet(true);\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            userExist_result result = new userExist_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, userExist_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n        iface.userExist(args.email,resultHandler);\n      }\n    }\n\n    public static class createUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, createUser_args, java.lang.Boolean> {\n      public createUser() {\n        super(\"createUser\");\n      }\n\n      public createUser_args getEmptyArgsInstance() {\n        return new createUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean>() { \n          public void onComplete(java.lang.Boolean o) {\n            createUser_result result = new createUser_result();\n            result.success = o;\n            result.setSuccessIsSet(true);\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            createUser_result result = new createUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, createUser_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n        iface.createUser(args.user,resultHandler);\n      }\n    }\n\n    public static class getUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, getUser_args, User> {\n      public getUser() {\n        super(\"getUser\");\n      }\n\n      public getUser_args getEmptyArgsInstance() {\n        return new getUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<User> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<User>() { \n          public void onComplete(User o) {\n            getUser_result result = new getUser_result();\n            result.success = o;\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            getUser_result result = new getUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, getUser_args args, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException {\n        iface.getUser(args.id,resultHandler);\n      }\n    }\n\n    public static class listUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, listUser_args, UserPage> {\n      public listUser() {\n        super(\"listUser\");\n      }\n\n      public listUser_args getEmptyArgsInstance() {\n        return new listUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<UserPage> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<UserPage>() { \n          public void onComplete(UserPage o) {\n            listUser_result result = new listUser_result();\n            result.success = o;\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            listUser_result result = new listUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, listUser_args args, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException {\n        iface.listUser(args.pageNo,resultHandler);\n      }\n    }\n\n  }\n\n  public static class userExist_args implements org.apache.thrift.TBase<userExist_args, userExist_args._Fields>, java.io.Serializable, Cloneable, Comparable<userExist_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"userExist_args\");\n\n    private static final org.apache.thrift.protocol.TField EMAIL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"email\", org.apache.thrift.protocol.TType.STRING, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new userExist_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new userExist_argsTupleSchemeFactory();\n\n    public java.lang.String email; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      EMAIL((short)1, \"email\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // EMAIL\n            return EMAIL;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.EMAIL, new org.apache.thrift.meta_data.FieldMetaData(\"email\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(userExist_args.class, metaDataMap);\n    }\n\n    public userExist_args() {\n    }\n\n    public userExist_args(\n      java.lang.String email)\n    {\n      this();\n      this.email = email;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public userExist_args(userExist_args other) {\n      if (other.isSetEmail()) {\n        this.email = other.email;\n      }\n    }\n\n    public userExist_args deepCopy() {\n      return new userExist_args(this);\n    }\n\n    @Override\n    public void clear() {\n      this.email = null;\n    }\n\n    public java.lang.String getEmail() {\n      return this.email;\n    }\n\n    public userExist_args setEmail(java.lang.String email) {\n      this.email = email;\n      return this;\n    }\n\n    public void unsetEmail() {\n      this.email = null;\n    }\n\n    /** Returns true if field email is set (has been assigned a value) and false otherwise */\n    public boolean isSetEmail() {\n      return this.email != null;\n    }\n\n    public void setEmailIsSet(boolean value) {\n      if (!value) {\n        this.email = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case EMAIL:\n        if (value == null) {\n          unsetEmail();\n        } else {\n          setEmail((java.lang.String)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case EMAIL:\n        return getEmail();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case EMAIL:\n        return isSetEmail();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof userExist_args)\n        return this.equals((userExist_args)that);\n      return false;\n    }\n\n    public boolean equals(userExist_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_email = true && this.isSetEmail();\n      boolean that_present_email = true && that.isSetEmail();\n      if (this_present_email || that_present_email) {\n        if (!(this_present_email && that_present_email))\n          return false;\n        if (!this.email.equals(that.email))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetEmail()) ? 131071 : 524287);\n      if (isSetEmail())\n        hashCode = hashCode * 8191 + email.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(userExist_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetEmail()).compareTo(other.isSetEmail());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetEmail()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.email, other.email);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"userExist_args(\");\n      boolean first = true;\n\n      sb.append(\"email:\");\n      if (this.email == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.email);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class userExist_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_argsStandardScheme getScheme() {\n        return new userExist_argsStandardScheme();\n      }\n    }\n\n    private static class userExist_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<userExist_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // EMAIL\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n                struct.email = iprot.readString();\n                struct.setEmailIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, userExist_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.email != null) {\n          oprot.writeFieldBegin(EMAIL_FIELD_DESC);\n          oprot.writeString(struct.email);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class userExist_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_argsTupleScheme getScheme() {\n        return new userExist_argsTupleScheme();\n      }\n    }\n\n    private static class userExist_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<userExist_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetEmail()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetEmail()) {\n          oprot.writeString(struct.email);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.email = iprot.readString();\n          struct.setEmailIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class userExist_result implements org.apache.thrift.TBase<userExist_result, userExist_result._Fields>, java.io.Serializable, Cloneable, Comparable<userExist_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"userExist_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.BOOL, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new userExist_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new userExist_resultTupleSchemeFactory();\n\n    public boolean success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __SUCCESS_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(userExist_result.class, metaDataMap);\n    }\n\n    public userExist_result() {\n    }\n\n    public userExist_result(\n      boolean success)\n    {\n      this();\n      this.success = success;\n      setSuccessIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public userExist_result(userExist_result other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.success = other.success;\n    }\n\n    public userExist_result deepCopy() {\n      return new userExist_result(this);\n    }\n\n    @Override\n    public void clear() {\n      setSuccessIsSet(false);\n      this.success = false;\n    }\n\n    public boolean isSuccess() {\n      return this.success;\n    }\n\n    public userExist_result setSuccess(boolean success) {\n      this.success = success;\n      setSuccessIsSet(true);\n      return this;\n    }\n\n    public void unsetSuccess() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((java.lang.Boolean)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return isSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof userExist_result)\n        return this.equals((userExist_result)that);\n      return false;\n    }\n\n    public boolean equals(userExist_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true;\n      boolean that_present_success = true;\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (this.success != that.success)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((success) ? 131071 : 524287);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(userExist_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"userExist_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      sb.append(this.success);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class userExist_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_resultStandardScheme getScheme() {\n        return new userExist_resultStandardScheme();\n      }\n    }\n\n    private static class userExist_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<userExist_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {\n                struct.success = iprot.readBool();\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, userExist_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.isSetSuccess()) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          oprot.writeBool(struct.success);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class userExist_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_resultTupleScheme getScheme() {\n        return new userExist_resultTupleScheme();\n      }\n    }\n\n    private static class userExist_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<userExist_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          oprot.writeBool(struct.success);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = iprot.readBool();\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class createUser_args implements org.apache.thrift.TBase<createUser_args, createUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<createUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"createUser_args\");\n\n    private static final org.apache.thrift.protocol.TField USER_FIELD_DESC = new org.apache.thrift.protocol.TField(\"user\", org.apache.thrift.protocol.TType.STRUCT, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new createUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new createUser_argsTupleSchemeFactory();\n\n    public User user; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      USER((short)1, \"user\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // USER\n            return USER;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.USER, new org.apache.thrift.meta_data.FieldMetaData(\"user\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(createUser_args.class, metaDataMap);\n    }\n\n    public createUser_args() {\n    }\n\n    public createUser_args(\n      User user)\n    {\n      this();\n      this.user = user;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public createUser_args(createUser_args other) {\n      if (other.isSetUser()) {\n        this.user = new User(other.user);\n      }\n    }\n\n    public createUser_args deepCopy() {\n      return new createUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      this.user = null;\n    }\n\n    public User getUser() {\n      return this.user;\n    }\n\n    public createUser_args setUser(User user) {\n      this.user = user;\n      return this;\n    }\n\n    public void unsetUser() {\n      this.user = null;\n    }\n\n    /** Returns true if field user is set (has been assigned a value) and false otherwise */\n    public boolean isSetUser() {\n      return this.user != null;\n    }\n\n    public void setUserIsSet(boolean value) {\n      if (!value) {\n        this.user = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case USER:\n        if (value == null) {\n          unsetUser();\n        } else {\n          setUser((User)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case USER:\n        return getUser();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case USER:\n        return isSetUser();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof createUser_args)\n        return this.equals((createUser_args)that);\n      return false;\n    }\n\n    public boolean equals(createUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_user = true && this.isSetUser();\n      boolean that_present_user = true && that.isSetUser();\n      if (this_present_user || that_present_user) {\n        if (!(this_present_user && that_present_user))\n          return false;\n        if (!this.user.equals(that.user))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetUser()) ? 131071 : 524287);\n      if (isSetUser())\n        hashCode = hashCode * 8191 + user.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(createUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetUser()).compareTo(other.isSetUser());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetUser()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.user, other.user);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"createUser_args(\");\n      boolean first = true;\n\n      sb.append(\"user:\");\n      if (this.user == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.user);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (user != null) {\n        user.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class createUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_argsStandardScheme getScheme() {\n        return new createUser_argsStandardScheme();\n      }\n    }\n\n    private static class createUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<createUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // USER\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.user = new User();\n                struct.user.read(iprot);\n                struct.setUserIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, createUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.user != null) {\n          oprot.writeFieldBegin(USER_FIELD_DESC);\n          struct.user.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class createUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_argsTupleScheme getScheme() {\n        return new createUser_argsTupleScheme();\n      }\n    }\n\n    private static class createUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<createUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetUser()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetUser()) {\n          struct.user.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.user = new User();\n          struct.user.read(iprot);\n          struct.setUserIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class createUser_result implements org.apache.thrift.TBase<createUser_result, createUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<createUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"createUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.BOOL, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new createUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new createUser_resultTupleSchemeFactory();\n\n    public boolean success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __SUCCESS_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(createUser_result.class, metaDataMap);\n    }\n\n    public createUser_result() {\n    }\n\n    public createUser_result(\n      boolean success)\n    {\n      this();\n      this.success = success;\n      setSuccessIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public createUser_result(createUser_result other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.success = other.success;\n    }\n\n    public createUser_result deepCopy() {\n      return new createUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      setSuccessIsSet(false);\n      this.success = false;\n    }\n\n    public boolean isSuccess() {\n      return this.success;\n    }\n\n    public createUser_result setSuccess(boolean success) {\n      this.success = success;\n      setSuccessIsSet(true);\n      return this;\n    }\n\n    public void unsetSuccess() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((java.lang.Boolean)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return isSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof createUser_result)\n        return this.equals((createUser_result)that);\n      return false;\n    }\n\n    public boolean equals(createUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true;\n      boolean that_present_success = true;\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (this.success != that.success)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((success) ? 131071 : 524287);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(createUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"createUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      sb.append(this.success);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class createUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_resultStandardScheme getScheme() {\n        return new createUser_resultStandardScheme();\n      }\n    }\n\n    private static class createUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<createUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {\n                struct.success = iprot.readBool();\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, createUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.isSetSuccess()) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          oprot.writeBool(struct.success);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class createUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_resultTupleScheme getScheme() {\n        return new createUser_resultTupleScheme();\n      }\n    }\n\n    private static class createUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<createUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          oprot.writeBool(struct.success);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = iprot.readBool();\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class getUser_args implements org.apache.thrift.TBase<getUser_args, getUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<getUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"getUser_args\");\n\n    private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField(\"id\", org.apache.thrift.protocol.TType.I64, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getUser_argsTupleSchemeFactory();\n\n    public long id; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      ID((short)1, \"id\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // ID\n            return ID;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __ID_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData(\"id\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getUser_args.class, metaDataMap);\n    }\n\n    public getUser_args() {\n    }\n\n    public getUser_args(\n      long id)\n    {\n      this();\n      this.id = id;\n      setIdIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public getUser_args(getUser_args other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.id = other.id;\n    }\n\n    public getUser_args deepCopy() {\n      return new getUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      setIdIsSet(false);\n      this.id = 0;\n    }\n\n    public long getId() {\n      return this.id;\n    }\n\n    public getUser_args setId(long id) {\n      this.id = id;\n      setIdIsSet(true);\n      return this;\n    }\n\n    public void unsetId() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ID_ISSET_ID);\n    }\n\n    /** Returns true if field id is set (has been assigned a value) and false otherwise */\n    public boolean isSetId() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ID_ISSET_ID);\n    }\n\n    public void setIdIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ID_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case ID:\n        if (value == null) {\n          unsetId();\n        } else {\n          setId((java.lang.Long)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case ID:\n        return getId();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case ID:\n        return isSetId();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof getUser_args)\n        return this.equals((getUser_args)that);\n      return false;\n    }\n\n    public boolean equals(getUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_id = true;\n      boolean that_present_id = true;\n      if (this_present_id || that_present_id) {\n        if (!(this_present_id && that_present_id))\n          return false;\n        if (this.id != that.id)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(id);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(getUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetId()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"getUser_args(\");\n      boolean first = true;\n\n      sb.append(\"id:\");\n      sb.append(this.id);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class getUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_argsStandardScheme getScheme() {\n        return new getUser_argsStandardScheme();\n      }\n    }\n\n    private static class getUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<getUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // ID\n              if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n                struct.id = iprot.readI64();\n                struct.setIdIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, getUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        oprot.writeFieldBegin(ID_FIELD_DESC);\n        oprot.writeI64(struct.id);\n        oprot.writeFieldEnd();\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class getUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_argsTupleScheme getScheme() {\n        return new getUser_argsTupleScheme();\n      }\n    }\n\n    private static class getUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<getUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetId()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetId()) {\n          oprot.writeI64(struct.id);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.id = iprot.readI64();\n          struct.setIdIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class getUser_result implements org.apache.thrift.TBase<getUser_result, getUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<getUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"getUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.STRUCT, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getUser_resultTupleSchemeFactory();\n\n    public User success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getUser_result.class, metaDataMap);\n    }\n\n    public getUser_result() {\n    }\n\n    public getUser_result(\n      User success)\n    {\n      this();\n      this.success = success;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public getUser_result(getUser_result other) {\n      if (other.isSetSuccess()) {\n        this.success = new User(other.success);\n      }\n    }\n\n    public getUser_result deepCopy() {\n      return new getUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      this.success = null;\n    }\n\n    public User getSuccess() {\n      return this.success;\n    }\n\n    public getUser_result setSuccess(User success) {\n      this.success = success;\n      return this;\n    }\n\n    public void unsetSuccess() {\n      this.success = null;\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return this.success != null;\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      if (!value) {\n        this.success = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((User)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return getSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof getUser_result)\n        return this.equals((getUser_result)that);\n      return false;\n    }\n\n    public boolean equals(getUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true && this.isSetSuccess();\n      boolean that_present_success = true && that.isSetSuccess();\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (!this.success.equals(that.success))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287);\n      if (isSetSuccess())\n        hashCode = hashCode * 8191 + success.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(getUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"getUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      if (this.success == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.success);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (success != null) {\n        success.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class getUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_resultStandardScheme getScheme() {\n        return new getUser_resultStandardScheme();\n      }\n    }\n\n    private static class getUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<getUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.success = new User();\n                struct.success.read(iprot);\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, getUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.success != null) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          struct.success.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class getUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_resultTupleScheme getScheme() {\n        return new getUser_resultTupleScheme();\n      }\n    }\n\n    private static class getUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<getUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          struct.success.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = new User();\n          struct.success.read(iprot);\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class listUser_args implements org.apache.thrift.TBase<listUser_args, listUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<listUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"listUser_args\");\n\n    private static final org.apache.thrift.protocol.TField PAGE_NO_FIELD_DESC = new org.apache.thrift.protocol.TField(\"pageNo\", org.apache.thrift.protocol.TType.I32, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new listUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new listUser_argsTupleSchemeFactory();\n\n    public int pageNo; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      PAGE_NO((short)1, \"pageNo\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // PAGE_NO\n            return PAGE_NO;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __PAGENO_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.PAGE_NO, new org.apache.thrift.meta_data.FieldMetaData(\"pageNo\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(listUser_args.class, metaDataMap);\n    }\n\n    public listUser_args() {\n    }\n\n    public listUser_args(\n      int pageNo)\n    {\n      this();\n      this.pageNo = pageNo;\n      setPageNoIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public listUser_args(listUser_args other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.pageNo = other.pageNo;\n    }\n\n    public listUser_args deepCopy() {\n      return new listUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      setPageNoIsSet(false);\n      this.pageNo = 0;\n    }\n\n    public int getPageNo() {\n      return this.pageNo;\n    }\n\n    public listUser_args setPageNo(int pageNo) {\n      this.pageNo = pageNo;\n      setPageNoIsSet(true);\n      return this;\n    }\n\n    public void unsetPageNo() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PAGENO_ISSET_ID);\n    }\n\n    /** Returns true if field pageNo is set (has been assigned a value) and false otherwise */\n    public boolean isSetPageNo() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PAGENO_ISSET_ID);\n    }\n\n    public void setPageNoIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PAGENO_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case PAGE_NO:\n        if (value == null) {\n          unsetPageNo();\n        } else {\n          setPageNo((java.lang.Integer)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case PAGE_NO:\n        return getPageNo();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case PAGE_NO:\n        return isSetPageNo();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof listUser_args)\n        return this.equals((listUser_args)that);\n      return false;\n    }\n\n    public boolean equals(listUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_pageNo = true;\n      boolean that_present_pageNo = true;\n      if (this_present_pageNo || that_present_pageNo) {\n        if (!(this_present_pageNo && that_present_pageNo))\n          return false;\n        if (this.pageNo != that.pageNo)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + pageNo;\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(listUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetPageNo()).compareTo(other.isSetPageNo());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetPageNo()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.pageNo, other.pageNo);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"listUser_args(\");\n      boolean first = true;\n\n      sb.append(\"pageNo:\");\n      sb.append(this.pageNo);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class listUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_argsStandardScheme getScheme() {\n        return new listUser_argsStandardScheme();\n      }\n    }\n\n    private static class listUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<listUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // PAGE_NO\n              if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n                struct.pageNo = iprot.readI32();\n                struct.setPageNoIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, listUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        oprot.writeFieldBegin(PAGE_NO_FIELD_DESC);\n        oprot.writeI32(struct.pageNo);\n        oprot.writeFieldEnd();\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class listUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_argsTupleScheme getScheme() {\n        return new listUser_argsTupleScheme();\n      }\n    }\n\n    private static class listUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<listUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetPageNo()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetPageNo()) {\n          oprot.writeI32(struct.pageNo);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.pageNo = iprot.readI32();\n          struct.setPageNoIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class listUser_result implements org.apache.thrift.TBase<listUser_result, listUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<listUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"listUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.STRUCT, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new listUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new listUser_resultTupleSchemeFactory();\n\n    public UserPage success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, UserPage.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(listUser_result.class, metaDataMap);\n    }\n\n    public listUser_result() {\n    }\n\n    public listUser_result(\n      UserPage success)\n    {\n      this();\n      this.success = success;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public listUser_result(listUser_result other) {\n      if (other.isSetSuccess()) {\n        this.success = new UserPage(other.success);\n      }\n    }\n\n    public listUser_result deepCopy() {\n      return new listUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      this.success = null;\n    }\n\n    public UserPage getSuccess() {\n      return this.success;\n    }\n\n    public listUser_result setSuccess(UserPage success) {\n      this.success = success;\n      return this;\n    }\n\n    public void unsetSuccess() {\n      this.success = null;\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return this.success != null;\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      if (!value) {\n        this.success = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((UserPage)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return getSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof listUser_result)\n        return this.equals((listUser_result)that);\n      return false;\n    }\n\n    public boolean equals(listUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true && this.isSetSuccess();\n      boolean that_present_success = true && that.isSetSuccess();\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (!this.success.equals(that.success))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287);\n      if (isSetSuccess())\n        hashCode = hashCode * 8191 + success.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(listUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"listUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      if (this.success == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.success);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (success != null) {\n        success.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class listUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_resultStandardScheme getScheme() {\n        return new listUser_resultStandardScheme();\n      }\n    }\n\n    private static class listUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<listUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.success = new UserPage();\n                struct.success.read(iprot);\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, listUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.success != null) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          struct.success.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class listUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_resultTupleScheme getScheme() {\n        return new listUser_resultTupleScheme();\n      }\n    }\n\n    private static class listUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<listUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          struct.success.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = new UserPage();\n          struct.success.read(iprot);\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n}\n"
  },
  {
    "path": "thrift-client/src/main/java/benchmark/rpc/thrift/UserServiceThriftClientImpl.java",
    "content": "package benchmark.rpc.thrift;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.pool.LockObjectPool;\nimport benchmark.service.UserServiceServerImpl;\n\npublic class UserServiceThriftClientImpl implements benchmark.service.UserService, Closeable {\n\n\tprivate final String host = \"benchmark-server\";\n\tprivate final int port = 8080;\n\n\tprivate final LockObjectPool<ThriftUserServiceClient> clientPool = //\n\t\t\tnew LockObjectPool<>(32, () -> new ThriftUserServiceClient(host, port));\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\tclientPool.close();\n\t}\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\tThriftUserServiceClient thriftUserServiceClient = clientPool.borrow();\n\t\ttry {\n\t\t\treturn thriftUserServiceClient.client.userExist(email);\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t} finally {\n\t\t\tclientPool.release(thriftUserServiceClient);\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean createUser(User user) {\n\t\tbenchmark.rpc.thrift.User thriftUser = Converter.toThrift(user);\n\n\t\tThriftUserServiceClient thriftUserServiceClient = clientPool.borrow();\n\t\ttry {\n\t\t\treturn thriftUserServiceClient.client.createUser(thriftUser);\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t} finally {\n\t\t\tclientPool.release(thriftUserServiceClient);\n\t\t}\n\t}\n\n\t@Override\n\tpublic User getUser(long id) {\n\n\t\tThriftUserServiceClient thriftUserServiceClient = clientPool.borrow();\n\t\ttry {\n\n\t\t\tbenchmark.rpc.thrift.User thriftUser = thriftUserServiceClient.client.getUser(id);\n\t\t\tUser user = Converter.toRaw(thriftUser);\n\n\t\t\treturn user;\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t} finally {\n\t\t\tclientPool.release(thriftUserServiceClient);\n\t\t}\n\t}\n\n\t@Override\n\tpublic Page<User> listUser(int pageNo) {\n\n\t\tThriftUserServiceClient thriftUserServiceClient = clientPool.borrow();\n\t\ttry {\n\n\t\t\tUserPage userPage = thriftUserServiceClient.client.listUser(pageNo);\n\t\t\tPage<User> page = new Page<>();\n\n\t\t\tpage.setPageNo(userPage.getPageNo());\n\t\t\tpage.setTotal(userPage.getTotal());\n\n\t\t\tList<User> userList = new ArrayList<>(userPage.getResult().size());\n\n\t\t\tfor (benchmark.rpc.thrift.User thriftUser : userPage.getResult()) {\n\t\t\t\tUser user = Converter.toRaw(thriftUser);\n\n\t\t\t\tuserList.add(user);\n\t\t\t}\n\n\t\t\tpage.setResult(userList);\n\n\t\t\treturn page;\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t} finally {\n\t\t\tclientPool.release(thriftUserServiceClient);\n\t\t}\n\n\t}\n\n\tpublic static void main(String[] args) throws IOException {\n\t\ttry (UserServiceThriftClientImpl userService = new UserServiceThriftClientImpl()) {\n\t\t\tSystem.out.println(userService.existUser(\"12345\"));\n\t\t\tSystem.out.println(userService.createUser(new UserServiceServerImpl().getUser(1)));\n\t\t\tSystem.out.println(userService.getUser(5));\n\t\t\tSystem.out.println(userService.listUser(100));\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "thrift-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "thrift-client/src/main/thrift/UserService.thrift",
    "content": "namespace java benchmark.rpc.thrift\n \nstruct User {\n\t1: i64 id,\n\t2: string name,\n\t3: i32 sex,\n\t4: i32 birthday,\n\t5: string email,\n\t6: string mobile,\n\t7: string address,\n\t8: string icon,\n\t9: list<i32> permissions,\n\t10: i32 status,\n\t11: i64 createTime,\n\t12: i64 updateTime,\n}\n\nstruct UserPage {\n  \t1: i32 pageNo,\n\t2: i32 total,\n\t3: list<User> result,\n}\n \nservice UserService {\n    \n\tbool userExist(1: string email),\n  \n\tbool createUser(1: User user),\n  \n\tUser getUser(1: i64 id),\n  \n\tUserPage listUser(1: i32 pageNo)\n}"
  },
  {
    "path": "thrift-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "thrift-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>thrift-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>thrift-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.thrift>0.12.0</version.thrift>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.apache.thrift</groupId>\n\t\t\t<artifactId>libthrift</artifactId>\n\t\t\t<version>${version.thrift}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/thrift</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "thrift-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport java.net.InetSocketAddress;\n\nimport org.apache.thrift.protocol.TBinaryProtocol;\nimport org.apache.thrift.server.TServer;\nimport org.apache.thrift.server.TThreadedSelectorServer;\nimport org.apache.thrift.transport.TNonblockingServerSocket;\nimport org.apache.thrift.transport.TNonblockingServerTransport;\nimport org.apache.thrift.transport.TTransportException;\n\nimport benchmark.rpc.thrift.UserService;\nimport benchmark.rpc.thrift.UserService.Iface;\nimport benchmark.rpc.thrift.UserServiceThriftServerImpl;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws TTransportException {\n\t\tInetSocketAddress serverAddress = new InetSocketAddress(\"benchmark-server\", 8080);\n\n\t\tTNonblockingServerTransport serverSocket = new TNonblockingServerSocket(serverAddress);\n\t\tTThreadedSelectorServer.Args serverParams = new TThreadedSelectorServer.Args(serverSocket);\n\t\tserverParams.protocolFactory(new TBinaryProtocol.Factory());\n\t\tserverParams.processor(new UserService.Processor<Iface>(new UserServiceThriftServerImpl()));\n\t\tTServer server = new TThreadedSelectorServer(serverParams);\n\t\tserver.serve();\n\t}\n\n}\n"
  },
  {
    "path": "thrift-server/src/main/java/benchmark/rpc/thrift/Converter.java",
    "content": "package benchmark.rpc.thrift;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.time.ZoneOffset;\n\npublic class Converter {\n\n\tpublic static benchmark.rpc.thrift.User toThrift(benchmark.bean.User user) {\n\t\tbenchmark.rpc.thrift.User thriftUser = new benchmark.rpc.thrift.User();\n\n\t\tthriftUser.setId(user.getId());\n\t\tthriftUser.setName(user.getName());\n\t\tthriftUser.setSex(user.getSex());\n\t\tthriftUser.setBirthday((int) (user.getBirthday().toEpochDay()));\n\t\tthriftUser.setEmail(user.getEmail());\n\t\tthriftUser.setMobile(user.getMobile());\n\t\tthriftUser.setAddress(user.getAddress());\n\t\tthriftUser.setIcon(user.getIcon());\n\t\tthriftUser.setPermissions(user.getPermissions());\n\t\tthriftUser.setStatus(user.getStatus());\n\t\tthriftUser.setCreateTime(user.getCreateTime().toEpochSecond(ZoneOffset.UTC));\n\t\tthriftUser.setUpdateTime(user.getUpdateTime().toEpochSecond(ZoneOffset.UTC));\n\n\t\treturn thriftUser;\n\t}\n\n\tpublic static benchmark.bean.User toRaw(benchmark.rpc.thrift.User user) {\n\t\tbenchmark.bean.User rawUser = new benchmark.bean.User();\n\n\t\trawUser.setId(user.getId());\n\t\trawUser.setName(user.getName());\n\t\trawUser.setSex(user.getSex());\n\t\trawUser.setBirthday(LocalDate.ofEpochDay(user.getBirthday()));\n\t\trawUser.setEmail(user.getEmail());\n\t\trawUser.setMobile(user.getMobile());\n\t\trawUser.setAddress(user.getAddress());\n\t\trawUser.setIcon(user.getIcon());\n\t\trawUser.setPermissions(user.getPermissions());\n\t\trawUser.setStatus(user.getStatus());\n\t\trawUser.setCreateTime(LocalDateTime.ofEpochSecond(user.getCreateTime(), 0, ZoneOffset.UTC));\n\t\trawUser.setUpdateTime(LocalDateTime.ofEpochSecond(user.getUpdateTime(), 0, ZoneOffset.UTC));\n\n\t\treturn rawUser;\n\t}\n}\n"
  },
  {
    "path": "thrift-server/src/main/java/benchmark/rpc/thrift/User.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class User implements org.apache.thrift.TBase<User, User._Fields>, java.io.Serializable, Cloneable, Comparable<User> {\n  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"User\");\n\n  private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField(\"id\", org.apache.thrift.protocol.TType.I64, (short)1);\n  private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"name\", org.apache.thrift.protocol.TType.STRING, (short)2);\n  private static final org.apache.thrift.protocol.TField SEX_FIELD_DESC = new org.apache.thrift.protocol.TField(\"sex\", org.apache.thrift.protocol.TType.I32, (short)3);\n  private static final org.apache.thrift.protocol.TField BIRTHDAY_FIELD_DESC = new org.apache.thrift.protocol.TField(\"birthday\", org.apache.thrift.protocol.TType.I32, (short)4);\n  private static final org.apache.thrift.protocol.TField EMAIL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"email\", org.apache.thrift.protocol.TType.STRING, (short)5);\n  private static final org.apache.thrift.protocol.TField MOBILE_FIELD_DESC = new org.apache.thrift.protocol.TField(\"mobile\", org.apache.thrift.protocol.TType.STRING, (short)6);\n  private static final org.apache.thrift.protocol.TField ADDRESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"address\", org.apache.thrift.protocol.TType.STRING, (short)7);\n  private static final org.apache.thrift.protocol.TField ICON_FIELD_DESC = new org.apache.thrift.protocol.TField(\"icon\", org.apache.thrift.protocol.TType.STRING, (short)8);\n  private static final org.apache.thrift.protocol.TField PERMISSIONS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"permissions\", org.apache.thrift.protocol.TType.LIST, (short)9);\n  private static final org.apache.thrift.protocol.TField STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"status\", org.apache.thrift.protocol.TType.I32, (short)10);\n  private static final org.apache.thrift.protocol.TField CREATE_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"createTime\", org.apache.thrift.protocol.TType.I64, (short)11);\n  private static final org.apache.thrift.protocol.TField UPDATE_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"updateTime\", org.apache.thrift.protocol.TType.I64, (short)12);\n\n  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new UserStandardSchemeFactory();\n  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new UserTupleSchemeFactory();\n\n  public long id; // required\n  public java.lang.String name; // required\n  public int sex; // required\n  public int birthday; // required\n  public java.lang.String email; // required\n  public java.lang.String mobile; // required\n  public java.lang.String address; // required\n  public java.lang.String icon; // required\n  public java.util.List<java.lang.Integer> permissions; // required\n  public int status; // required\n  public long createTime; // required\n  public long updateTime; // required\n\n  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n  public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n    ID((short)1, \"id\"),\n    NAME((short)2, \"name\"),\n    SEX((short)3, \"sex\"),\n    BIRTHDAY((short)4, \"birthday\"),\n    EMAIL((short)5, \"email\"),\n    MOBILE((short)6, \"mobile\"),\n    ADDRESS((short)7, \"address\"),\n    ICON((short)8, \"icon\"),\n    PERMISSIONS((short)9, \"permissions\"),\n    STATUS((short)10, \"status\"),\n    CREATE_TIME((short)11, \"createTime\"),\n    UPDATE_TIME((short)12, \"updateTime\");\n\n    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n    static {\n      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n        byName.put(field.getFieldName(), field);\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, or null if its not found.\n     */\n    public static _Fields findByThriftId(int fieldId) {\n      switch(fieldId) {\n        case 1: // ID\n          return ID;\n        case 2: // NAME\n          return NAME;\n        case 3: // SEX\n          return SEX;\n        case 4: // BIRTHDAY\n          return BIRTHDAY;\n        case 5: // EMAIL\n          return EMAIL;\n        case 6: // MOBILE\n          return MOBILE;\n        case 7: // ADDRESS\n          return ADDRESS;\n        case 8: // ICON\n          return ICON;\n        case 9: // PERMISSIONS\n          return PERMISSIONS;\n        case 10: // STATUS\n          return STATUS;\n        case 11: // CREATE_TIME\n          return CREATE_TIME;\n        case 12: // UPDATE_TIME\n          return UPDATE_TIME;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, throwing an exception\n     * if it is not found.\n     */\n    public static _Fields findByThriftIdOrThrow(int fieldId) {\n      _Fields fields = findByThriftId(fieldId);\n      if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n      return fields;\n    }\n\n    /**\n     * Find the _Fields constant that matches name, or null if its not found.\n     */\n    public static _Fields findByName(java.lang.String name) {\n      return byName.get(name);\n    }\n\n    private final short _thriftId;\n    private final java.lang.String _fieldName;\n\n    _Fields(short thriftId, java.lang.String fieldName) {\n      _thriftId = thriftId;\n      _fieldName = fieldName;\n    }\n\n    public short getThriftFieldId() {\n      return _thriftId;\n    }\n\n    public java.lang.String getFieldName() {\n      return _fieldName;\n    }\n  }\n\n  // isset id assignments\n  private static final int __ID_ISSET_ID = 0;\n  private static final int __SEX_ISSET_ID = 1;\n  private static final int __BIRTHDAY_ISSET_ID = 2;\n  private static final int __STATUS_ISSET_ID = 3;\n  private static final int __CREATETIME_ISSET_ID = 4;\n  private static final int __UPDATETIME_ISSET_ID = 5;\n  private byte __isset_bitfield = 0;\n  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n  static {\n    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n    tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData(\"id\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    tmpMap.put(_Fields.NAME, new org.apache.thrift.meta_data.FieldMetaData(\"name\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.SEX, new org.apache.thrift.meta_data.FieldMetaData(\"sex\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.BIRTHDAY, new org.apache.thrift.meta_data.FieldMetaData(\"birthday\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.EMAIL, new org.apache.thrift.meta_data.FieldMetaData(\"email\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.MOBILE, new org.apache.thrift.meta_data.FieldMetaData(\"mobile\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.ADDRESS, new org.apache.thrift.meta_data.FieldMetaData(\"address\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.ICON, new org.apache.thrift.meta_data.FieldMetaData(\"icon\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.PERMISSIONS, new org.apache.thrift.meta_data.FieldMetaData(\"permissions\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, \n            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32))));\n    tmpMap.put(_Fields.STATUS, new org.apache.thrift.meta_data.FieldMetaData(\"status\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.CREATE_TIME, new org.apache.thrift.meta_data.FieldMetaData(\"createTime\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    tmpMap.put(_Fields.UPDATE_TIME, new org.apache.thrift.meta_data.FieldMetaData(\"updateTime\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(User.class, metaDataMap);\n  }\n\n  public User() {\n  }\n\n  public User(\n    long id,\n    java.lang.String name,\n    int sex,\n    int birthday,\n    java.lang.String email,\n    java.lang.String mobile,\n    java.lang.String address,\n    java.lang.String icon,\n    java.util.List<java.lang.Integer> permissions,\n    int status,\n    long createTime,\n    long updateTime)\n  {\n    this();\n    this.id = id;\n    setIdIsSet(true);\n    this.name = name;\n    this.sex = sex;\n    setSexIsSet(true);\n    this.birthday = birthday;\n    setBirthdayIsSet(true);\n    this.email = email;\n    this.mobile = mobile;\n    this.address = address;\n    this.icon = icon;\n    this.permissions = permissions;\n    this.status = status;\n    setStatusIsSet(true);\n    this.createTime = createTime;\n    setCreateTimeIsSet(true);\n    this.updateTime = updateTime;\n    setUpdateTimeIsSet(true);\n  }\n\n  /**\n   * Performs a deep copy on <i>other</i>.\n   */\n  public User(User other) {\n    __isset_bitfield = other.__isset_bitfield;\n    this.id = other.id;\n    if (other.isSetName()) {\n      this.name = other.name;\n    }\n    this.sex = other.sex;\n    this.birthday = other.birthday;\n    if (other.isSetEmail()) {\n      this.email = other.email;\n    }\n    if (other.isSetMobile()) {\n      this.mobile = other.mobile;\n    }\n    if (other.isSetAddress()) {\n      this.address = other.address;\n    }\n    if (other.isSetIcon()) {\n      this.icon = other.icon;\n    }\n    if (other.isSetPermissions()) {\n      java.util.List<java.lang.Integer> __this__permissions = new java.util.ArrayList<java.lang.Integer>(other.permissions);\n      this.permissions = __this__permissions;\n    }\n    this.status = other.status;\n    this.createTime = other.createTime;\n    this.updateTime = other.updateTime;\n  }\n\n  public User deepCopy() {\n    return new User(this);\n  }\n\n  @Override\n  public void clear() {\n    setIdIsSet(false);\n    this.id = 0;\n    this.name = null;\n    setSexIsSet(false);\n    this.sex = 0;\n    setBirthdayIsSet(false);\n    this.birthday = 0;\n    this.email = null;\n    this.mobile = null;\n    this.address = null;\n    this.icon = null;\n    this.permissions = null;\n    setStatusIsSet(false);\n    this.status = 0;\n    setCreateTimeIsSet(false);\n    this.createTime = 0;\n    setUpdateTimeIsSet(false);\n    this.updateTime = 0;\n  }\n\n  public long getId() {\n    return this.id;\n  }\n\n  public User setId(long id) {\n    this.id = id;\n    setIdIsSet(true);\n    return this;\n  }\n\n  public void unsetId() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ID_ISSET_ID);\n  }\n\n  /** Returns true if field id is set (has been assigned a value) and false otherwise */\n  public boolean isSetId() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ID_ISSET_ID);\n  }\n\n  public void setIdIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ID_ISSET_ID, value);\n  }\n\n  public java.lang.String getName() {\n    return this.name;\n  }\n\n  public User setName(java.lang.String name) {\n    this.name = name;\n    return this;\n  }\n\n  public void unsetName() {\n    this.name = null;\n  }\n\n  /** Returns true if field name is set (has been assigned a value) and false otherwise */\n  public boolean isSetName() {\n    return this.name != null;\n  }\n\n  public void setNameIsSet(boolean value) {\n    if (!value) {\n      this.name = null;\n    }\n  }\n\n  public int getSex() {\n    return this.sex;\n  }\n\n  public User setSex(int sex) {\n    this.sex = sex;\n    setSexIsSet(true);\n    return this;\n  }\n\n  public void unsetSex() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SEX_ISSET_ID);\n  }\n\n  /** Returns true if field sex is set (has been assigned a value) and false otherwise */\n  public boolean isSetSex() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SEX_ISSET_ID);\n  }\n\n  public void setSexIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SEX_ISSET_ID, value);\n  }\n\n  public int getBirthday() {\n    return this.birthday;\n  }\n\n  public User setBirthday(int birthday) {\n    this.birthday = birthday;\n    setBirthdayIsSet(true);\n    return this;\n  }\n\n  public void unsetBirthday() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __BIRTHDAY_ISSET_ID);\n  }\n\n  /** Returns true if field birthday is set (has been assigned a value) and false otherwise */\n  public boolean isSetBirthday() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __BIRTHDAY_ISSET_ID);\n  }\n\n  public void setBirthdayIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __BIRTHDAY_ISSET_ID, value);\n  }\n\n  public java.lang.String getEmail() {\n    return this.email;\n  }\n\n  public User setEmail(java.lang.String email) {\n    this.email = email;\n    return this;\n  }\n\n  public void unsetEmail() {\n    this.email = null;\n  }\n\n  /** Returns true if field email is set (has been assigned a value) and false otherwise */\n  public boolean isSetEmail() {\n    return this.email != null;\n  }\n\n  public void setEmailIsSet(boolean value) {\n    if (!value) {\n      this.email = null;\n    }\n  }\n\n  public java.lang.String getMobile() {\n    return this.mobile;\n  }\n\n  public User setMobile(java.lang.String mobile) {\n    this.mobile = mobile;\n    return this;\n  }\n\n  public void unsetMobile() {\n    this.mobile = null;\n  }\n\n  /** Returns true if field mobile is set (has been assigned a value) and false otherwise */\n  public boolean isSetMobile() {\n    return this.mobile != null;\n  }\n\n  public void setMobileIsSet(boolean value) {\n    if (!value) {\n      this.mobile = null;\n    }\n  }\n\n  public java.lang.String getAddress() {\n    return this.address;\n  }\n\n  public User setAddress(java.lang.String address) {\n    this.address = address;\n    return this;\n  }\n\n  public void unsetAddress() {\n    this.address = null;\n  }\n\n  /** Returns true if field address is set (has been assigned a value) and false otherwise */\n  public boolean isSetAddress() {\n    return this.address != null;\n  }\n\n  public void setAddressIsSet(boolean value) {\n    if (!value) {\n      this.address = null;\n    }\n  }\n\n  public java.lang.String getIcon() {\n    return this.icon;\n  }\n\n  public User setIcon(java.lang.String icon) {\n    this.icon = icon;\n    return this;\n  }\n\n  public void unsetIcon() {\n    this.icon = null;\n  }\n\n  /** Returns true if field icon is set (has been assigned a value) and false otherwise */\n  public boolean isSetIcon() {\n    return this.icon != null;\n  }\n\n  public void setIconIsSet(boolean value) {\n    if (!value) {\n      this.icon = null;\n    }\n  }\n\n  public int getPermissionsSize() {\n    return (this.permissions == null) ? 0 : this.permissions.size();\n  }\n\n  public java.util.Iterator<java.lang.Integer> getPermissionsIterator() {\n    return (this.permissions == null) ? null : this.permissions.iterator();\n  }\n\n  public void addToPermissions(int elem) {\n    if (this.permissions == null) {\n      this.permissions = new java.util.ArrayList<java.lang.Integer>();\n    }\n    this.permissions.add(elem);\n  }\n\n  public java.util.List<java.lang.Integer> getPermissions() {\n    return this.permissions;\n  }\n\n  public User setPermissions(java.util.List<java.lang.Integer> permissions) {\n    this.permissions = permissions;\n    return this;\n  }\n\n  public void unsetPermissions() {\n    this.permissions = null;\n  }\n\n  /** Returns true if field permissions is set (has been assigned a value) and false otherwise */\n  public boolean isSetPermissions() {\n    return this.permissions != null;\n  }\n\n  public void setPermissionsIsSet(boolean value) {\n    if (!value) {\n      this.permissions = null;\n    }\n  }\n\n  public int getStatus() {\n    return this.status;\n  }\n\n  public User setStatus(int status) {\n    this.status = status;\n    setStatusIsSet(true);\n    return this;\n  }\n\n  public void unsetStatus() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __STATUS_ISSET_ID);\n  }\n\n  /** Returns true if field status is set (has been assigned a value) and false otherwise */\n  public boolean isSetStatus() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __STATUS_ISSET_ID);\n  }\n\n  public void setStatusIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __STATUS_ISSET_ID, value);\n  }\n\n  public long getCreateTime() {\n    return this.createTime;\n  }\n\n  public User setCreateTime(long createTime) {\n    this.createTime = createTime;\n    setCreateTimeIsSet(true);\n    return this;\n  }\n\n  public void unsetCreateTime() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __CREATETIME_ISSET_ID);\n  }\n\n  /** Returns true if field createTime is set (has been assigned a value) and false otherwise */\n  public boolean isSetCreateTime() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __CREATETIME_ISSET_ID);\n  }\n\n  public void setCreateTimeIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __CREATETIME_ISSET_ID, value);\n  }\n\n  public long getUpdateTime() {\n    return this.updateTime;\n  }\n\n  public User setUpdateTime(long updateTime) {\n    this.updateTime = updateTime;\n    setUpdateTimeIsSet(true);\n    return this;\n  }\n\n  public void unsetUpdateTime() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __UPDATETIME_ISSET_ID);\n  }\n\n  /** Returns true if field updateTime is set (has been assigned a value) and false otherwise */\n  public boolean isSetUpdateTime() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __UPDATETIME_ISSET_ID);\n  }\n\n  public void setUpdateTimeIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __UPDATETIME_ISSET_ID, value);\n  }\n\n  public void setFieldValue(_Fields field, java.lang.Object value) {\n    switch (field) {\n    case ID:\n      if (value == null) {\n        unsetId();\n      } else {\n        setId((java.lang.Long)value);\n      }\n      break;\n\n    case NAME:\n      if (value == null) {\n        unsetName();\n      } else {\n        setName((java.lang.String)value);\n      }\n      break;\n\n    case SEX:\n      if (value == null) {\n        unsetSex();\n      } else {\n        setSex((java.lang.Integer)value);\n      }\n      break;\n\n    case BIRTHDAY:\n      if (value == null) {\n        unsetBirthday();\n      } else {\n        setBirthday((java.lang.Integer)value);\n      }\n      break;\n\n    case EMAIL:\n      if (value == null) {\n        unsetEmail();\n      } else {\n        setEmail((java.lang.String)value);\n      }\n      break;\n\n    case MOBILE:\n      if (value == null) {\n        unsetMobile();\n      } else {\n        setMobile((java.lang.String)value);\n      }\n      break;\n\n    case ADDRESS:\n      if (value == null) {\n        unsetAddress();\n      } else {\n        setAddress((java.lang.String)value);\n      }\n      break;\n\n    case ICON:\n      if (value == null) {\n        unsetIcon();\n      } else {\n        setIcon((java.lang.String)value);\n      }\n      break;\n\n    case PERMISSIONS:\n      if (value == null) {\n        unsetPermissions();\n      } else {\n        setPermissions((java.util.List<java.lang.Integer>)value);\n      }\n      break;\n\n    case STATUS:\n      if (value == null) {\n        unsetStatus();\n      } else {\n        setStatus((java.lang.Integer)value);\n      }\n      break;\n\n    case CREATE_TIME:\n      if (value == null) {\n        unsetCreateTime();\n      } else {\n        setCreateTime((java.lang.Long)value);\n      }\n      break;\n\n    case UPDATE_TIME:\n      if (value == null) {\n        unsetUpdateTime();\n      } else {\n        setUpdateTime((java.lang.Long)value);\n      }\n      break;\n\n    }\n  }\n\n  public java.lang.Object getFieldValue(_Fields field) {\n    switch (field) {\n    case ID:\n      return getId();\n\n    case NAME:\n      return getName();\n\n    case SEX:\n      return getSex();\n\n    case BIRTHDAY:\n      return getBirthday();\n\n    case EMAIL:\n      return getEmail();\n\n    case MOBILE:\n      return getMobile();\n\n    case ADDRESS:\n      return getAddress();\n\n    case ICON:\n      return getIcon();\n\n    case PERMISSIONS:\n      return getPermissions();\n\n    case STATUS:\n      return getStatus();\n\n    case CREATE_TIME:\n      return getCreateTime();\n\n    case UPDATE_TIME:\n      return getUpdateTime();\n\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n  public boolean isSet(_Fields field) {\n    if (field == null) {\n      throw new java.lang.IllegalArgumentException();\n    }\n\n    switch (field) {\n    case ID:\n      return isSetId();\n    case NAME:\n      return isSetName();\n    case SEX:\n      return isSetSex();\n    case BIRTHDAY:\n      return isSetBirthday();\n    case EMAIL:\n      return isSetEmail();\n    case MOBILE:\n      return isSetMobile();\n    case ADDRESS:\n      return isSetAddress();\n    case ICON:\n      return isSetIcon();\n    case PERMISSIONS:\n      return isSetPermissions();\n    case STATUS:\n      return isSetStatus();\n    case CREATE_TIME:\n      return isSetCreateTime();\n    case UPDATE_TIME:\n      return isSetUpdateTime();\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  @Override\n  public boolean equals(java.lang.Object that) {\n    if (that == null)\n      return false;\n    if (that instanceof User)\n      return this.equals((User)that);\n    return false;\n  }\n\n  public boolean equals(User that) {\n    if (that == null)\n      return false;\n    if (this == that)\n      return true;\n\n    boolean this_present_id = true;\n    boolean that_present_id = true;\n    if (this_present_id || that_present_id) {\n      if (!(this_present_id && that_present_id))\n        return false;\n      if (this.id != that.id)\n        return false;\n    }\n\n    boolean this_present_name = true && this.isSetName();\n    boolean that_present_name = true && that.isSetName();\n    if (this_present_name || that_present_name) {\n      if (!(this_present_name && that_present_name))\n        return false;\n      if (!this.name.equals(that.name))\n        return false;\n    }\n\n    boolean this_present_sex = true;\n    boolean that_present_sex = true;\n    if (this_present_sex || that_present_sex) {\n      if (!(this_present_sex && that_present_sex))\n        return false;\n      if (this.sex != that.sex)\n        return false;\n    }\n\n    boolean this_present_birthday = true;\n    boolean that_present_birthday = true;\n    if (this_present_birthday || that_present_birthday) {\n      if (!(this_present_birthday && that_present_birthday))\n        return false;\n      if (this.birthday != that.birthday)\n        return false;\n    }\n\n    boolean this_present_email = true && this.isSetEmail();\n    boolean that_present_email = true && that.isSetEmail();\n    if (this_present_email || that_present_email) {\n      if (!(this_present_email && that_present_email))\n        return false;\n      if (!this.email.equals(that.email))\n        return false;\n    }\n\n    boolean this_present_mobile = true && this.isSetMobile();\n    boolean that_present_mobile = true && that.isSetMobile();\n    if (this_present_mobile || that_present_mobile) {\n      if (!(this_present_mobile && that_present_mobile))\n        return false;\n      if (!this.mobile.equals(that.mobile))\n        return false;\n    }\n\n    boolean this_present_address = true && this.isSetAddress();\n    boolean that_present_address = true && that.isSetAddress();\n    if (this_present_address || that_present_address) {\n      if (!(this_present_address && that_present_address))\n        return false;\n      if (!this.address.equals(that.address))\n        return false;\n    }\n\n    boolean this_present_icon = true && this.isSetIcon();\n    boolean that_present_icon = true && that.isSetIcon();\n    if (this_present_icon || that_present_icon) {\n      if (!(this_present_icon && that_present_icon))\n        return false;\n      if (!this.icon.equals(that.icon))\n        return false;\n    }\n\n    boolean this_present_permissions = true && this.isSetPermissions();\n    boolean that_present_permissions = true && that.isSetPermissions();\n    if (this_present_permissions || that_present_permissions) {\n      if (!(this_present_permissions && that_present_permissions))\n        return false;\n      if (!this.permissions.equals(that.permissions))\n        return false;\n    }\n\n    boolean this_present_status = true;\n    boolean that_present_status = true;\n    if (this_present_status || that_present_status) {\n      if (!(this_present_status && that_present_status))\n        return false;\n      if (this.status != that.status)\n        return false;\n    }\n\n    boolean this_present_createTime = true;\n    boolean that_present_createTime = true;\n    if (this_present_createTime || that_present_createTime) {\n      if (!(this_present_createTime && that_present_createTime))\n        return false;\n      if (this.createTime != that.createTime)\n        return false;\n    }\n\n    boolean this_present_updateTime = true;\n    boolean that_present_updateTime = true;\n    if (this_present_updateTime || that_present_updateTime) {\n      if (!(this_present_updateTime && that_present_updateTime))\n        return false;\n      if (this.updateTime != that.updateTime)\n        return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    int hashCode = 1;\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(id);\n\n    hashCode = hashCode * 8191 + ((isSetName()) ? 131071 : 524287);\n    if (isSetName())\n      hashCode = hashCode * 8191 + name.hashCode();\n\n    hashCode = hashCode * 8191 + sex;\n\n    hashCode = hashCode * 8191 + birthday;\n\n    hashCode = hashCode * 8191 + ((isSetEmail()) ? 131071 : 524287);\n    if (isSetEmail())\n      hashCode = hashCode * 8191 + email.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetMobile()) ? 131071 : 524287);\n    if (isSetMobile())\n      hashCode = hashCode * 8191 + mobile.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetAddress()) ? 131071 : 524287);\n    if (isSetAddress())\n      hashCode = hashCode * 8191 + address.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetIcon()) ? 131071 : 524287);\n    if (isSetIcon())\n      hashCode = hashCode * 8191 + icon.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetPermissions()) ? 131071 : 524287);\n    if (isSetPermissions())\n      hashCode = hashCode * 8191 + permissions.hashCode();\n\n    hashCode = hashCode * 8191 + status;\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(createTime);\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(updateTime);\n\n    return hashCode;\n  }\n\n  @Override\n  public int compareTo(User other) {\n    if (!getClass().equals(other.getClass())) {\n      return getClass().getName().compareTo(other.getClass().getName());\n    }\n\n    int lastComparison = 0;\n\n    lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetId()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetName()).compareTo(other.isSetName());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetName()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.name, other.name);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetSex()).compareTo(other.isSetSex());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetSex()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.sex, other.sex);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetBirthday()).compareTo(other.isSetBirthday());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetBirthday()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.birthday, other.birthday);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetEmail()).compareTo(other.isSetEmail());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetEmail()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.email, other.email);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetMobile()).compareTo(other.isSetMobile());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetMobile()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.mobile, other.mobile);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetAddress()).compareTo(other.isSetAddress());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetAddress()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.address, other.address);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetIcon()).compareTo(other.isSetIcon());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetIcon()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.icon, other.icon);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetPermissions()).compareTo(other.isSetPermissions());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetPermissions()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.permissions, other.permissions);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetStatus()).compareTo(other.isSetStatus());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetStatus()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.status, other.status);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetCreateTime()).compareTo(other.isSetCreateTime());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetCreateTime()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.createTime, other.createTime);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetUpdateTime()).compareTo(other.isSetUpdateTime());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetUpdateTime()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.updateTime, other.updateTime);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    return 0;\n  }\n\n  public _Fields fieldForId(int fieldId) {\n    return _Fields.findByThriftId(fieldId);\n  }\n\n  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n    scheme(iprot).read(iprot, this);\n  }\n\n  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n    scheme(oprot).write(oprot, this);\n  }\n\n  @Override\n  public java.lang.String toString() {\n    java.lang.StringBuilder sb = new java.lang.StringBuilder(\"User(\");\n    boolean first = true;\n\n    sb.append(\"id:\");\n    sb.append(this.id);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"name:\");\n    if (this.name == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.name);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"sex:\");\n    sb.append(this.sex);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"birthday:\");\n    sb.append(this.birthday);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"email:\");\n    if (this.email == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.email);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"mobile:\");\n    if (this.mobile == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.mobile);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"address:\");\n    if (this.address == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.address);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"icon:\");\n    if (this.icon == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.icon);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"permissions:\");\n    if (this.permissions == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.permissions);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"status:\");\n    sb.append(this.status);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"createTime:\");\n    sb.append(this.createTime);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"updateTime:\");\n    sb.append(this.updateTime);\n    first = false;\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  public void validate() throws org.apache.thrift.TException {\n    // check for required fields\n    // check for sub-struct validity\n  }\n\n  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n    try {\n      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n    try {\n      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n      __isset_bitfield = 0;\n      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private static class UserStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserStandardScheme getScheme() {\n      return new UserStandardScheme();\n    }\n  }\n\n  private static class UserStandardScheme extends org.apache.thrift.scheme.StandardScheme<User> {\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TField schemeField;\n      iprot.readStructBegin();\n      while (true)\n      {\n        schemeField = iprot.readFieldBegin();\n        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n          break;\n        }\n        switch (schemeField.id) {\n          case 1: // ID\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.id = iprot.readI64();\n              struct.setIdIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 2: // NAME\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.name = iprot.readString();\n              struct.setNameIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 3: // SEX\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.sex = iprot.readI32();\n              struct.setSexIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 4: // BIRTHDAY\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.birthday = iprot.readI32();\n              struct.setBirthdayIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 5: // EMAIL\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.email = iprot.readString();\n              struct.setEmailIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 6: // MOBILE\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.mobile = iprot.readString();\n              struct.setMobileIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 7: // ADDRESS\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.address = iprot.readString();\n              struct.setAddressIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 8: // ICON\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.icon = iprot.readString();\n              struct.setIconIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 9: // PERMISSIONS\n            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {\n              {\n                org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();\n                struct.permissions = new java.util.ArrayList<java.lang.Integer>(_list0.size);\n                int _elem1;\n                for (int _i2 = 0; _i2 < _list0.size; ++_i2)\n                {\n                  _elem1 = iprot.readI32();\n                  struct.permissions.add(_elem1);\n                }\n                iprot.readListEnd();\n              }\n              struct.setPermissionsIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 10: // STATUS\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.status = iprot.readI32();\n              struct.setStatusIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 11: // CREATE_TIME\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.createTime = iprot.readI64();\n              struct.setCreateTimeIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 12: // UPDATE_TIME\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.updateTime = iprot.readI64();\n              struct.setUpdateTimeIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          default:\n            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n        }\n        iprot.readFieldEnd();\n      }\n      iprot.readStructEnd();\n\n      // check for required fields of primitive type, which can't be checked in the validate method\n      struct.validate();\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot, User struct) throws org.apache.thrift.TException {\n      struct.validate();\n\n      oprot.writeStructBegin(STRUCT_DESC);\n      oprot.writeFieldBegin(ID_FIELD_DESC);\n      oprot.writeI64(struct.id);\n      oprot.writeFieldEnd();\n      if (struct.name != null) {\n        oprot.writeFieldBegin(NAME_FIELD_DESC);\n        oprot.writeString(struct.name);\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldBegin(SEX_FIELD_DESC);\n      oprot.writeI32(struct.sex);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(BIRTHDAY_FIELD_DESC);\n      oprot.writeI32(struct.birthday);\n      oprot.writeFieldEnd();\n      if (struct.email != null) {\n        oprot.writeFieldBegin(EMAIL_FIELD_DESC);\n        oprot.writeString(struct.email);\n        oprot.writeFieldEnd();\n      }\n      if (struct.mobile != null) {\n        oprot.writeFieldBegin(MOBILE_FIELD_DESC);\n        oprot.writeString(struct.mobile);\n        oprot.writeFieldEnd();\n      }\n      if (struct.address != null) {\n        oprot.writeFieldBegin(ADDRESS_FIELD_DESC);\n        oprot.writeString(struct.address);\n        oprot.writeFieldEnd();\n      }\n      if (struct.icon != null) {\n        oprot.writeFieldBegin(ICON_FIELD_DESC);\n        oprot.writeString(struct.icon);\n        oprot.writeFieldEnd();\n      }\n      if (struct.permissions != null) {\n        oprot.writeFieldBegin(PERMISSIONS_FIELD_DESC);\n        {\n          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.I32, struct.permissions.size()));\n          for (int _iter3 : struct.permissions)\n          {\n            oprot.writeI32(_iter3);\n          }\n          oprot.writeListEnd();\n        }\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldBegin(STATUS_FIELD_DESC);\n      oprot.writeI32(struct.status);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(CREATE_TIME_FIELD_DESC);\n      oprot.writeI64(struct.createTime);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(UPDATE_TIME_FIELD_DESC);\n      oprot.writeI64(struct.updateTime);\n      oprot.writeFieldEnd();\n      oprot.writeFieldStop();\n      oprot.writeStructEnd();\n    }\n\n  }\n\n  private static class UserTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserTupleScheme getScheme() {\n      return new UserTupleScheme();\n    }\n  }\n\n  private static class UserTupleScheme extends org.apache.thrift.scheme.TupleScheme<User> {\n\n    @Override\n    public void write(org.apache.thrift.protocol.TProtocol prot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet optionals = new java.util.BitSet();\n      if (struct.isSetId()) {\n        optionals.set(0);\n      }\n      if (struct.isSetName()) {\n        optionals.set(1);\n      }\n      if (struct.isSetSex()) {\n        optionals.set(2);\n      }\n      if (struct.isSetBirthday()) {\n        optionals.set(3);\n      }\n      if (struct.isSetEmail()) {\n        optionals.set(4);\n      }\n      if (struct.isSetMobile()) {\n        optionals.set(5);\n      }\n      if (struct.isSetAddress()) {\n        optionals.set(6);\n      }\n      if (struct.isSetIcon()) {\n        optionals.set(7);\n      }\n      if (struct.isSetPermissions()) {\n        optionals.set(8);\n      }\n      if (struct.isSetStatus()) {\n        optionals.set(9);\n      }\n      if (struct.isSetCreateTime()) {\n        optionals.set(10);\n      }\n      if (struct.isSetUpdateTime()) {\n        optionals.set(11);\n      }\n      oprot.writeBitSet(optionals, 12);\n      if (struct.isSetId()) {\n        oprot.writeI64(struct.id);\n      }\n      if (struct.isSetName()) {\n        oprot.writeString(struct.name);\n      }\n      if (struct.isSetSex()) {\n        oprot.writeI32(struct.sex);\n      }\n      if (struct.isSetBirthday()) {\n        oprot.writeI32(struct.birthday);\n      }\n      if (struct.isSetEmail()) {\n        oprot.writeString(struct.email);\n      }\n      if (struct.isSetMobile()) {\n        oprot.writeString(struct.mobile);\n      }\n      if (struct.isSetAddress()) {\n        oprot.writeString(struct.address);\n      }\n      if (struct.isSetIcon()) {\n        oprot.writeString(struct.icon);\n      }\n      if (struct.isSetPermissions()) {\n        {\n          oprot.writeI32(struct.permissions.size());\n          for (int _iter4 : struct.permissions)\n          {\n            oprot.writeI32(_iter4);\n          }\n        }\n      }\n      if (struct.isSetStatus()) {\n        oprot.writeI32(struct.status);\n      }\n      if (struct.isSetCreateTime()) {\n        oprot.writeI64(struct.createTime);\n      }\n      if (struct.isSetUpdateTime()) {\n        oprot.writeI64(struct.updateTime);\n      }\n    }\n\n    @Override\n    public void read(org.apache.thrift.protocol.TProtocol prot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet incoming = iprot.readBitSet(12);\n      if (incoming.get(0)) {\n        struct.id = iprot.readI64();\n        struct.setIdIsSet(true);\n      }\n      if (incoming.get(1)) {\n        struct.name = iprot.readString();\n        struct.setNameIsSet(true);\n      }\n      if (incoming.get(2)) {\n        struct.sex = iprot.readI32();\n        struct.setSexIsSet(true);\n      }\n      if (incoming.get(3)) {\n        struct.birthday = iprot.readI32();\n        struct.setBirthdayIsSet(true);\n      }\n      if (incoming.get(4)) {\n        struct.email = iprot.readString();\n        struct.setEmailIsSet(true);\n      }\n      if (incoming.get(5)) {\n        struct.mobile = iprot.readString();\n        struct.setMobileIsSet(true);\n      }\n      if (incoming.get(6)) {\n        struct.address = iprot.readString();\n        struct.setAddressIsSet(true);\n      }\n      if (incoming.get(7)) {\n        struct.icon = iprot.readString();\n        struct.setIconIsSet(true);\n      }\n      if (incoming.get(8)) {\n        {\n          org.apache.thrift.protocol.TList _list5 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.I32, iprot.readI32());\n          struct.permissions = new java.util.ArrayList<java.lang.Integer>(_list5.size);\n          int _elem6;\n          for (int _i7 = 0; _i7 < _list5.size; ++_i7)\n          {\n            _elem6 = iprot.readI32();\n            struct.permissions.add(_elem6);\n          }\n        }\n        struct.setPermissionsIsSet(true);\n      }\n      if (incoming.get(9)) {\n        struct.status = iprot.readI32();\n        struct.setStatusIsSet(true);\n      }\n      if (incoming.get(10)) {\n        struct.createTime = iprot.readI64();\n        struct.setCreateTimeIsSet(true);\n      }\n      if (incoming.get(11)) {\n        struct.updateTime = iprot.readI64();\n        struct.setUpdateTimeIsSet(true);\n      }\n    }\n  }\n\n  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n  }\n}\n\n"
  },
  {
    "path": "thrift-server/src/main/java/benchmark/rpc/thrift/UserPage.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class UserPage implements org.apache.thrift.TBase<UserPage, UserPage._Fields>, java.io.Serializable, Cloneable, Comparable<UserPage> {\n  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"UserPage\");\n\n  private static final org.apache.thrift.protocol.TField PAGE_NO_FIELD_DESC = new org.apache.thrift.protocol.TField(\"pageNo\", org.apache.thrift.protocol.TType.I32, (short)1);\n  private static final org.apache.thrift.protocol.TField TOTAL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"total\", org.apache.thrift.protocol.TType.I32, (short)2);\n  private static final org.apache.thrift.protocol.TField RESULT_FIELD_DESC = new org.apache.thrift.protocol.TField(\"result\", org.apache.thrift.protocol.TType.LIST, (short)3);\n\n  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new UserPageStandardSchemeFactory();\n  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new UserPageTupleSchemeFactory();\n\n  public int pageNo; // required\n  public int total; // required\n  public java.util.List<User> result; // required\n\n  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n  public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n    PAGE_NO((short)1, \"pageNo\"),\n    TOTAL((short)2, \"total\"),\n    RESULT((short)3, \"result\");\n\n    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n    static {\n      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n        byName.put(field.getFieldName(), field);\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, or null if its not found.\n     */\n    public static _Fields findByThriftId(int fieldId) {\n      switch(fieldId) {\n        case 1: // PAGE_NO\n          return PAGE_NO;\n        case 2: // TOTAL\n          return TOTAL;\n        case 3: // RESULT\n          return RESULT;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, throwing an exception\n     * if it is not found.\n     */\n    public static _Fields findByThriftIdOrThrow(int fieldId) {\n      _Fields fields = findByThriftId(fieldId);\n      if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n      return fields;\n    }\n\n    /**\n     * Find the _Fields constant that matches name, or null if its not found.\n     */\n    public static _Fields findByName(java.lang.String name) {\n      return byName.get(name);\n    }\n\n    private final short _thriftId;\n    private final java.lang.String _fieldName;\n\n    _Fields(short thriftId, java.lang.String fieldName) {\n      _thriftId = thriftId;\n      _fieldName = fieldName;\n    }\n\n    public short getThriftFieldId() {\n      return _thriftId;\n    }\n\n    public java.lang.String getFieldName() {\n      return _fieldName;\n    }\n  }\n\n  // isset id assignments\n  private static final int __PAGENO_ISSET_ID = 0;\n  private static final int __TOTAL_ISSET_ID = 1;\n  private byte __isset_bitfield = 0;\n  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n  static {\n    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n    tmpMap.put(_Fields.PAGE_NO, new org.apache.thrift.meta_data.FieldMetaData(\"pageNo\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.TOTAL, new org.apache.thrift.meta_data.FieldMetaData(\"total\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.RESULT, new org.apache.thrift.meta_data.FieldMetaData(\"result\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, \n            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class))));\n    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(UserPage.class, metaDataMap);\n  }\n\n  public UserPage() {\n  }\n\n  public UserPage(\n    int pageNo,\n    int total,\n    java.util.List<User> result)\n  {\n    this();\n    this.pageNo = pageNo;\n    setPageNoIsSet(true);\n    this.total = total;\n    setTotalIsSet(true);\n    this.result = result;\n  }\n\n  /**\n   * Performs a deep copy on <i>other</i>.\n   */\n  public UserPage(UserPage other) {\n    __isset_bitfield = other.__isset_bitfield;\n    this.pageNo = other.pageNo;\n    this.total = other.total;\n    if (other.isSetResult()) {\n      java.util.List<User> __this__result = new java.util.ArrayList<User>(other.result.size());\n      for (User other_element : other.result) {\n        __this__result.add(new User(other_element));\n      }\n      this.result = __this__result;\n    }\n  }\n\n  public UserPage deepCopy() {\n    return new UserPage(this);\n  }\n\n  @Override\n  public void clear() {\n    setPageNoIsSet(false);\n    this.pageNo = 0;\n    setTotalIsSet(false);\n    this.total = 0;\n    this.result = null;\n  }\n\n  public int getPageNo() {\n    return this.pageNo;\n  }\n\n  public UserPage setPageNo(int pageNo) {\n    this.pageNo = pageNo;\n    setPageNoIsSet(true);\n    return this;\n  }\n\n  public void unsetPageNo() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PAGENO_ISSET_ID);\n  }\n\n  /** Returns true if field pageNo is set (has been assigned a value) and false otherwise */\n  public boolean isSetPageNo() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PAGENO_ISSET_ID);\n  }\n\n  public void setPageNoIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PAGENO_ISSET_ID, value);\n  }\n\n  public int getTotal() {\n    return this.total;\n  }\n\n  public UserPage setTotal(int total) {\n    this.total = total;\n    setTotalIsSet(true);\n    return this;\n  }\n\n  public void unsetTotal() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __TOTAL_ISSET_ID);\n  }\n\n  /** Returns true if field total is set (has been assigned a value) and false otherwise */\n  public boolean isSetTotal() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __TOTAL_ISSET_ID);\n  }\n\n  public void setTotalIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __TOTAL_ISSET_ID, value);\n  }\n\n  public int getResultSize() {\n    return (this.result == null) ? 0 : this.result.size();\n  }\n\n  public java.util.Iterator<User> getResultIterator() {\n    return (this.result == null) ? null : this.result.iterator();\n  }\n\n  public void addToResult(User elem) {\n    if (this.result == null) {\n      this.result = new java.util.ArrayList<User>();\n    }\n    this.result.add(elem);\n  }\n\n  public java.util.List<User> getResult() {\n    return this.result;\n  }\n\n  public UserPage setResult(java.util.List<User> result) {\n    this.result = result;\n    return this;\n  }\n\n  public void unsetResult() {\n    this.result = null;\n  }\n\n  /** Returns true if field result is set (has been assigned a value) and false otherwise */\n  public boolean isSetResult() {\n    return this.result != null;\n  }\n\n  public void setResultIsSet(boolean value) {\n    if (!value) {\n      this.result = null;\n    }\n  }\n\n  public void setFieldValue(_Fields field, java.lang.Object value) {\n    switch (field) {\n    case PAGE_NO:\n      if (value == null) {\n        unsetPageNo();\n      } else {\n        setPageNo((java.lang.Integer)value);\n      }\n      break;\n\n    case TOTAL:\n      if (value == null) {\n        unsetTotal();\n      } else {\n        setTotal((java.lang.Integer)value);\n      }\n      break;\n\n    case RESULT:\n      if (value == null) {\n        unsetResult();\n      } else {\n        setResult((java.util.List<User>)value);\n      }\n      break;\n\n    }\n  }\n\n  public java.lang.Object getFieldValue(_Fields field) {\n    switch (field) {\n    case PAGE_NO:\n      return getPageNo();\n\n    case TOTAL:\n      return getTotal();\n\n    case RESULT:\n      return getResult();\n\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n  public boolean isSet(_Fields field) {\n    if (field == null) {\n      throw new java.lang.IllegalArgumentException();\n    }\n\n    switch (field) {\n    case PAGE_NO:\n      return isSetPageNo();\n    case TOTAL:\n      return isSetTotal();\n    case RESULT:\n      return isSetResult();\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  @Override\n  public boolean equals(java.lang.Object that) {\n    if (that == null)\n      return false;\n    if (that instanceof UserPage)\n      return this.equals((UserPage)that);\n    return false;\n  }\n\n  public boolean equals(UserPage that) {\n    if (that == null)\n      return false;\n    if (this == that)\n      return true;\n\n    boolean this_present_pageNo = true;\n    boolean that_present_pageNo = true;\n    if (this_present_pageNo || that_present_pageNo) {\n      if (!(this_present_pageNo && that_present_pageNo))\n        return false;\n      if (this.pageNo != that.pageNo)\n        return false;\n    }\n\n    boolean this_present_total = true;\n    boolean that_present_total = true;\n    if (this_present_total || that_present_total) {\n      if (!(this_present_total && that_present_total))\n        return false;\n      if (this.total != that.total)\n        return false;\n    }\n\n    boolean this_present_result = true && this.isSetResult();\n    boolean that_present_result = true && that.isSetResult();\n    if (this_present_result || that_present_result) {\n      if (!(this_present_result && that_present_result))\n        return false;\n      if (!this.result.equals(that.result))\n        return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    int hashCode = 1;\n\n    hashCode = hashCode * 8191 + pageNo;\n\n    hashCode = hashCode * 8191 + total;\n\n    hashCode = hashCode * 8191 + ((isSetResult()) ? 131071 : 524287);\n    if (isSetResult())\n      hashCode = hashCode * 8191 + result.hashCode();\n\n    return hashCode;\n  }\n\n  @Override\n  public int compareTo(UserPage other) {\n    if (!getClass().equals(other.getClass())) {\n      return getClass().getName().compareTo(other.getClass().getName());\n    }\n\n    int lastComparison = 0;\n\n    lastComparison = java.lang.Boolean.valueOf(isSetPageNo()).compareTo(other.isSetPageNo());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetPageNo()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.pageNo, other.pageNo);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetTotal()).compareTo(other.isSetTotal());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetTotal()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.total, other.total);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetResult()).compareTo(other.isSetResult());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetResult()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.result, other.result);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    return 0;\n  }\n\n  public _Fields fieldForId(int fieldId) {\n    return _Fields.findByThriftId(fieldId);\n  }\n\n  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n    scheme(iprot).read(iprot, this);\n  }\n\n  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n    scheme(oprot).write(oprot, this);\n  }\n\n  @Override\n  public java.lang.String toString() {\n    java.lang.StringBuilder sb = new java.lang.StringBuilder(\"UserPage(\");\n    boolean first = true;\n\n    sb.append(\"pageNo:\");\n    sb.append(this.pageNo);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"total:\");\n    sb.append(this.total);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"result:\");\n    if (this.result == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.result);\n    }\n    first = false;\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  public void validate() throws org.apache.thrift.TException {\n    // check for required fields\n    // check for sub-struct validity\n  }\n\n  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n    try {\n      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n    try {\n      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n      __isset_bitfield = 0;\n      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private static class UserPageStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserPageStandardScheme getScheme() {\n      return new UserPageStandardScheme();\n    }\n  }\n\n  private static class UserPageStandardScheme extends org.apache.thrift.scheme.StandardScheme<UserPage> {\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TField schemeField;\n      iprot.readStructBegin();\n      while (true)\n      {\n        schemeField = iprot.readFieldBegin();\n        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n          break;\n        }\n        switch (schemeField.id) {\n          case 1: // PAGE_NO\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.pageNo = iprot.readI32();\n              struct.setPageNoIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 2: // TOTAL\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.total = iprot.readI32();\n              struct.setTotalIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 3: // RESULT\n            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {\n              {\n                org.apache.thrift.protocol.TList _list8 = iprot.readListBegin();\n                struct.result = new java.util.ArrayList<User>(_list8.size);\n                User _elem9;\n                for (int _i10 = 0; _i10 < _list8.size; ++_i10)\n                {\n                  _elem9 = new User();\n                  _elem9.read(iprot);\n                  struct.result.add(_elem9);\n                }\n                iprot.readListEnd();\n              }\n              struct.setResultIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          default:\n            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n        }\n        iprot.readFieldEnd();\n      }\n      iprot.readStructEnd();\n\n      // check for required fields of primitive type, which can't be checked in the validate method\n      struct.validate();\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot, UserPage struct) throws org.apache.thrift.TException {\n      struct.validate();\n\n      oprot.writeStructBegin(STRUCT_DESC);\n      oprot.writeFieldBegin(PAGE_NO_FIELD_DESC);\n      oprot.writeI32(struct.pageNo);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(TOTAL_FIELD_DESC);\n      oprot.writeI32(struct.total);\n      oprot.writeFieldEnd();\n      if (struct.result != null) {\n        oprot.writeFieldBegin(RESULT_FIELD_DESC);\n        {\n          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.result.size()));\n          for (User _iter11 : struct.result)\n          {\n            _iter11.write(oprot);\n          }\n          oprot.writeListEnd();\n        }\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldStop();\n      oprot.writeStructEnd();\n    }\n\n  }\n\n  private static class UserPageTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserPageTupleScheme getScheme() {\n      return new UserPageTupleScheme();\n    }\n  }\n\n  private static class UserPageTupleScheme extends org.apache.thrift.scheme.TupleScheme<UserPage> {\n\n    @Override\n    public void write(org.apache.thrift.protocol.TProtocol prot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet optionals = new java.util.BitSet();\n      if (struct.isSetPageNo()) {\n        optionals.set(0);\n      }\n      if (struct.isSetTotal()) {\n        optionals.set(1);\n      }\n      if (struct.isSetResult()) {\n        optionals.set(2);\n      }\n      oprot.writeBitSet(optionals, 3);\n      if (struct.isSetPageNo()) {\n        oprot.writeI32(struct.pageNo);\n      }\n      if (struct.isSetTotal()) {\n        oprot.writeI32(struct.total);\n      }\n      if (struct.isSetResult()) {\n        {\n          oprot.writeI32(struct.result.size());\n          for (User _iter12 : struct.result)\n          {\n            _iter12.write(oprot);\n          }\n        }\n      }\n    }\n\n    @Override\n    public void read(org.apache.thrift.protocol.TProtocol prot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet incoming = iprot.readBitSet(3);\n      if (incoming.get(0)) {\n        struct.pageNo = iprot.readI32();\n        struct.setPageNoIsSet(true);\n      }\n      if (incoming.get(1)) {\n        struct.total = iprot.readI32();\n        struct.setTotalIsSet(true);\n      }\n      if (incoming.get(2)) {\n        {\n          org.apache.thrift.protocol.TList _list13 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());\n          struct.result = new java.util.ArrayList<User>(_list13.size);\n          User _elem14;\n          for (int _i15 = 0; _i15 < _list13.size; ++_i15)\n          {\n            _elem14 = new User();\n            _elem14.read(iprot);\n            struct.result.add(_elem14);\n          }\n        }\n        struct.setResultIsSet(true);\n      }\n    }\n  }\n\n  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n  }\n}\n\n"
  },
  {
    "path": "thrift-server/src/main/java/benchmark/rpc/thrift/UserService.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class UserService {\n\n  public interface Iface {\n\n    public boolean userExist(java.lang.String email) throws org.apache.thrift.TException;\n\n    public boolean createUser(User user) throws org.apache.thrift.TException;\n\n    public User getUser(long id) throws org.apache.thrift.TException;\n\n    public UserPage listUser(int pageNo) throws org.apache.thrift.TException;\n\n  }\n\n  public interface AsyncIface {\n\n    public void userExist(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;\n\n    public void createUser(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;\n\n    public void getUser(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException;\n\n    public void listUser(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException;\n\n  }\n\n  public static class Client extends org.apache.thrift.TServiceClient implements Iface {\n    public static class Factory implements org.apache.thrift.TServiceClientFactory<Client> {\n      public Factory() {}\n      public Client getClient(org.apache.thrift.protocol.TProtocol prot) {\n        return new Client(prot);\n      }\n      public Client getClient(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n        return new Client(iprot, oprot);\n      }\n    }\n\n    public Client(org.apache.thrift.protocol.TProtocol prot)\n    {\n      super(prot, prot);\n    }\n\n    public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n      super(iprot, oprot);\n    }\n\n    public boolean userExist(java.lang.String email) throws org.apache.thrift.TException\n    {\n      send_userExist(email);\n      return recv_userExist();\n    }\n\n    public void send_userExist(java.lang.String email) throws org.apache.thrift.TException\n    {\n      userExist_args args = new userExist_args();\n      args.setEmail(email);\n      sendBase(\"userExist\", args);\n    }\n\n    public boolean recv_userExist() throws org.apache.thrift.TException\n    {\n      userExist_result result = new userExist_result();\n      receiveBase(result, \"userExist\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"userExist failed: unknown result\");\n    }\n\n    public boolean createUser(User user) throws org.apache.thrift.TException\n    {\n      send_createUser(user);\n      return recv_createUser();\n    }\n\n    public void send_createUser(User user) throws org.apache.thrift.TException\n    {\n      createUser_args args = new createUser_args();\n      args.setUser(user);\n      sendBase(\"createUser\", args);\n    }\n\n    public boolean recv_createUser() throws org.apache.thrift.TException\n    {\n      createUser_result result = new createUser_result();\n      receiveBase(result, \"createUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"createUser failed: unknown result\");\n    }\n\n    public User getUser(long id) throws org.apache.thrift.TException\n    {\n      send_getUser(id);\n      return recv_getUser();\n    }\n\n    public void send_getUser(long id) throws org.apache.thrift.TException\n    {\n      getUser_args args = new getUser_args();\n      args.setId(id);\n      sendBase(\"getUser\", args);\n    }\n\n    public User recv_getUser() throws org.apache.thrift.TException\n    {\n      getUser_result result = new getUser_result();\n      receiveBase(result, \"getUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"getUser failed: unknown result\");\n    }\n\n    public UserPage listUser(int pageNo) throws org.apache.thrift.TException\n    {\n      send_listUser(pageNo);\n      return recv_listUser();\n    }\n\n    public void send_listUser(int pageNo) throws org.apache.thrift.TException\n    {\n      listUser_args args = new listUser_args();\n      args.setPageNo(pageNo);\n      sendBase(\"listUser\", args);\n    }\n\n    public UserPage recv_listUser() throws org.apache.thrift.TException\n    {\n      listUser_result result = new listUser_result();\n      receiveBase(result, \"listUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"listUser failed: unknown result\");\n    }\n\n  }\n  public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface {\n    public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {\n      private org.apache.thrift.async.TAsyncClientManager clientManager;\n      private org.apache.thrift.protocol.TProtocolFactory protocolFactory;\n      public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) {\n        this.clientManager = clientManager;\n        this.protocolFactory = protocolFactory;\n      }\n      public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) {\n        return new AsyncClient(protocolFactory, clientManager, transport);\n      }\n    }\n\n    public AsyncClient(org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.transport.TNonblockingTransport transport) {\n      super(protocolFactory, clientManager, transport);\n    }\n\n    public void userExist(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      userExist_call method_call = new userExist_call(email, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class userExist_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {\n      private java.lang.String email;\n      public userExist_call(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.email = email;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"userExist\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        userExist_args args = new userExist_args();\n        args.setEmail(email);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public java.lang.Boolean getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_userExist();\n      }\n    }\n\n    public void createUser(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      createUser_call method_call = new createUser_call(user, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class createUser_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {\n      private User user;\n      public createUser_call(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.user = user;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"createUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        createUser_args args = new createUser_args();\n        args.setUser(user);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public java.lang.Boolean getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_createUser();\n      }\n    }\n\n    public void getUser(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      getUser_call method_call = new getUser_call(id, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class getUser_call extends org.apache.thrift.async.TAsyncMethodCall<User> {\n      private long id;\n      public getUser_call(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.id = id;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"getUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        getUser_args args = new getUser_args();\n        args.setId(id);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public User getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_getUser();\n      }\n    }\n\n    public void listUser(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      listUser_call method_call = new listUser_call(pageNo, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class listUser_call extends org.apache.thrift.async.TAsyncMethodCall<UserPage> {\n      private int pageNo;\n      public listUser_call(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.pageNo = pageNo;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"listUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        listUser_args args = new listUser_args();\n        args.setPageNo(pageNo);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public UserPage getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_listUser();\n      }\n    }\n\n  }\n\n  public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor {\n    private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(Processor.class.getName());\n    public Processor(I iface) {\n      super(iface, getProcessMap(new java.util.HashMap<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>>()));\n    }\n\n    protected Processor(I iface, java.util.Map<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> processMap) {\n      super(iface, getProcessMap(processMap));\n    }\n\n    private static <I extends Iface> java.util.Map<java.lang.String,  org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> getProcessMap(java.util.Map<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) {\n      processMap.put(\"userExist\", new userExist());\n      processMap.put(\"createUser\", new createUser());\n      processMap.put(\"getUser\", new getUser());\n      processMap.put(\"listUser\", new listUser());\n      return processMap;\n    }\n\n    public static class userExist<I extends Iface> extends org.apache.thrift.ProcessFunction<I, userExist_args> {\n      public userExist() {\n        super(\"userExist\");\n      }\n\n      public userExist_args getEmptyArgsInstance() {\n        return new userExist_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public userExist_result getResult(I iface, userExist_args args) throws org.apache.thrift.TException {\n        userExist_result result = new userExist_result();\n        result.success = iface.userExist(args.email);\n        result.setSuccessIsSet(true);\n        return result;\n      }\n    }\n\n    public static class createUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, createUser_args> {\n      public createUser() {\n        super(\"createUser\");\n      }\n\n      public createUser_args getEmptyArgsInstance() {\n        return new createUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public createUser_result getResult(I iface, createUser_args args) throws org.apache.thrift.TException {\n        createUser_result result = new createUser_result();\n        result.success = iface.createUser(args.user);\n        result.setSuccessIsSet(true);\n        return result;\n      }\n    }\n\n    public static class getUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, getUser_args> {\n      public getUser() {\n        super(\"getUser\");\n      }\n\n      public getUser_args getEmptyArgsInstance() {\n        return new getUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public getUser_result getResult(I iface, getUser_args args) throws org.apache.thrift.TException {\n        getUser_result result = new getUser_result();\n        result.success = iface.getUser(args.id);\n        return result;\n      }\n    }\n\n    public static class listUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, listUser_args> {\n      public listUser() {\n        super(\"listUser\");\n      }\n\n      public listUser_args getEmptyArgsInstance() {\n        return new listUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public listUser_result getResult(I iface, listUser_args args) throws org.apache.thrift.TException {\n        listUser_result result = new listUser_result();\n        result.success = iface.listUser(args.pageNo);\n        return result;\n      }\n    }\n\n  }\n\n  public static class AsyncProcessor<I extends AsyncIface> extends org.apache.thrift.TBaseAsyncProcessor<I> {\n    private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(AsyncProcessor.class.getName());\n    public AsyncProcessor(I iface) {\n      super(iface, getProcessMap(new java.util.HashMap<java.lang.String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>>()));\n    }\n\n    protected AsyncProcessor(I iface, java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {\n      super(iface, getProcessMap(processMap));\n    }\n\n    private static <I extends AsyncIface> java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase,?>> getProcessMap(java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {\n      processMap.put(\"userExist\", new userExist());\n      processMap.put(\"createUser\", new createUser());\n      processMap.put(\"getUser\", new getUser());\n      processMap.put(\"listUser\", new listUser());\n      return processMap;\n    }\n\n    public static class userExist<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, userExist_args, java.lang.Boolean> {\n      public userExist() {\n        super(\"userExist\");\n      }\n\n      public userExist_args getEmptyArgsInstance() {\n        return new userExist_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean>() { \n          public void onComplete(java.lang.Boolean o) {\n            userExist_result result = new userExist_result();\n            result.success = o;\n            result.setSuccessIsSet(true);\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            userExist_result result = new userExist_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, userExist_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n        iface.userExist(args.email,resultHandler);\n      }\n    }\n\n    public static class createUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, createUser_args, java.lang.Boolean> {\n      public createUser() {\n        super(\"createUser\");\n      }\n\n      public createUser_args getEmptyArgsInstance() {\n        return new createUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean>() { \n          public void onComplete(java.lang.Boolean o) {\n            createUser_result result = new createUser_result();\n            result.success = o;\n            result.setSuccessIsSet(true);\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            createUser_result result = new createUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, createUser_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n        iface.createUser(args.user,resultHandler);\n      }\n    }\n\n    public static class getUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, getUser_args, User> {\n      public getUser() {\n        super(\"getUser\");\n      }\n\n      public getUser_args getEmptyArgsInstance() {\n        return new getUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<User> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<User>() { \n          public void onComplete(User o) {\n            getUser_result result = new getUser_result();\n            result.success = o;\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            getUser_result result = new getUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, getUser_args args, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException {\n        iface.getUser(args.id,resultHandler);\n      }\n    }\n\n    public static class listUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, listUser_args, UserPage> {\n      public listUser() {\n        super(\"listUser\");\n      }\n\n      public listUser_args getEmptyArgsInstance() {\n        return new listUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<UserPage> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<UserPage>() { \n          public void onComplete(UserPage o) {\n            listUser_result result = new listUser_result();\n            result.success = o;\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            listUser_result result = new listUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, listUser_args args, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException {\n        iface.listUser(args.pageNo,resultHandler);\n      }\n    }\n\n  }\n\n  public static class userExist_args implements org.apache.thrift.TBase<userExist_args, userExist_args._Fields>, java.io.Serializable, Cloneable, Comparable<userExist_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"userExist_args\");\n\n    private static final org.apache.thrift.protocol.TField EMAIL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"email\", org.apache.thrift.protocol.TType.STRING, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new userExist_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new userExist_argsTupleSchemeFactory();\n\n    public java.lang.String email; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      EMAIL((short)1, \"email\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // EMAIL\n            return EMAIL;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.EMAIL, new org.apache.thrift.meta_data.FieldMetaData(\"email\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(userExist_args.class, metaDataMap);\n    }\n\n    public userExist_args() {\n    }\n\n    public userExist_args(\n      java.lang.String email)\n    {\n      this();\n      this.email = email;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public userExist_args(userExist_args other) {\n      if (other.isSetEmail()) {\n        this.email = other.email;\n      }\n    }\n\n    public userExist_args deepCopy() {\n      return new userExist_args(this);\n    }\n\n    @Override\n    public void clear() {\n      this.email = null;\n    }\n\n    public java.lang.String getEmail() {\n      return this.email;\n    }\n\n    public userExist_args setEmail(java.lang.String email) {\n      this.email = email;\n      return this;\n    }\n\n    public void unsetEmail() {\n      this.email = null;\n    }\n\n    /** Returns true if field email is set (has been assigned a value) and false otherwise */\n    public boolean isSetEmail() {\n      return this.email != null;\n    }\n\n    public void setEmailIsSet(boolean value) {\n      if (!value) {\n        this.email = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case EMAIL:\n        if (value == null) {\n          unsetEmail();\n        } else {\n          setEmail((java.lang.String)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case EMAIL:\n        return getEmail();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case EMAIL:\n        return isSetEmail();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof userExist_args)\n        return this.equals((userExist_args)that);\n      return false;\n    }\n\n    public boolean equals(userExist_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_email = true && this.isSetEmail();\n      boolean that_present_email = true && that.isSetEmail();\n      if (this_present_email || that_present_email) {\n        if (!(this_present_email && that_present_email))\n          return false;\n        if (!this.email.equals(that.email))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetEmail()) ? 131071 : 524287);\n      if (isSetEmail())\n        hashCode = hashCode * 8191 + email.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(userExist_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetEmail()).compareTo(other.isSetEmail());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetEmail()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.email, other.email);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"userExist_args(\");\n      boolean first = true;\n\n      sb.append(\"email:\");\n      if (this.email == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.email);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class userExist_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_argsStandardScheme getScheme() {\n        return new userExist_argsStandardScheme();\n      }\n    }\n\n    private static class userExist_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<userExist_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // EMAIL\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n                struct.email = iprot.readString();\n                struct.setEmailIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, userExist_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.email != null) {\n          oprot.writeFieldBegin(EMAIL_FIELD_DESC);\n          oprot.writeString(struct.email);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class userExist_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_argsTupleScheme getScheme() {\n        return new userExist_argsTupleScheme();\n      }\n    }\n\n    private static class userExist_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<userExist_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetEmail()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetEmail()) {\n          oprot.writeString(struct.email);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.email = iprot.readString();\n          struct.setEmailIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class userExist_result implements org.apache.thrift.TBase<userExist_result, userExist_result._Fields>, java.io.Serializable, Cloneable, Comparable<userExist_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"userExist_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.BOOL, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new userExist_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new userExist_resultTupleSchemeFactory();\n\n    public boolean success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __SUCCESS_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(userExist_result.class, metaDataMap);\n    }\n\n    public userExist_result() {\n    }\n\n    public userExist_result(\n      boolean success)\n    {\n      this();\n      this.success = success;\n      setSuccessIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public userExist_result(userExist_result other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.success = other.success;\n    }\n\n    public userExist_result deepCopy() {\n      return new userExist_result(this);\n    }\n\n    @Override\n    public void clear() {\n      setSuccessIsSet(false);\n      this.success = false;\n    }\n\n    public boolean isSuccess() {\n      return this.success;\n    }\n\n    public userExist_result setSuccess(boolean success) {\n      this.success = success;\n      setSuccessIsSet(true);\n      return this;\n    }\n\n    public void unsetSuccess() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((java.lang.Boolean)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return isSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof userExist_result)\n        return this.equals((userExist_result)that);\n      return false;\n    }\n\n    public boolean equals(userExist_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true;\n      boolean that_present_success = true;\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (this.success != that.success)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((success) ? 131071 : 524287);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(userExist_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"userExist_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      sb.append(this.success);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class userExist_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_resultStandardScheme getScheme() {\n        return new userExist_resultStandardScheme();\n      }\n    }\n\n    private static class userExist_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<userExist_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {\n                struct.success = iprot.readBool();\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, userExist_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.isSetSuccess()) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          oprot.writeBool(struct.success);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class userExist_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_resultTupleScheme getScheme() {\n        return new userExist_resultTupleScheme();\n      }\n    }\n\n    private static class userExist_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<userExist_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          oprot.writeBool(struct.success);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = iprot.readBool();\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class createUser_args implements org.apache.thrift.TBase<createUser_args, createUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<createUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"createUser_args\");\n\n    private static final org.apache.thrift.protocol.TField USER_FIELD_DESC = new org.apache.thrift.protocol.TField(\"user\", org.apache.thrift.protocol.TType.STRUCT, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new createUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new createUser_argsTupleSchemeFactory();\n\n    public User user; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      USER((short)1, \"user\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // USER\n            return USER;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.USER, new org.apache.thrift.meta_data.FieldMetaData(\"user\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(createUser_args.class, metaDataMap);\n    }\n\n    public createUser_args() {\n    }\n\n    public createUser_args(\n      User user)\n    {\n      this();\n      this.user = user;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public createUser_args(createUser_args other) {\n      if (other.isSetUser()) {\n        this.user = new User(other.user);\n      }\n    }\n\n    public createUser_args deepCopy() {\n      return new createUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      this.user = null;\n    }\n\n    public User getUser() {\n      return this.user;\n    }\n\n    public createUser_args setUser(User user) {\n      this.user = user;\n      return this;\n    }\n\n    public void unsetUser() {\n      this.user = null;\n    }\n\n    /** Returns true if field user is set (has been assigned a value) and false otherwise */\n    public boolean isSetUser() {\n      return this.user != null;\n    }\n\n    public void setUserIsSet(boolean value) {\n      if (!value) {\n        this.user = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case USER:\n        if (value == null) {\n          unsetUser();\n        } else {\n          setUser((User)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case USER:\n        return getUser();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case USER:\n        return isSetUser();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof createUser_args)\n        return this.equals((createUser_args)that);\n      return false;\n    }\n\n    public boolean equals(createUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_user = true && this.isSetUser();\n      boolean that_present_user = true && that.isSetUser();\n      if (this_present_user || that_present_user) {\n        if (!(this_present_user && that_present_user))\n          return false;\n        if (!this.user.equals(that.user))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetUser()) ? 131071 : 524287);\n      if (isSetUser())\n        hashCode = hashCode * 8191 + user.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(createUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetUser()).compareTo(other.isSetUser());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetUser()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.user, other.user);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"createUser_args(\");\n      boolean first = true;\n\n      sb.append(\"user:\");\n      if (this.user == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.user);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (user != null) {\n        user.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class createUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_argsStandardScheme getScheme() {\n        return new createUser_argsStandardScheme();\n      }\n    }\n\n    private static class createUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<createUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // USER\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.user = new User();\n                struct.user.read(iprot);\n                struct.setUserIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, createUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.user != null) {\n          oprot.writeFieldBegin(USER_FIELD_DESC);\n          struct.user.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class createUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_argsTupleScheme getScheme() {\n        return new createUser_argsTupleScheme();\n      }\n    }\n\n    private static class createUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<createUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetUser()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetUser()) {\n          struct.user.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.user = new User();\n          struct.user.read(iprot);\n          struct.setUserIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class createUser_result implements org.apache.thrift.TBase<createUser_result, createUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<createUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"createUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.BOOL, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new createUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new createUser_resultTupleSchemeFactory();\n\n    public boolean success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __SUCCESS_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(createUser_result.class, metaDataMap);\n    }\n\n    public createUser_result() {\n    }\n\n    public createUser_result(\n      boolean success)\n    {\n      this();\n      this.success = success;\n      setSuccessIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public createUser_result(createUser_result other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.success = other.success;\n    }\n\n    public createUser_result deepCopy() {\n      return new createUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      setSuccessIsSet(false);\n      this.success = false;\n    }\n\n    public boolean isSuccess() {\n      return this.success;\n    }\n\n    public createUser_result setSuccess(boolean success) {\n      this.success = success;\n      setSuccessIsSet(true);\n      return this;\n    }\n\n    public void unsetSuccess() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((java.lang.Boolean)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return isSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof createUser_result)\n        return this.equals((createUser_result)that);\n      return false;\n    }\n\n    public boolean equals(createUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true;\n      boolean that_present_success = true;\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (this.success != that.success)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((success) ? 131071 : 524287);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(createUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"createUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      sb.append(this.success);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class createUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_resultStandardScheme getScheme() {\n        return new createUser_resultStandardScheme();\n      }\n    }\n\n    private static class createUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<createUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {\n                struct.success = iprot.readBool();\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, createUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.isSetSuccess()) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          oprot.writeBool(struct.success);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class createUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_resultTupleScheme getScheme() {\n        return new createUser_resultTupleScheme();\n      }\n    }\n\n    private static class createUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<createUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          oprot.writeBool(struct.success);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = iprot.readBool();\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class getUser_args implements org.apache.thrift.TBase<getUser_args, getUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<getUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"getUser_args\");\n\n    private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField(\"id\", org.apache.thrift.protocol.TType.I64, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getUser_argsTupleSchemeFactory();\n\n    public long id; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      ID((short)1, \"id\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // ID\n            return ID;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __ID_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData(\"id\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getUser_args.class, metaDataMap);\n    }\n\n    public getUser_args() {\n    }\n\n    public getUser_args(\n      long id)\n    {\n      this();\n      this.id = id;\n      setIdIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public getUser_args(getUser_args other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.id = other.id;\n    }\n\n    public getUser_args deepCopy() {\n      return new getUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      setIdIsSet(false);\n      this.id = 0;\n    }\n\n    public long getId() {\n      return this.id;\n    }\n\n    public getUser_args setId(long id) {\n      this.id = id;\n      setIdIsSet(true);\n      return this;\n    }\n\n    public void unsetId() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ID_ISSET_ID);\n    }\n\n    /** Returns true if field id is set (has been assigned a value) and false otherwise */\n    public boolean isSetId() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ID_ISSET_ID);\n    }\n\n    public void setIdIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ID_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case ID:\n        if (value == null) {\n          unsetId();\n        } else {\n          setId((java.lang.Long)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case ID:\n        return getId();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case ID:\n        return isSetId();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof getUser_args)\n        return this.equals((getUser_args)that);\n      return false;\n    }\n\n    public boolean equals(getUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_id = true;\n      boolean that_present_id = true;\n      if (this_present_id || that_present_id) {\n        if (!(this_present_id && that_present_id))\n          return false;\n        if (this.id != that.id)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(id);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(getUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetId()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"getUser_args(\");\n      boolean first = true;\n\n      sb.append(\"id:\");\n      sb.append(this.id);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class getUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_argsStandardScheme getScheme() {\n        return new getUser_argsStandardScheme();\n      }\n    }\n\n    private static class getUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<getUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // ID\n              if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n                struct.id = iprot.readI64();\n                struct.setIdIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, getUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        oprot.writeFieldBegin(ID_FIELD_DESC);\n        oprot.writeI64(struct.id);\n        oprot.writeFieldEnd();\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class getUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_argsTupleScheme getScheme() {\n        return new getUser_argsTupleScheme();\n      }\n    }\n\n    private static class getUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<getUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetId()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetId()) {\n          oprot.writeI64(struct.id);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.id = iprot.readI64();\n          struct.setIdIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class getUser_result implements org.apache.thrift.TBase<getUser_result, getUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<getUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"getUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.STRUCT, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getUser_resultTupleSchemeFactory();\n\n    public User success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getUser_result.class, metaDataMap);\n    }\n\n    public getUser_result() {\n    }\n\n    public getUser_result(\n      User success)\n    {\n      this();\n      this.success = success;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public getUser_result(getUser_result other) {\n      if (other.isSetSuccess()) {\n        this.success = new User(other.success);\n      }\n    }\n\n    public getUser_result deepCopy() {\n      return new getUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      this.success = null;\n    }\n\n    public User getSuccess() {\n      return this.success;\n    }\n\n    public getUser_result setSuccess(User success) {\n      this.success = success;\n      return this;\n    }\n\n    public void unsetSuccess() {\n      this.success = null;\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return this.success != null;\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      if (!value) {\n        this.success = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((User)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return getSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof getUser_result)\n        return this.equals((getUser_result)that);\n      return false;\n    }\n\n    public boolean equals(getUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true && this.isSetSuccess();\n      boolean that_present_success = true && that.isSetSuccess();\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (!this.success.equals(that.success))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287);\n      if (isSetSuccess())\n        hashCode = hashCode * 8191 + success.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(getUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"getUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      if (this.success == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.success);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (success != null) {\n        success.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class getUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_resultStandardScheme getScheme() {\n        return new getUser_resultStandardScheme();\n      }\n    }\n\n    private static class getUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<getUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.success = new User();\n                struct.success.read(iprot);\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, getUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.success != null) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          struct.success.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class getUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_resultTupleScheme getScheme() {\n        return new getUser_resultTupleScheme();\n      }\n    }\n\n    private static class getUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<getUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          struct.success.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = new User();\n          struct.success.read(iprot);\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class listUser_args implements org.apache.thrift.TBase<listUser_args, listUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<listUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"listUser_args\");\n\n    private static final org.apache.thrift.protocol.TField PAGE_NO_FIELD_DESC = new org.apache.thrift.protocol.TField(\"pageNo\", org.apache.thrift.protocol.TType.I32, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new listUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new listUser_argsTupleSchemeFactory();\n\n    public int pageNo; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      PAGE_NO((short)1, \"pageNo\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // PAGE_NO\n            return PAGE_NO;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __PAGENO_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.PAGE_NO, new org.apache.thrift.meta_data.FieldMetaData(\"pageNo\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(listUser_args.class, metaDataMap);\n    }\n\n    public listUser_args() {\n    }\n\n    public listUser_args(\n      int pageNo)\n    {\n      this();\n      this.pageNo = pageNo;\n      setPageNoIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public listUser_args(listUser_args other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.pageNo = other.pageNo;\n    }\n\n    public listUser_args deepCopy() {\n      return new listUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      setPageNoIsSet(false);\n      this.pageNo = 0;\n    }\n\n    public int getPageNo() {\n      return this.pageNo;\n    }\n\n    public listUser_args setPageNo(int pageNo) {\n      this.pageNo = pageNo;\n      setPageNoIsSet(true);\n      return this;\n    }\n\n    public void unsetPageNo() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PAGENO_ISSET_ID);\n    }\n\n    /** Returns true if field pageNo is set (has been assigned a value) and false otherwise */\n    public boolean isSetPageNo() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PAGENO_ISSET_ID);\n    }\n\n    public void setPageNoIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PAGENO_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case PAGE_NO:\n        if (value == null) {\n          unsetPageNo();\n        } else {\n          setPageNo((java.lang.Integer)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case PAGE_NO:\n        return getPageNo();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case PAGE_NO:\n        return isSetPageNo();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof listUser_args)\n        return this.equals((listUser_args)that);\n      return false;\n    }\n\n    public boolean equals(listUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_pageNo = true;\n      boolean that_present_pageNo = true;\n      if (this_present_pageNo || that_present_pageNo) {\n        if (!(this_present_pageNo && that_present_pageNo))\n          return false;\n        if (this.pageNo != that.pageNo)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + pageNo;\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(listUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetPageNo()).compareTo(other.isSetPageNo());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetPageNo()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.pageNo, other.pageNo);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"listUser_args(\");\n      boolean first = true;\n\n      sb.append(\"pageNo:\");\n      sb.append(this.pageNo);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class listUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_argsStandardScheme getScheme() {\n        return new listUser_argsStandardScheme();\n      }\n    }\n\n    private static class listUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<listUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // PAGE_NO\n              if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n                struct.pageNo = iprot.readI32();\n                struct.setPageNoIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, listUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        oprot.writeFieldBegin(PAGE_NO_FIELD_DESC);\n        oprot.writeI32(struct.pageNo);\n        oprot.writeFieldEnd();\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class listUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_argsTupleScheme getScheme() {\n        return new listUser_argsTupleScheme();\n      }\n    }\n\n    private static class listUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<listUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetPageNo()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetPageNo()) {\n          oprot.writeI32(struct.pageNo);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.pageNo = iprot.readI32();\n          struct.setPageNoIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class listUser_result implements org.apache.thrift.TBase<listUser_result, listUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<listUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"listUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.STRUCT, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new listUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new listUser_resultTupleSchemeFactory();\n\n    public UserPage success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, UserPage.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(listUser_result.class, metaDataMap);\n    }\n\n    public listUser_result() {\n    }\n\n    public listUser_result(\n      UserPage success)\n    {\n      this();\n      this.success = success;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public listUser_result(listUser_result other) {\n      if (other.isSetSuccess()) {\n        this.success = new UserPage(other.success);\n      }\n    }\n\n    public listUser_result deepCopy() {\n      return new listUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      this.success = null;\n    }\n\n    public UserPage getSuccess() {\n      return this.success;\n    }\n\n    public listUser_result setSuccess(UserPage success) {\n      this.success = success;\n      return this;\n    }\n\n    public void unsetSuccess() {\n      this.success = null;\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return this.success != null;\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      if (!value) {\n        this.success = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((UserPage)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return getSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof listUser_result)\n        return this.equals((listUser_result)that);\n      return false;\n    }\n\n    public boolean equals(listUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true && this.isSetSuccess();\n      boolean that_present_success = true && that.isSetSuccess();\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (!this.success.equals(that.success))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287);\n      if (isSetSuccess())\n        hashCode = hashCode * 8191 + success.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(listUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"listUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      if (this.success == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.success);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (success != null) {\n        success.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class listUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_resultStandardScheme getScheme() {\n        return new listUser_resultStandardScheme();\n      }\n    }\n\n    private static class listUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<listUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.success = new UserPage();\n                struct.success.read(iprot);\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, listUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.success != null) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          struct.success.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class listUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_resultTupleScheme getScheme() {\n        return new listUser_resultTupleScheme();\n      }\n    }\n\n    private static class listUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<listUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          struct.success.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = new UserPage();\n          struct.success.read(iprot);\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n}\n"
  },
  {
    "path": "thrift-server/src/main/java/benchmark/rpc/thrift/UserServiceThriftServerImpl.java",
    "content": "package benchmark.rpc.thrift;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.apache.thrift.TException;\n\nimport benchmark.bean.Page;\nimport benchmark.service.UserServiceServerImpl;\n\npublic class UserServiceThriftServerImpl implements UserService.Iface {\n\n\tprivate final benchmark.service.UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tpublic boolean userExist(String email) throws TException {\n\t\treturn userService.existUser(email);\n\t}\n\n\t@Override\n\tpublic boolean createUser(User user) throws TException {\n\t\tbenchmark.bean.User rawUser = Converter.toRaw(user);\n\t\treturn userService.createUser(rawUser);\n\t}\n\n\t@Override\n\tpublic User getUser(long id) throws TException {\n\t\tbenchmark.bean.User rawUser = userService.getUser(id);\n\t\tUser user = Converter.toThrift(rawUser);\n\n\t\treturn user;\n\t}\n\n\t@Override\n\tpublic UserPage listUser(int pageNo) throws TException {\n\t\tPage<benchmark.bean.User> page = userService.listUser(pageNo);\n\n\t\tList<User> userList = new ArrayList<>();\n\t\tfor (benchmark.bean.User rawUser : page.getResult()) {\n\t\t\tUser user = Converter.toThrift(rawUser);\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tUserPage userPage = new UserPage();\n\t\tuserPage.setPageNo(page.getPageNo());\n\t\tuserPage.setTotal(page.getTotal());\n\t\tuserPage.setResult(userList);\n\n\t\treturn userPage;\n\t}\n\n}\n"
  },
  {
    "path": "thrift-server/src/main/thrift/UserService.thrift",
    "content": "namespace java benchmark.rpc.thrift\n \nstruct User {\n\t1: i64 id,\n\t2: string name,\n\t3: i32 sex,\n\t4: i32 birthday,\n\t5: string email,\n\t6: string mobile,\n\t7: string address,\n\t8: string icon,\n\t9: list<i32> permissions,\n\t10: i32 status,\n\t11: i64 createTime,\n\t12: i64 updateTime,\n}\n\nstruct UserPage {\n  \t1: i32 pageNo,\n\t2: i32 total,\n\t3: list<User> result,\n}\n \nservice UserService {\n    \n\tbool userExist(1: string email),\n  \n\tbool createUser(1: User user),\n  \n\tUser getUser(1: i64 id),\n  \n\tUserPage listUser(1: i32 pageNo)\n}"
  },
  {
    "path": "thrift-server/src/main/thrift/gen-java/benchmark/rpc/thrift/User.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class User implements org.apache.thrift.TBase<User, User._Fields>, java.io.Serializable, Cloneable, Comparable<User> {\n  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"User\");\n\n  private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField(\"id\", org.apache.thrift.protocol.TType.I64, (short)1);\n  private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"name\", org.apache.thrift.protocol.TType.STRING, (short)2);\n  private static final org.apache.thrift.protocol.TField SEX_FIELD_DESC = new org.apache.thrift.protocol.TField(\"sex\", org.apache.thrift.protocol.TType.I32, (short)3);\n  private static final org.apache.thrift.protocol.TField BIRTHDAY_FIELD_DESC = new org.apache.thrift.protocol.TField(\"birthday\", org.apache.thrift.protocol.TType.I32, (short)4);\n  private static final org.apache.thrift.protocol.TField EMAIL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"email\", org.apache.thrift.protocol.TType.STRING, (short)5);\n  private static final org.apache.thrift.protocol.TField MOBILE_FIELD_DESC = new org.apache.thrift.protocol.TField(\"mobile\", org.apache.thrift.protocol.TType.STRING, (short)6);\n  private static final org.apache.thrift.protocol.TField ADDRESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"address\", org.apache.thrift.protocol.TType.STRING, (short)7);\n  private static final org.apache.thrift.protocol.TField ICON_FIELD_DESC = new org.apache.thrift.protocol.TField(\"icon\", org.apache.thrift.protocol.TType.STRING, (short)8);\n  private static final org.apache.thrift.protocol.TField PERMISSIONS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"permissions\", org.apache.thrift.protocol.TType.LIST, (short)9);\n  private static final org.apache.thrift.protocol.TField STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"status\", org.apache.thrift.protocol.TType.I32, (short)10);\n  private static final org.apache.thrift.protocol.TField CREATE_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"createTime\", org.apache.thrift.protocol.TType.I64, (short)11);\n  private static final org.apache.thrift.protocol.TField UPDATE_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField(\"updateTime\", org.apache.thrift.protocol.TType.I64, (short)12);\n\n  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new UserStandardSchemeFactory();\n  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new UserTupleSchemeFactory();\n\n  public long id; // required\n  public java.lang.String name; // required\n  public int sex; // required\n  public int birthday; // required\n  public java.lang.String email; // required\n  public java.lang.String mobile; // required\n  public java.lang.String address; // required\n  public java.lang.String icon; // required\n  public java.util.List<java.lang.Integer> permissions; // required\n  public int status; // required\n  public long createTime; // required\n  public long updateTime; // required\n\n  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n  public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n    ID((short)1, \"id\"),\n    NAME((short)2, \"name\"),\n    SEX((short)3, \"sex\"),\n    BIRTHDAY((short)4, \"birthday\"),\n    EMAIL((short)5, \"email\"),\n    MOBILE((short)6, \"mobile\"),\n    ADDRESS((short)7, \"address\"),\n    ICON((short)8, \"icon\"),\n    PERMISSIONS((short)9, \"permissions\"),\n    STATUS((short)10, \"status\"),\n    CREATE_TIME((short)11, \"createTime\"),\n    UPDATE_TIME((short)12, \"updateTime\");\n\n    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n    static {\n      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n        byName.put(field.getFieldName(), field);\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, or null if its not found.\n     */\n    public static _Fields findByThriftId(int fieldId) {\n      switch(fieldId) {\n        case 1: // ID\n          return ID;\n        case 2: // NAME\n          return NAME;\n        case 3: // SEX\n          return SEX;\n        case 4: // BIRTHDAY\n          return BIRTHDAY;\n        case 5: // EMAIL\n          return EMAIL;\n        case 6: // MOBILE\n          return MOBILE;\n        case 7: // ADDRESS\n          return ADDRESS;\n        case 8: // ICON\n          return ICON;\n        case 9: // PERMISSIONS\n          return PERMISSIONS;\n        case 10: // STATUS\n          return STATUS;\n        case 11: // CREATE_TIME\n          return CREATE_TIME;\n        case 12: // UPDATE_TIME\n          return UPDATE_TIME;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, throwing an exception\n     * if it is not found.\n     */\n    public static _Fields findByThriftIdOrThrow(int fieldId) {\n      _Fields fields = findByThriftId(fieldId);\n      if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n      return fields;\n    }\n\n    /**\n     * Find the _Fields constant that matches name, or null if its not found.\n     */\n    public static _Fields findByName(java.lang.String name) {\n      return byName.get(name);\n    }\n\n    private final short _thriftId;\n    private final java.lang.String _fieldName;\n\n    _Fields(short thriftId, java.lang.String fieldName) {\n      _thriftId = thriftId;\n      _fieldName = fieldName;\n    }\n\n    public short getThriftFieldId() {\n      return _thriftId;\n    }\n\n    public java.lang.String getFieldName() {\n      return _fieldName;\n    }\n  }\n\n  // isset id assignments\n  private static final int __ID_ISSET_ID = 0;\n  private static final int __SEX_ISSET_ID = 1;\n  private static final int __BIRTHDAY_ISSET_ID = 2;\n  private static final int __STATUS_ISSET_ID = 3;\n  private static final int __CREATETIME_ISSET_ID = 4;\n  private static final int __UPDATETIME_ISSET_ID = 5;\n  private byte __isset_bitfield = 0;\n  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n  static {\n    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n    tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData(\"id\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    tmpMap.put(_Fields.NAME, new org.apache.thrift.meta_data.FieldMetaData(\"name\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.SEX, new org.apache.thrift.meta_data.FieldMetaData(\"sex\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.BIRTHDAY, new org.apache.thrift.meta_data.FieldMetaData(\"birthday\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.EMAIL, new org.apache.thrift.meta_data.FieldMetaData(\"email\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.MOBILE, new org.apache.thrift.meta_data.FieldMetaData(\"mobile\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.ADDRESS, new org.apache.thrift.meta_data.FieldMetaData(\"address\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.ICON, new org.apache.thrift.meta_data.FieldMetaData(\"icon\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    tmpMap.put(_Fields.PERMISSIONS, new org.apache.thrift.meta_data.FieldMetaData(\"permissions\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, \n            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32))));\n    tmpMap.put(_Fields.STATUS, new org.apache.thrift.meta_data.FieldMetaData(\"status\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.CREATE_TIME, new org.apache.thrift.meta_data.FieldMetaData(\"createTime\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    tmpMap.put(_Fields.UPDATE_TIME, new org.apache.thrift.meta_data.FieldMetaData(\"updateTime\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(User.class, metaDataMap);\n  }\n\n  public User() {\n  }\n\n  public User(\n    long id,\n    java.lang.String name,\n    int sex,\n    int birthday,\n    java.lang.String email,\n    java.lang.String mobile,\n    java.lang.String address,\n    java.lang.String icon,\n    java.util.List<java.lang.Integer> permissions,\n    int status,\n    long createTime,\n    long updateTime)\n  {\n    this();\n    this.id = id;\n    setIdIsSet(true);\n    this.name = name;\n    this.sex = sex;\n    setSexIsSet(true);\n    this.birthday = birthday;\n    setBirthdayIsSet(true);\n    this.email = email;\n    this.mobile = mobile;\n    this.address = address;\n    this.icon = icon;\n    this.permissions = permissions;\n    this.status = status;\n    setStatusIsSet(true);\n    this.createTime = createTime;\n    setCreateTimeIsSet(true);\n    this.updateTime = updateTime;\n    setUpdateTimeIsSet(true);\n  }\n\n  /**\n   * Performs a deep copy on <i>other</i>.\n   */\n  public User(User other) {\n    __isset_bitfield = other.__isset_bitfield;\n    this.id = other.id;\n    if (other.isSetName()) {\n      this.name = other.name;\n    }\n    this.sex = other.sex;\n    this.birthday = other.birthday;\n    if (other.isSetEmail()) {\n      this.email = other.email;\n    }\n    if (other.isSetMobile()) {\n      this.mobile = other.mobile;\n    }\n    if (other.isSetAddress()) {\n      this.address = other.address;\n    }\n    if (other.isSetIcon()) {\n      this.icon = other.icon;\n    }\n    if (other.isSetPermissions()) {\n      java.util.List<java.lang.Integer> __this__permissions = new java.util.ArrayList<java.lang.Integer>(other.permissions);\n      this.permissions = __this__permissions;\n    }\n    this.status = other.status;\n    this.createTime = other.createTime;\n    this.updateTime = other.updateTime;\n  }\n\n  public User deepCopy() {\n    return new User(this);\n  }\n\n  @Override\n  public void clear() {\n    setIdIsSet(false);\n    this.id = 0;\n    this.name = null;\n    setSexIsSet(false);\n    this.sex = 0;\n    setBirthdayIsSet(false);\n    this.birthday = 0;\n    this.email = null;\n    this.mobile = null;\n    this.address = null;\n    this.icon = null;\n    this.permissions = null;\n    setStatusIsSet(false);\n    this.status = 0;\n    setCreateTimeIsSet(false);\n    this.createTime = 0;\n    setUpdateTimeIsSet(false);\n    this.updateTime = 0;\n  }\n\n  public long getId() {\n    return this.id;\n  }\n\n  public User setId(long id) {\n    this.id = id;\n    setIdIsSet(true);\n    return this;\n  }\n\n  public void unsetId() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ID_ISSET_ID);\n  }\n\n  /** Returns true if field id is set (has been assigned a value) and false otherwise */\n  public boolean isSetId() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ID_ISSET_ID);\n  }\n\n  public void setIdIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ID_ISSET_ID, value);\n  }\n\n  public java.lang.String getName() {\n    return this.name;\n  }\n\n  public User setName(java.lang.String name) {\n    this.name = name;\n    return this;\n  }\n\n  public void unsetName() {\n    this.name = null;\n  }\n\n  /** Returns true if field name is set (has been assigned a value) and false otherwise */\n  public boolean isSetName() {\n    return this.name != null;\n  }\n\n  public void setNameIsSet(boolean value) {\n    if (!value) {\n      this.name = null;\n    }\n  }\n\n  public int getSex() {\n    return this.sex;\n  }\n\n  public User setSex(int sex) {\n    this.sex = sex;\n    setSexIsSet(true);\n    return this;\n  }\n\n  public void unsetSex() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SEX_ISSET_ID);\n  }\n\n  /** Returns true if field sex is set (has been assigned a value) and false otherwise */\n  public boolean isSetSex() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SEX_ISSET_ID);\n  }\n\n  public void setSexIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SEX_ISSET_ID, value);\n  }\n\n  public int getBirthday() {\n    return this.birthday;\n  }\n\n  public User setBirthday(int birthday) {\n    this.birthday = birthday;\n    setBirthdayIsSet(true);\n    return this;\n  }\n\n  public void unsetBirthday() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __BIRTHDAY_ISSET_ID);\n  }\n\n  /** Returns true if field birthday is set (has been assigned a value) and false otherwise */\n  public boolean isSetBirthday() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __BIRTHDAY_ISSET_ID);\n  }\n\n  public void setBirthdayIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __BIRTHDAY_ISSET_ID, value);\n  }\n\n  public java.lang.String getEmail() {\n    return this.email;\n  }\n\n  public User setEmail(java.lang.String email) {\n    this.email = email;\n    return this;\n  }\n\n  public void unsetEmail() {\n    this.email = null;\n  }\n\n  /** Returns true if field email is set (has been assigned a value) and false otherwise */\n  public boolean isSetEmail() {\n    return this.email != null;\n  }\n\n  public void setEmailIsSet(boolean value) {\n    if (!value) {\n      this.email = null;\n    }\n  }\n\n  public java.lang.String getMobile() {\n    return this.mobile;\n  }\n\n  public User setMobile(java.lang.String mobile) {\n    this.mobile = mobile;\n    return this;\n  }\n\n  public void unsetMobile() {\n    this.mobile = null;\n  }\n\n  /** Returns true if field mobile is set (has been assigned a value) and false otherwise */\n  public boolean isSetMobile() {\n    return this.mobile != null;\n  }\n\n  public void setMobileIsSet(boolean value) {\n    if (!value) {\n      this.mobile = null;\n    }\n  }\n\n  public java.lang.String getAddress() {\n    return this.address;\n  }\n\n  public User setAddress(java.lang.String address) {\n    this.address = address;\n    return this;\n  }\n\n  public void unsetAddress() {\n    this.address = null;\n  }\n\n  /** Returns true if field address is set (has been assigned a value) and false otherwise */\n  public boolean isSetAddress() {\n    return this.address != null;\n  }\n\n  public void setAddressIsSet(boolean value) {\n    if (!value) {\n      this.address = null;\n    }\n  }\n\n  public java.lang.String getIcon() {\n    return this.icon;\n  }\n\n  public User setIcon(java.lang.String icon) {\n    this.icon = icon;\n    return this;\n  }\n\n  public void unsetIcon() {\n    this.icon = null;\n  }\n\n  /** Returns true if field icon is set (has been assigned a value) and false otherwise */\n  public boolean isSetIcon() {\n    return this.icon != null;\n  }\n\n  public void setIconIsSet(boolean value) {\n    if (!value) {\n      this.icon = null;\n    }\n  }\n\n  public int getPermissionsSize() {\n    return (this.permissions == null) ? 0 : this.permissions.size();\n  }\n\n  public java.util.Iterator<java.lang.Integer> getPermissionsIterator() {\n    return (this.permissions == null) ? null : this.permissions.iterator();\n  }\n\n  public void addToPermissions(int elem) {\n    if (this.permissions == null) {\n      this.permissions = new java.util.ArrayList<java.lang.Integer>();\n    }\n    this.permissions.add(elem);\n  }\n\n  public java.util.List<java.lang.Integer> getPermissions() {\n    return this.permissions;\n  }\n\n  public User setPermissions(java.util.List<java.lang.Integer> permissions) {\n    this.permissions = permissions;\n    return this;\n  }\n\n  public void unsetPermissions() {\n    this.permissions = null;\n  }\n\n  /** Returns true if field permissions is set (has been assigned a value) and false otherwise */\n  public boolean isSetPermissions() {\n    return this.permissions != null;\n  }\n\n  public void setPermissionsIsSet(boolean value) {\n    if (!value) {\n      this.permissions = null;\n    }\n  }\n\n  public int getStatus() {\n    return this.status;\n  }\n\n  public User setStatus(int status) {\n    this.status = status;\n    setStatusIsSet(true);\n    return this;\n  }\n\n  public void unsetStatus() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __STATUS_ISSET_ID);\n  }\n\n  /** Returns true if field status is set (has been assigned a value) and false otherwise */\n  public boolean isSetStatus() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __STATUS_ISSET_ID);\n  }\n\n  public void setStatusIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __STATUS_ISSET_ID, value);\n  }\n\n  public long getCreateTime() {\n    return this.createTime;\n  }\n\n  public User setCreateTime(long createTime) {\n    this.createTime = createTime;\n    setCreateTimeIsSet(true);\n    return this;\n  }\n\n  public void unsetCreateTime() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __CREATETIME_ISSET_ID);\n  }\n\n  /** Returns true if field createTime is set (has been assigned a value) and false otherwise */\n  public boolean isSetCreateTime() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __CREATETIME_ISSET_ID);\n  }\n\n  public void setCreateTimeIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __CREATETIME_ISSET_ID, value);\n  }\n\n  public long getUpdateTime() {\n    return this.updateTime;\n  }\n\n  public User setUpdateTime(long updateTime) {\n    this.updateTime = updateTime;\n    setUpdateTimeIsSet(true);\n    return this;\n  }\n\n  public void unsetUpdateTime() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __UPDATETIME_ISSET_ID);\n  }\n\n  /** Returns true if field updateTime is set (has been assigned a value) and false otherwise */\n  public boolean isSetUpdateTime() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __UPDATETIME_ISSET_ID);\n  }\n\n  public void setUpdateTimeIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __UPDATETIME_ISSET_ID, value);\n  }\n\n  public void setFieldValue(_Fields field, java.lang.Object value) {\n    switch (field) {\n    case ID:\n      if (value == null) {\n        unsetId();\n      } else {\n        setId((java.lang.Long)value);\n      }\n      break;\n\n    case NAME:\n      if (value == null) {\n        unsetName();\n      } else {\n        setName((java.lang.String)value);\n      }\n      break;\n\n    case SEX:\n      if (value == null) {\n        unsetSex();\n      } else {\n        setSex((java.lang.Integer)value);\n      }\n      break;\n\n    case BIRTHDAY:\n      if (value == null) {\n        unsetBirthday();\n      } else {\n        setBirthday((java.lang.Integer)value);\n      }\n      break;\n\n    case EMAIL:\n      if (value == null) {\n        unsetEmail();\n      } else {\n        setEmail((java.lang.String)value);\n      }\n      break;\n\n    case MOBILE:\n      if (value == null) {\n        unsetMobile();\n      } else {\n        setMobile((java.lang.String)value);\n      }\n      break;\n\n    case ADDRESS:\n      if (value == null) {\n        unsetAddress();\n      } else {\n        setAddress((java.lang.String)value);\n      }\n      break;\n\n    case ICON:\n      if (value == null) {\n        unsetIcon();\n      } else {\n        setIcon((java.lang.String)value);\n      }\n      break;\n\n    case PERMISSIONS:\n      if (value == null) {\n        unsetPermissions();\n      } else {\n        setPermissions((java.util.List<java.lang.Integer>)value);\n      }\n      break;\n\n    case STATUS:\n      if (value == null) {\n        unsetStatus();\n      } else {\n        setStatus((java.lang.Integer)value);\n      }\n      break;\n\n    case CREATE_TIME:\n      if (value == null) {\n        unsetCreateTime();\n      } else {\n        setCreateTime((java.lang.Long)value);\n      }\n      break;\n\n    case UPDATE_TIME:\n      if (value == null) {\n        unsetUpdateTime();\n      } else {\n        setUpdateTime((java.lang.Long)value);\n      }\n      break;\n\n    }\n  }\n\n  public java.lang.Object getFieldValue(_Fields field) {\n    switch (field) {\n    case ID:\n      return getId();\n\n    case NAME:\n      return getName();\n\n    case SEX:\n      return getSex();\n\n    case BIRTHDAY:\n      return getBirthday();\n\n    case EMAIL:\n      return getEmail();\n\n    case MOBILE:\n      return getMobile();\n\n    case ADDRESS:\n      return getAddress();\n\n    case ICON:\n      return getIcon();\n\n    case PERMISSIONS:\n      return getPermissions();\n\n    case STATUS:\n      return getStatus();\n\n    case CREATE_TIME:\n      return getCreateTime();\n\n    case UPDATE_TIME:\n      return getUpdateTime();\n\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n  public boolean isSet(_Fields field) {\n    if (field == null) {\n      throw new java.lang.IllegalArgumentException();\n    }\n\n    switch (field) {\n    case ID:\n      return isSetId();\n    case NAME:\n      return isSetName();\n    case SEX:\n      return isSetSex();\n    case BIRTHDAY:\n      return isSetBirthday();\n    case EMAIL:\n      return isSetEmail();\n    case MOBILE:\n      return isSetMobile();\n    case ADDRESS:\n      return isSetAddress();\n    case ICON:\n      return isSetIcon();\n    case PERMISSIONS:\n      return isSetPermissions();\n    case STATUS:\n      return isSetStatus();\n    case CREATE_TIME:\n      return isSetCreateTime();\n    case UPDATE_TIME:\n      return isSetUpdateTime();\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  @Override\n  public boolean equals(java.lang.Object that) {\n    if (that == null)\n      return false;\n    if (that instanceof User)\n      return this.equals((User)that);\n    return false;\n  }\n\n  public boolean equals(User that) {\n    if (that == null)\n      return false;\n    if (this == that)\n      return true;\n\n    boolean this_present_id = true;\n    boolean that_present_id = true;\n    if (this_present_id || that_present_id) {\n      if (!(this_present_id && that_present_id))\n        return false;\n      if (this.id != that.id)\n        return false;\n    }\n\n    boolean this_present_name = true && this.isSetName();\n    boolean that_present_name = true && that.isSetName();\n    if (this_present_name || that_present_name) {\n      if (!(this_present_name && that_present_name))\n        return false;\n      if (!this.name.equals(that.name))\n        return false;\n    }\n\n    boolean this_present_sex = true;\n    boolean that_present_sex = true;\n    if (this_present_sex || that_present_sex) {\n      if (!(this_present_sex && that_present_sex))\n        return false;\n      if (this.sex != that.sex)\n        return false;\n    }\n\n    boolean this_present_birthday = true;\n    boolean that_present_birthday = true;\n    if (this_present_birthday || that_present_birthday) {\n      if (!(this_present_birthday && that_present_birthday))\n        return false;\n      if (this.birthday != that.birthday)\n        return false;\n    }\n\n    boolean this_present_email = true && this.isSetEmail();\n    boolean that_present_email = true && that.isSetEmail();\n    if (this_present_email || that_present_email) {\n      if (!(this_present_email && that_present_email))\n        return false;\n      if (!this.email.equals(that.email))\n        return false;\n    }\n\n    boolean this_present_mobile = true && this.isSetMobile();\n    boolean that_present_mobile = true && that.isSetMobile();\n    if (this_present_mobile || that_present_mobile) {\n      if (!(this_present_mobile && that_present_mobile))\n        return false;\n      if (!this.mobile.equals(that.mobile))\n        return false;\n    }\n\n    boolean this_present_address = true && this.isSetAddress();\n    boolean that_present_address = true && that.isSetAddress();\n    if (this_present_address || that_present_address) {\n      if (!(this_present_address && that_present_address))\n        return false;\n      if (!this.address.equals(that.address))\n        return false;\n    }\n\n    boolean this_present_icon = true && this.isSetIcon();\n    boolean that_present_icon = true && that.isSetIcon();\n    if (this_present_icon || that_present_icon) {\n      if (!(this_present_icon && that_present_icon))\n        return false;\n      if (!this.icon.equals(that.icon))\n        return false;\n    }\n\n    boolean this_present_permissions = true && this.isSetPermissions();\n    boolean that_present_permissions = true && that.isSetPermissions();\n    if (this_present_permissions || that_present_permissions) {\n      if (!(this_present_permissions && that_present_permissions))\n        return false;\n      if (!this.permissions.equals(that.permissions))\n        return false;\n    }\n\n    boolean this_present_status = true;\n    boolean that_present_status = true;\n    if (this_present_status || that_present_status) {\n      if (!(this_present_status && that_present_status))\n        return false;\n      if (this.status != that.status)\n        return false;\n    }\n\n    boolean this_present_createTime = true;\n    boolean that_present_createTime = true;\n    if (this_present_createTime || that_present_createTime) {\n      if (!(this_present_createTime && that_present_createTime))\n        return false;\n      if (this.createTime != that.createTime)\n        return false;\n    }\n\n    boolean this_present_updateTime = true;\n    boolean that_present_updateTime = true;\n    if (this_present_updateTime || that_present_updateTime) {\n      if (!(this_present_updateTime && that_present_updateTime))\n        return false;\n      if (this.updateTime != that.updateTime)\n        return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    int hashCode = 1;\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(id);\n\n    hashCode = hashCode * 8191 + ((isSetName()) ? 131071 : 524287);\n    if (isSetName())\n      hashCode = hashCode * 8191 + name.hashCode();\n\n    hashCode = hashCode * 8191 + sex;\n\n    hashCode = hashCode * 8191 + birthday;\n\n    hashCode = hashCode * 8191 + ((isSetEmail()) ? 131071 : 524287);\n    if (isSetEmail())\n      hashCode = hashCode * 8191 + email.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetMobile()) ? 131071 : 524287);\n    if (isSetMobile())\n      hashCode = hashCode * 8191 + mobile.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetAddress()) ? 131071 : 524287);\n    if (isSetAddress())\n      hashCode = hashCode * 8191 + address.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetIcon()) ? 131071 : 524287);\n    if (isSetIcon())\n      hashCode = hashCode * 8191 + icon.hashCode();\n\n    hashCode = hashCode * 8191 + ((isSetPermissions()) ? 131071 : 524287);\n    if (isSetPermissions())\n      hashCode = hashCode * 8191 + permissions.hashCode();\n\n    hashCode = hashCode * 8191 + status;\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(createTime);\n\n    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(updateTime);\n\n    return hashCode;\n  }\n\n  @Override\n  public int compareTo(User other) {\n    if (!getClass().equals(other.getClass())) {\n      return getClass().getName().compareTo(other.getClass().getName());\n    }\n\n    int lastComparison = 0;\n\n    lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetId()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetName()).compareTo(other.isSetName());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetName()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.name, other.name);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetSex()).compareTo(other.isSetSex());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetSex()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.sex, other.sex);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetBirthday()).compareTo(other.isSetBirthday());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetBirthday()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.birthday, other.birthday);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetEmail()).compareTo(other.isSetEmail());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetEmail()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.email, other.email);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetMobile()).compareTo(other.isSetMobile());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetMobile()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.mobile, other.mobile);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetAddress()).compareTo(other.isSetAddress());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetAddress()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.address, other.address);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetIcon()).compareTo(other.isSetIcon());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetIcon()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.icon, other.icon);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetPermissions()).compareTo(other.isSetPermissions());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetPermissions()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.permissions, other.permissions);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetStatus()).compareTo(other.isSetStatus());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetStatus()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.status, other.status);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetCreateTime()).compareTo(other.isSetCreateTime());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetCreateTime()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.createTime, other.createTime);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetUpdateTime()).compareTo(other.isSetUpdateTime());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetUpdateTime()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.updateTime, other.updateTime);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    return 0;\n  }\n\n  public _Fields fieldForId(int fieldId) {\n    return _Fields.findByThriftId(fieldId);\n  }\n\n  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n    scheme(iprot).read(iprot, this);\n  }\n\n  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n    scheme(oprot).write(oprot, this);\n  }\n\n  @Override\n  public java.lang.String toString() {\n    java.lang.StringBuilder sb = new java.lang.StringBuilder(\"User(\");\n    boolean first = true;\n\n    sb.append(\"id:\");\n    sb.append(this.id);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"name:\");\n    if (this.name == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.name);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"sex:\");\n    sb.append(this.sex);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"birthday:\");\n    sb.append(this.birthday);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"email:\");\n    if (this.email == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.email);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"mobile:\");\n    if (this.mobile == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.mobile);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"address:\");\n    if (this.address == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.address);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"icon:\");\n    if (this.icon == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.icon);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"permissions:\");\n    if (this.permissions == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.permissions);\n    }\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"status:\");\n    sb.append(this.status);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"createTime:\");\n    sb.append(this.createTime);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"updateTime:\");\n    sb.append(this.updateTime);\n    first = false;\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  public void validate() throws org.apache.thrift.TException {\n    // check for required fields\n    // check for sub-struct validity\n  }\n\n  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n    try {\n      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n    try {\n      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n      __isset_bitfield = 0;\n      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private static class UserStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserStandardScheme getScheme() {\n      return new UserStandardScheme();\n    }\n  }\n\n  private static class UserStandardScheme extends org.apache.thrift.scheme.StandardScheme<User> {\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TField schemeField;\n      iprot.readStructBegin();\n      while (true)\n      {\n        schemeField = iprot.readFieldBegin();\n        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n          break;\n        }\n        switch (schemeField.id) {\n          case 1: // ID\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.id = iprot.readI64();\n              struct.setIdIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 2: // NAME\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.name = iprot.readString();\n              struct.setNameIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 3: // SEX\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.sex = iprot.readI32();\n              struct.setSexIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 4: // BIRTHDAY\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.birthday = iprot.readI32();\n              struct.setBirthdayIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 5: // EMAIL\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.email = iprot.readString();\n              struct.setEmailIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 6: // MOBILE\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.mobile = iprot.readString();\n              struct.setMobileIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 7: // ADDRESS\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.address = iprot.readString();\n              struct.setAddressIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 8: // ICON\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.icon = iprot.readString();\n              struct.setIconIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 9: // PERMISSIONS\n            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {\n              {\n                org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();\n                struct.permissions = new java.util.ArrayList<java.lang.Integer>(_list0.size);\n                int _elem1;\n                for (int _i2 = 0; _i2 < _list0.size; ++_i2)\n                {\n                  _elem1 = iprot.readI32();\n                  struct.permissions.add(_elem1);\n                }\n                iprot.readListEnd();\n              }\n              struct.setPermissionsIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 10: // STATUS\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.status = iprot.readI32();\n              struct.setStatusIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 11: // CREATE_TIME\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.createTime = iprot.readI64();\n              struct.setCreateTimeIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 12: // UPDATE_TIME\n            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n              struct.updateTime = iprot.readI64();\n              struct.setUpdateTimeIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          default:\n            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n        }\n        iprot.readFieldEnd();\n      }\n      iprot.readStructEnd();\n\n      // check for required fields of primitive type, which can't be checked in the validate method\n      struct.validate();\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot, User struct) throws org.apache.thrift.TException {\n      struct.validate();\n\n      oprot.writeStructBegin(STRUCT_DESC);\n      oprot.writeFieldBegin(ID_FIELD_DESC);\n      oprot.writeI64(struct.id);\n      oprot.writeFieldEnd();\n      if (struct.name != null) {\n        oprot.writeFieldBegin(NAME_FIELD_DESC);\n        oprot.writeString(struct.name);\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldBegin(SEX_FIELD_DESC);\n      oprot.writeI32(struct.sex);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(BIRTHDAY_FIELD_DESC);\n      oprot.writeI32(struct.birthday);\n      oprot.writeFieldEnd();\n      if (struct.email != null) {\n        oprot.writeFieldBegin(EMAIL_FIELD_DESC);\n        oprot.writeString(struct.email);\n        oprot.writeFieldEnd();\n      }\n      if (struct.mobile != null) {\n        oprot.writeFieldBegin(MOBILE_FIELD_DESC);\n        oprot.writeString(struct.mobile);\n        oprot.writeFieldEnd();\n      }\n      if (struct.address != null) {\n        oprot.writeFieldBegin(ADDRESS_FIELD_DESC);\n        oprot.writeString(struct.address);\n        oprot.writeFieldEnd();\n      }\n      if (struct.icon != null) {\n        oprot.writeFieldBegin(ICON_FIELD_DESC);\n        oprot.writeString(struct.icon);\n        oprot.writeFieldEnd();\n      }\n      if (struct.permissions != null) {\n        oprot.writeFieldBegin(PERMISSIONS_FIELD_DESC);\n        {\n          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.I32, struct.permissions.size()));\n          for (int _iter3 : struct.permissions)\n          {\n            oprot.writeI32(_iter3);\n          }\n          oprot.writeListEnd();\n        }\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldBegin(STATUS_FIELD_DESC);\n      oprot.writeI32(struct.status);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(CREATE_TIME_FIELD_DESC);\n      oprot.writeI64(struct.createTime);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(UPDATE_TIME_FIELD_DESC);\n      oprot.writeI64(struct.updateTime);\n      oprot.writeFieldEnd();\n      oprot.writeFieldStop();\n      oprot.writeStructEnd();\n    }\n\n  }\n\n  private static class UserTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserTupleScheme getScheme() {\n      return new UserTupleScheme();\n    }\n  }\n\n  private static class UserTupleScheme extends org.apache.thrift.scheme.TupleScheme<User> {\n\n    @Override\n    public void write(org.apache.thrift.protocol.TProtocol prot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet optionals = new java.util.BitSet();\n      if (struct.isSetId()) {\n        optionals.set(0);\n      }\n      if (struct.isSetName()) {\n        optionals.set(1);\n      }\n      if (struct.isSetSex()) {\n        optionals.set(2);\n      }\n      if (struct.isSetBirthday()) {\n        optionals.set(3);\n      }\n      if (struct.isSetEmail()) {\n        optionals.set(4);\n      }\n      if (struct.isSetMobile()) {\n        optionals.set(5);\n      }\n      if (struct.isSetAddress()) {\n        optionals.set(6);\n      }\n      if (struct.isSetIcon()) {\n        optionals.set(7);\n      }\n      if (struct.isSetPermissions()) {\n        optionals.set(8);\n      }\n      if (struct.isSetStatus()) {\n        optionals.set(9);\n      }\n      if (struct.isSetCreateTime()) {\n        optionals.set(10);\n      }\n      if (struct.isSetUpdateTime()) {\n        optionals.set(11);\n      }\n      oprot.writeBitSet(optionals, 12);\n      if (struct.isSetId()) {\n        oprot.writeI64(struct.id);\n      }\n      if (struct.isSetName()) {\n        oprot.writeString(struct.name);\n      }\n      if (struct.isSetSex()) {\n        oprot.writeI32(struct.sex);\n      }\n      if (struct.isSetBirthday()) {\n        oprot.writeI32(struct.birthday);\n      }\n      if (struct.isSetEmail()) {\n        oprot.writeString(struct.email);\n      }\n      if (struct.isSetMobile()) {\n        oprot.writeString(struct.mobile);\n      }\n      if (struct.isSetAddress()) {\n        oprot.writeString(struct.address);\n      }\n      if (struct.isSetIcon()) {\n        oprot.writeString(struct.icon);\n      }\n      if (struct.isSetPermissions()) {\n        {\n          oprot.writeI32(struct.permissions.size());\n          for (int _iter4 : struct.permissions)\n          {\n            oprot.writeI32(_iter4);\n          }\n        }\n      }\n      if (struct.isSetStatus()) {\n        oprot.writeI32(struct.status);\n      }\n      if (struct.isSetCreateTime()) {\n        oprot.writeI64(struct.createTime);\n      }\n      if (struct.isSetUpdateTime()) {\n        oprot.writeI64(struct.updateTime);\n      }\n    }\n\n    @Override\n    public void read(org.apache.thrift.protocol.TProtocol prot, User struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet incoming = iprot.readBitSet(12);\n      if (incoming.get(0)) {\n        struct.id = iprot.readI64();\n        struct.setIdIsSet(true);\n      }\n      if (incoming.get(1)) {\n        struct.name = iprot.readString();\n        struct.setNameIsSet(true);\n      }\n      if (incoming.get(2)) {\n        struct.sex = iprot.readI32();\n        struct.setSexIsSet(true);\n      }\n      if (incoming.get(3)) {\n        struct.birthday = iprot.readI32();\n        struct.setBirthdayIsSet(true);\n      }\n      if (incoming.get(4)) {\n        struct.email = iprot.readString();\n        struct.setEmailIsSet(true);\n      }\n      if (incoming.get(5)) {\n        struct.mobile = iprot.readString();\n        struct.setMobileIsSet(true);\n      }\n      if (incoming.get(6)) {\n        struct.address = iprot.readString();\n        struct.setAddressIsSet(true);\n      }\n      if (incoming.get(7)) {\n        struct.icon = iprot.readString();\n        struct.setIconIsSet(true);\n      }\n      if (incoming.get(8)) {\n        {\n          org.apache.thrift.protocol.TList _list5 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.I32, iprot.readI32());\n          struct.permissions = new java.util.ArrayList<java.lang.Integer>(_list5.size);\n          int _elem6;\n          for (int _i7 = 0; _i7 < _list5.size; ++_i7)\n          {\n            _elem6 = iprot.readI32();\n            struct.permissions.add(_elem6);\n          }\n        }\n        struct.setPermissionsIsSet(true);\n      }\n      if (incoming.get(9)) {\n        struct.status = iprot.readI32();\n        struct.setStatusIsSet(true);\n      }\n      if (incoming.get(10)) {\n        struct.createTime = iprot.readI64();\n        struct.setCreateTimeIsSet(true);\n      }\n      if (incoming.get(11)) {\n        struct.updateTime = iprot.readI64();\n        struct.setUpdateTimeIsSet(true);\n      }\n    }\n  }\n\n  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n  }\n}\n\n"
  },
  {
    "path": "thrift-server/src/main/thrift/gen-java/benchmark/rpc/thrift/UserPage.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class UserPage implements org.apache.thrift.TBase<UserPage, UserPage._Fields>, java.io.Serializable, Cloneable, Comparable<UserPage> {\n  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"UserPage\");\n\n  private static final org.apache.thrift.protocol.TField PAGE_NO_FIELD_DESC = new org.apache.thrift.protocol.TField(\"pageNo\", org.apache.thrift.protocol.TType.I32, (short)1);\n  private static final org.apache.thrift.protocol.TField TOTAL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"total\", org.apache.thrift.protocol.TType.I32, (short)2);\n  private static final org.apache.thrift.protocol.TField RESULT_FIELD_DESC = new org.apache.thrift.protocol.TField(\"result\", org.apache.thrift.protocol.TType.LIST, (short)3);\n\n  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new UserPageStandardSchemeFactory();\n  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new UserPageTupleSchemeFactory();\n\n  public int pageNo; // required\n  public int total; // required\n  public java.util.List<User> result; // required\n\n  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n  public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n    PAGE_NO((short)1, \"pageNo\"),\n    TOTAL((short)2, \"total\"),\n    RESULT((short)3, \"result\");\n\n    private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n    static {\n      for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n        byName.put(field.getFieldName(), field);\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, or null if its not found.\n     */\n    public static _Fields findByThriftId(int fieldId) {\n      switch(fieldId) {\n        case 1: // PAGE_NO\n          return PAGE_NO;\n        case 2: // TOTAL\n          return TOTAL;\n        case 3: // RESULT\n          return RESULT;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, throwing an exception\n     * if it is not found.\n     */\n    public static _Fields findByThriftIdOrThrow(int fieldId) {\n      _Fields fields = findByThriftId(fieldId);\n      if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n      return fields;\n    }\n\n    /**\n     * Find the _Fields constant that matches name, or null if its not found.\n     */\n    public static _Fields findByName(java.lang.String name) {\n      return byName.get(name);\n    }\n\n    private final short _thriftId;\n    private final java.lang.String _fieldName;\n\n    _Fields(short thriftId, java.lang.String fieldName) {\n      _thriftId = thriftId;\n      _fieldName = fieldName;\n    }\n\n    public short getThriftFieldId() {\n      return _thriftId;\n    }\n\n    public java.lang.String getFieldName() {\n      return _fieldName;\n    }\n  }\n\n  // isset id assignments\n  private static final int __PAGENO_ISSET_ID = 0;\n  private static final int __TOTAL_ISSET_ID = 1;\n  private byte __isset_bitfield = 0;\n  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n  static {\n    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n    tmpMap.put(_Fields.PAGE_NO, new org.apache.thrift.meta_data.FieldMetaData(\"pageNo\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.TOTAL, new org.apache.thrift.meta_data.FieldMetaData(\"total\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n    tmpMap.put(_Fields.RESULT, new org.apache.thrift.meta_data.FieldMetaData(\"result\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, \n            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class))));\n    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(UserPage.class, metaDataMap);\n  }\n\n  public UserPage() {\n  }\n\n  public UserPage(\n    int pageNo,\n    int total,\n    java.util.List<User> result)\n  {\n    this();\n    this.pageNo = pageNo;\n    setPageNoIsSet(true);\n    this.total = total;\n    setTotalIsSet(true);\n    this.result = result;\n  }\n\n  /**\n   * Performs a deep copy on <i>other</i>.\n   */\n  public UserPage(UserPage other) {\n    __isset_bitfield = other.__isset_bitfield;\n    this.pageNo = other.pageNo;\n    this.total = other.total;\n    if (other.isSetResult()) {\n      java.util.List<User> __this__result = new java.util.ArrayList<User>(other.result.size());\n      for (User other_element : other.result) {\n        __this__result.add(new User(other_element));\n      }\n      this.result = __this__result;\n    }\n  }\n\n  public UserPage deepCopy() {\n    return new UserPage(this);\n  }\n\n  @Override\n  public void clear() {\n    setPageNoIsSet(false);\n    this.pageNo = 0;\n    setTotalIsSet(false);\n    this.total = 0;\n    this.result = null;\n  }\n\n  public int getPageNo() {\n    return this.pageNo;\n  }\n\n  public UserPage setPageNo(int pageNo) {\n    this.pageNo = pageNo;\n    setPageNoIsSet(true);\n    return this;\n  }\n\n  public void unsetPageNo() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PAGENO_ISSET_ID);\n  }\n\n  /** Returns true if field pageNo is set (has been assigned a value) and false otherwise */\n  public boolean isSetPageNo() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PAGENO_ISSET_ID);\n  }\n\n  public void setPageNoIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PAGENO_ISSET_ID, value);\n  }\n\n  public int getTotal() {\n    return this.total;\n  }\n\n  public UserPage setTotal(int total) {\n    this.total = total;\n    setTotalIsSet(true);\n    return this;\n  }\n\n  public void unsetTotal() {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __TOTAL_ISSET_ID);\n  }\n\n  /** Returns true if field total is set (has been assigned a value) and false otherwise */\n  public boolean isSetTotal() {\n    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __TOTAL_ISSET_ID);\n  }\n\n  public void setTotalIsSet(boolean value) {\n    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __TOTAL_ISSET_ID, value);\n  }\n\n  public int getResultSize() {\n    return (this.result == null) ? 0 : this.result.size();\n  }\n\n  public java.util.Iterator<User> getResultIterator() {\n    return (this.result == null) ? null : this.result.iterator();\n  }\n\n  public void addToResult(User elem) {\n    if (this.result == null) {\n      this.result = new java.util.ArrayList<User>();\n    }\n    this.result.add(elem);\n  }\n\n  public java.util.List<User> getResult() {\n    return this.result;\n  }\n\n  public UserPage setResult(java.util.List<User> result) {\n    this.result = result;\n    return this;\n  }\n\n  public void unsetResult() {\n    this.result = null;\n  }\n\n  /** Returns true if field result is set (has been assigned a value) and false otherwise */\n  public boolean isSetResult() {\n    return this.result != null;\n  }\n\n  public void setResultIsSet(boolean value) {\n    if (!value) {\n      this.result = null;\n    }\n  }\n\n  public void setFieldValue(_Fields field, java.lang.Object value) {\n    switch (field) {\n    case PAGE_NO:\n      if (value == null) {\n        unsetPageNo();\n      } else {\n        setPageNo((java.lang.Integer)value);\n      }\n      break;\n\n    case TOTAL:\n      if (value == null) {\n        unsetTotal();\n      } else {\n        setTotal((java.lang.Integer)value);\n      }\n      break;\n\n    case RESULT:\n      if (value == null) {\n        unsetResult();\n      } else {\n        setResult((java.util.List<User>)value);\n      }\n      break;\n\n    }\n  }\n\n  public java.lang.Object getFieldValue(_Fields field) {\n    switch (field) {\n    case PAGE_NO:\n      return getPageNo();\n\n    case TOTAL:\n      return getTotal();\n\n    case RESULT:\n      return getResult();\n\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n  public boolean isSet(_Fields field) {\n    if (field == null) {\n      throw new java.lang.IllegalArgumentException();\n    }\n\n    switch (field) {\n    case PAGE_NO:\n      return isSetPageNo();\n    case TOTAL:\n      return isSetTotal();\n    case RESULT:\n      return isSetResult();\n    }\n    throw new java.lang.IllegalStateException();\n  }\n\n  @Override\n  public boolean equals(java.lang.Object that) {\n    if (that == null)\n      return false;\n    if (that instanceof UserPage)\n      return this.equals((UserPage)that);\n    return false;\n  }\n\n  public boolean equals(UserPage that) {\n    if (that == null)\n      return false;\n    if (this == that)\n      return true;\n\n    boolean this_present_pageNo = true;\n    boolean that_present_pageNo = true;\n    if (this_present_pageNo || that_present_pageNo) {\n      if (!(this_present_pageNo && that_present_pageNo))\n        return false;\n      if (this.pageNo != that.pageNo)\n        return false;\n    }\n\n    boolean this_present_total = true;\n    boolean that_present_total = true;\n    if (this_present_total || that_present_total) {\n      if (!(this_present_total && that_present_total))\n        return false;\n      if (this.total != that.total)\n        return false;\n    }\n\n    boolean this_present_result = true && this.isSetResult();\n    boolean that_present_result = true && that.isSetResult();\n    if (this_present_result || that_present_result) {\n      if (!(this_present_result && that_present_result))\n        return false;\n      if (!this.result.equals(that.result))\n        return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    int hashCode = 1;\n\n    hashCode = hashCode * 8191 + pageNo;\n\n    hashCode = hashCode * 8191 + total;\n\n    hashCode = hashCode * 8191 + ((isSetResult()) ? 131071 : 524287);\n    if (isSetResult())\n      hashCode = hashCode * 8191 + result.hashCode();\n\n    return hashCode;\n  }\n\n  @Override\n  public int compareTo(UserPage other) {\n    if (!getClass().equals(other.getClass())) {\n      return getClass().getName().compareTo(other.getClass().getName());\n    }\n\n    int lastComparison = 0;\n\n    lastComparison = java.lang.Boolean.valueOf(isSetPageNo()).compareTo(other.isSetPageNo());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetPageNo()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.pageNo, other.pageNo);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetTotal()).compareTo(other.isSetTotal());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetTotal()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.total, other.total);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    lastComparison = java.lang.Boolean.valueOf(isSetResult()).compareTo(other.isSetResult());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetResult()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.result, other.result);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    return 0;\n  }\n\n  public _Fields fieldForId(int fieldId) {\n    return _Fields.findByThriftId(fieldId);\n  }\n\n  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n    scheme(iprot).read(iprot, this);\n  }\n\n  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n    scheme(oprot).write(oprot, this);\n  }\n\n  @Override\n  public java.lang.String toString() {\n    java.lang.StringBuilder sb = new java.lang.StringBuilder(\"UserPage(\");\n    boolean first = true;\n\n    sb.append(\"pageNo:\");\n    sb.append(this.pageNo);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"total:\");\n    sb.append(this.total);\n    first = false;\n    if (!first) sb.append(\", \");\n    sb.append(\"result:\");\n    if (this.result == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.result);\n    }\n    first = false;\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  public void validate() throws org.apache.thrift.TException {\n    // check for required fields\n    // check for sub-struct validity\n  }\n\n  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n    try {\n      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n    try {\n      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n      __isset_bitfield = 0;\n      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private static class UserPageStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserPageStandardScheme getScheme() {\n      return new UserPageStandardScheme();\n    }\n  }\n\n  private static class UserPageStandardScheme extends org.apache.thrift.scheme.StandardScheme<UserPage> {\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TField schemeField;\n      iprot.readStructBegin();\n      while (true)\n      {\n        schemeField = iprot.readFieldBegin();\n        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n          break;\n        }\n        switch (schemeField.id) {\n          case 1: // PAGE_NO\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.pageNo = iprot.readI32();\n              struct.setPageNoIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 2: // TOTAL\n            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n              struct.total = iprot.readI32();\n              struct.setTotalIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          case 3: // RESULT\n            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {\n              {\n                org.apache.thrift.protocol.TList _list8 = iprot.readListBegin();\n                struct.result = new java.util.ArrayList<User>(_list8.size);\n                User _elem9;\n                for (int _i10 = 0; _i10 < _list8.size; ++_i10)\n                {\n                  _elem9 = new User();\n                  _elem9.read(iprot);\n                  struct.result.add(_elem9);\n                }\n                iprot.readListEnd();\n              }\n              struct.setResultIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          default:\n            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n        }\n        iprot.readFieldEnd();\n      }\n      iprot.readStructEnd();\n\n      // check for required fields of primitive type, which can't be checked in the validate method\n      struct.validate();\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot, UserPage struct) throws org.apache.thrift.TException {\n      struct.validate();\n\n      oprot.writeStructBegin(STRUCT_DESC);\n      oprot.writeFieldBegin(PAGE_NO_FIELD_DESC);\n      oprot.writeI32(struct.pageNo);\n      oprot.writeFieldEnd();\n      oprot.writeFieldBegin(TOTAL_FIELD_DESC);\n      oprot.writeI32(struct.total);\n      oprot.writeFieldEnd();\n      if (struct.result != null) {\n        oprot.writeFieldBegin(RESULT_FIELD_DESC);\n        {\n          oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.result.size()));\n          for (User _iter11 : struct.result)\n          {\n            _iter11.write(oprot);\n          }\n          oprot.writeListEnd();\n        }\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldStop();\n      oprot.writeStructEnd();\n    }\n\n  }\n\n  private static class UserPageTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n    public UserPageTupleScheme getScheme() {\n      return new UserPageTupleScheme();\n    }\n  }\n\n  private static class UserPageTupleScheme extends org.apache.thrift.scheme.TupleScheme<UserPage> {\n\n    @Override\n    public void write(org.apache.thrift.protocol.TProtocol prot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet optionals = new java.util.BitSet();\n      if (struct.isSetPageNo()) {\n        optionals.set(0);\n      }\n      if (struct.isSetTotal()) {\n        optionals.set(1);\n      }\n      if (struct.isSetResult()) {\n        optionals.set(2);\n      }\n      oprot.writeBitSet(optionals, 3);\n      if (struct.isSetPageNo()) {\n        oprot.writeI32(struct.pageNo);\n      }\n      if (struct.isSetTotal()) {\n        oprot.writeI32(struct.total);\n      }\n      if (struct.isSetResult()) {\n        {\n          oprot.writeI32(struct.result.size());\n          for (User _iter12 : struct.result)\n          {\n            _iter12.write(oprot);\n          }\n        }\n      }\n    }\n\n    @Override\n    public void read(org.apache.thrift.protocol.TProtocol prot, UserPage struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n      java.util.BitSet incoming = iprot.readBitSet(3);\n      if (incoming.get(0)) {\n        struct.pageNo = iprot.readI32();\n        struct.setPageNoIsSet(true);\n      }\n      if (incoming.get(1)) {\n        struct.total = iprot.readI32();\n        struct.setTotalIsSet(true);\n      }\n      if (incoming.get(2)) {\n        {\n          org.apache.thrift.protocol.TList _list13 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());\n          struct.result = new java.util.ArrayList<User>(_list13.size);\n          User _elem14;\n          for (int _i15 = 0; _i15 < _list13.size; ++_i15)\n          {\n            _elem14 = new User();\n            _elem14.read(iprot);\n            struct.result.add(_elem14);\n          }\n        }\n        struct.setResultIsSet(true);\n      }\n    }\n  }\n\n  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n  }\n}\n\n"
  },
  {
    "path": "thrift-server/src/main/thrift/gen-java/benchmark/rpc/thrift/UserService.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (0.10.0)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\npackage benchmark.rpc.thrift;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\", \"unused\"})\n@javax.annotation.Generated(value = \"Autogenerated by Thrift Compiler (0.10.0)\", date = \"2018-01-02\")\npublic class UserService {\n\n  public interface Iface {\n\n    public boolean userExist(java.lang.String email) throws org.apache.thrift.TException;\n\n    public boolean createUser(User user) throws org.apache.thrift.TException;\n\n    public User getUser(long id) throws org.apache.thrift.TException;\n\n    public UserPage listUser(int pageNo) throws org.apache.thrift.TException;\n\n  }\n\n  public interface AsyncIface {\n\n    public void userExist(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;\n\n    public void createUser(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException;\n\n    public void getUser(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException;\n\n    public void listUser(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException;\n\n  }\n\n  public static class Client extends org.apache.thrift.TServiceClient implements Iface {\n    public static class Factory implements org.apache.thrift.TServiceClientFactory<Client> {\n      public Factory() {}\n      public Client getClient(org.apache.thrift.protocol.TProtocol prot) {\n        return new Client(prot);\n      }\n      public Client getClient(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n        return new Client(iprot, oprot);\n      }\n    }\n\n    public Client(org.apache.thrift.protocol.TProtocol prot)\n    {\n      super(prot, prot);\n    }\n\n    public Client(org.apache.thrift.protocol.TProtocol iprot, org.apache.thrift.protocol.TProtocol oprot) {\n      super(iprot, oprot);\n    }\n\n    public boolean userExist(java.lang.String email) throws org.apache.thrift.TException\n    {\n      send_userExist(email);\n      return recv_userExist();\n    }\n\n    public void send_userExist(java.lang.String email) throws org.apache.thrift.TException\n    {\n      userExist_args args = new userExist_args();\n      args.setEmail(email);\n      sendBase(\"userExist\", args);\n    }\n\n    public boolean recv_userExist() throws org.apache.thrift.TException\n    {\n      userExist_result result = new userExist_result();\n      receiveBase(result, \"userExist\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"userExist failed: unknown result\");\n    }\n\n    public boolean createUser(User user) throws org.apache.thrift.TException\n    {\n      send_createUser(user);\n      return recv_createUser();\n    }\n\n    public void send_createUser(User user) throws org.apache.thrift.TException\n    {\n      createUser_args args = new createUser_args();\n      args.setUser(user);\n      sendBase(\"createUser\", args);\n    }\n\n    public boolean recv_createUser() throws org.apache.thrift.TException\n    {\n      createUser_result result = new createUser_result();\n      receiveBase(result, \"createUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"createUser failed: unknown result\");\n    }\n\n    public User getUser(long id) throws org.apache.thrift.TException\n    {\n      send_getUser(id);\n      return recv_getUser();\n    }\n\n    public void send_getUser(long id) throws org.apache.thrift.TException\n    {\n      getUser_args args = new getUser_args();\n      args.setId(id);\n      sendBase(\"getUser\", args);\n    }\n\n    public User recv_getUser() throws org.apache.thrift.TException\n    {\n      getUser_result result = new getUser_result();\n      receiveBase(result, \"getUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"getUser failed: unknown result\");\n    }\n\n    public UserPage listUser(int pageNo) throws org.apache.thrift.TException\n    {\n      send_listUser(pageNo);\n      return recv_listUser();\n    }\n\n    public void send_listUser(int pageNo) throws org.apache.thrift.TException\n    {\n      listUser_args args = new listUser_args();\n      args.setPageNo(pageNo);\n      sendBase(\"listUser\", args);\n    }\n\n    public UserPage recv_listUser() throws org.apache.thrift.TException\n    {\n      listUser_result result = new listUser_result();\n      receiveBase(result, \"listUser\");\n      if (result.isSetSuccess()) {\n        return result.success;\n      }\n      throw new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.MISSING_RESULT, \"listUser failed: unknown result\");\n    }\n\n  }\n  public static class AsyncClient extends org.apache.thrift.async.TAsyncClient implements AsyncIface {\n    public static class Factory implements org.apache.thrift.async.TAsyncClientFactory<AsyncClient> {\n      private org.apache.thrift.async.TAsyncClientManager clientManager;\n      private org.apache.thrift.protocol.TProtocolFactory protocolFactory;\n      public Factory(org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.protocol.TProtocolFactory protocolFactory) {\n        this.clientManager = clientManager;\n        this.protocolFactory = protocolFactory;\n      }\n      public AsyncClient getAsyncClient(org.apache.thrift.transport.TNonblockingTransport transport) {\n        return new AsyncClient(protocolFactory, clientManager, transport);\n      }\n    }\n\n    public AsyncClient(org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.async.TAsyncClientManager clientManager, org.apache.thrift.transport.TNonblockingTransport transport) {\n      super(protocolFactory, clientManager, transport);\n    }\n\n    public void userExist(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      userExist_call method_call = new userExist_call(email, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class userExist_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {\n      private java.lang.String email;\n      public userExist_call(java.lang.String email, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.email = email;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"userExist\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        userExist_args args = new userExist_args();\n        args.setEmail(email);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public java.lang.Boolean getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_userExist();\n      }\n    }\n\n    public void createUser(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      createUser_call method_call = new createUser_call(user, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class createUser_call extends org.apache.thrift.async.TAsyncMethodCall<java.lang.Boolean> {\n      private User user;\n      public createUser_call(User user, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.user = user;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"createUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        createUser_args args = new createUser_args();\n        args.setUser(user);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public java.lang.Boolean getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_createUser();\n      }\n    }\n\n    public void getUser(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      getUser_call method_call = new getUser_call(id, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class getUser_call extends org.apache.thrift.async.TAsyncMethodCall<User> {\n      private long id;\n      public getUser_call(long id, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.id = id;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"getUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        getUser_args args = new getUser_args();\n        args.setId(id);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public User getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_getUser();\n      }\n    }\n\n    public void listUser(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException {\n      checkReady();\n      listUser_call method_call = new listUser_call(pageNo, resultHandler, this, ___protocolFactory, ___transport);\n      this.___currentMethod = method_call;\n      ___manager.call(method_call);\n    }\n\n    public static class listUser_call extends org.apache.thrift.async.TAsyncMethodCall<UserPage> {\n      private int pageNo;\n      public listUser_call(int pageNo, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler, org.apache.thrift.async.TAsyncClient client, org.apache.thrift.protocol.TProtocolFactory protocolFactory, org.apache.thrift.transport.TNonblockingTransport transport) throws org.apache.thrift.TException {\n        super(client, protocolFactory, transport, resultHandler, false);\n        this.pageNo = pageNo;\n      }\n\n      public void write_args(org.apache.thrift.protocol.TProtocol prot) throws org.apache.thrift.TException {\n        prot.writeMessageBegin(new org.apache.thrift.protocol.TMessage(\"listUser\", org.apache.thrift.protocol.TMessageType.CALL, 0));\n        listUser_args args = new listUser_args();\n        args.setPageNo(pageNo);\n        args.write(prot);\n        prot.writeMessageEnd();\n      }\n\n      public UserPage getResult() throws org.apache.thrift.TException {\n        if (getState() != org.apache.thrift.async.TAsyncMethodCall.State.RESPONSE_READ) {\n          throw new java.lang.IllegalStateException(\"Method call not finished!\");\n        }\n        org.apache.thrift.transport.TMemoryInputTransport memoryTransport = new org.apache.thrift.transport.TMemoryInputTransport(getFrameBuffer().array());\n        org.apache.thrift.protocol.TProtocol prot = client.getProtocolFactory().getProtocol(memoryTransport);\n        return (new Client(prot)).recv_listUser();\n      }\n    }\n\n  }\n\n  public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor {\n    private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(Processor.class.getName());\n    public Processor(I iface) {\n      super(iface, getProcessMap(new java.util.HashMap<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>>()));\n    }\n\n    protected Processor(I iface, java.util.Map<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> processMap) {\n      super(iface, getProcessMap(processMap));\n    }\n\n    private static <I extends Iface> java.util.Map<java.lang.String,  org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> getProcessMap(java.util.Map<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) {\n      processMap.put(\"userExist\", new userExist());\n      processMap.put(\"createUser\", new createUser());\n      processMap.put(\"getUser\", new getUser());\n      processMap.put(\"listUser\", new listUser());\n      return processMap;\n    }\n\n    public static class userExist<I extends Iface> extends org.apache.thrift.ProcessFunction<I, userExist_args> {\n      public userExist() {\n        super(\"userExist\");\n      }\n\n      public userExist_args getEmptyArgsInstance() {\n        return new userExist_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public userExist_result getResult(I iface, userExist_args args) throws org.apache.thrift.TException {\n        userExist_result result = new userExist_result();\n        result.success = iface.userExist(args.email);\n        result.setSuccessIsSet(true);\n        return result;\n      }\n    }\n\n    public static class createUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, createUser_args> {\n      public createUser() {\n        super(\"createUser\");\n      }\n\n      public createUser_args getEmptyArgsInstance() {\n        return new createUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public createUser_result getResult(I iface, createUser_args args) throws org.apache.thrift.TException {\n        createUser_result result = new createUser_result();\n        result.success = iface.createUser(args.user);\n        result.setSuccessIsSet(true);\n        return result;\n      }\n    }\n\n    public static class getUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, getUser_args> {\n      public getUser() {\n        super(\"getUser\");\n      }\n\n      public getUser_args getEmptyArgsInstance() {\n        return new getUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public getUser_result getResult(I iface, getUser_args args) throws org.apache.thrift.TException {\n        getUser_result result = new getUser_result();\n        result.success = iface.getUser(args.id);\n        return result;\n      }\n    }\n\n    public static class listUser<I extends Iface> extends org.apache.thrift.ProcessFunction<I, listUser_args> {\n      public listUser() {\n        super(\"listUser\");\n      }\n\n      public listUser_args getEmptyArgsInstance() {\n        return new listUser_args();\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public listUser_result getResult(I iface, listUser_args args) throws org.apache.thrift.TException {\n        listUser_result result = new listUser_result();\n        result.success = iface.listUser(args.pageNo);\n        return result;\n      }\n    }\n\n  }\n\n  public static class AsyncProcessor<I extends AsyncIface> extends org.apache.thrift.TBaseAsyncProcessor<I> {\n    private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(AsyncProcessor.class.getName());\n    public AsyncProcessor(I iface) {\n      super(iface, getProcessMap(new java.util.HashMap<java.lang.String, org.apache.thrift.AsyncProcessFunction<I, ? extends org.apache.thrift.TBase, ?>>()));\n    }\n\n    protected AsyncProcessor(I iface, java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {\n      super(iface, getProcessMap(processMap));\n    }\n\n    private static <I extends AsyncIface> java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase,?>> getProcessMap(java.util.Map<java.lang.String,  org.apache.thrift.AsyncProcessFunction<I, ? extends  org.apache.thrift.TBase, ?>> processMap) {\n      processMap.put(\"userExist\", new userExist());\n      processMap.put(\"createUser\", new createUser());\n      processMap.put(\"getUser\", new getUser());\n      processMap.put(\"listUser\", new listUser());\n      return processMap;\n    }\n\n    public static class userExist<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, userExist_args, java.lang.Boolean> {\n      public userExist() {\n        super(\"userExist\");\n      }\n\n      public userExist_args getEmptyArgsInstance() {\n        return new userExist_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean>() { \n          public void onComplete(java.lang.Boolean o) {\n            userExist_result result = new userExist_result();\n            result.success = o;\n            result.setSuccessIsSet(true);\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            userExist_result result = new userExist_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, userExist_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n        iface.userExist(args.email,resultHandler);\n      }\n    }\n\n    public static class createUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, createUser_args, java.lang.Boolean> {\n      public createUser() {\n        super(\"createUser\");\n      }\n\n      public createUser_args getEmptyArgsInstance() {\n        return new createUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean>() { \n          public void onComplete(java.lang.Boolean o) {\n            createUser_result result = new createUser_result();\n            result.success = o;\n            result.setSuccessIsSet(true);\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            createUser_result result = new createUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, createUser_args args, org.apache.thrift.async.AsyncMethodCallback<java.lang.Boolean> resultHandler) throws org.apache.thrift.TException {\n        iface.createUser(args.user,resultHandler);\n      }\n    }\n\n    public static class getUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, getUser_args, User> {\n      public getUser() {\n        super(\"getUser\");\n      }\n\n      public getUser_args getEmptyArgsInstance() {\n        return new getUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<User> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<User>() { \n          public void onComplete(User o) {\n            getUser_result result = new getUser_result();\n            result.success = o;\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            getUser_result result = new getUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, getUser_args args, org.apache.thrift.async.AsyncMethodCallback<User> resultHandler) throws org.apache.thrift.TException {\n        iface.getUser(args.id,resultHandler);\n      }\n    }\n\n    public static class listUser<I extends AsyncIface> extends org.apache.thrift.AsyncProcessFunction<I, listUser_args, UserPage> {\n      public listUser() {\n        super(\"listUser\");\n      }\n\n      public listUser_args getEmptyArgsInstance() {\n        return new listUser_args();\n      }\n\n      public org.apache.thrift.async.AsyncMethodCallback<UserPage> getResultHandler(final org.apache.thrift.server.AbstractNonblockingServer.AsyncFrameBuffer fb, final int seqid) {\n        final org.apache.thrift.AsyncProcessFunction fcall = this;\n        return new org.apache.thrift.async.AsyncMethodCallback<UserPage>() { \n          public void onComplete(UserPage o) {\n            listUser_result result = new listUser_result();\n            result.success = o;\n            try {\n              fcall.sendResponse(fb, result, org.apache.thrift.protocol.TMessageType.REPLY,seqid);\n            } catch (org.apache.thrift.transport.TTransportException e) {\n              _LOGGER.error(\"TTransportException writing to internal frame buffer\", e);\n              fb.close();\n            } catch (java.lang.Exception e) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", e);\n              onError(e);\n            }\n          }\n          public void onError(java.lang.Exception e) {\n            byte msgType = org.apache.thrift.protocol.TMessageType.REPLY;\n            org.apache.thrift.TSerializable msg;\n            listUser_result result = new listUser_result();\n            if (e instanceof org.apache.thrift.transport.TTransportException) {\n              _LOGGER.error(\"TTransportException inside handler\", e);\n              fb.close();\n              return;\n            } else if (e instanceof org.apache.thrift.TApplicationException) {\n              _LOGGER.error(\"TApplicationException inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = (org.apache.thrift.TApplicationException)e;\n            } else {\n              _LOGGER.error(\"Exception inside handler\", e);\n              msgType = org.apache.thrift.protocol.TMessageType.EXCEPTION;\n              msg = new org.apache.thrift.TApplicationException(org.apache.thrift.TApplicationException.INTERNAL_ERROR, e.getMessage());\n            }\n            try {\n              fcall.sendResponse(fb,msg,msgType,seqid);\n            } catch (java.lang.Exception ex) {\n              _LOGGER.error(\"Exception writing to internal frame buffer\", ex);\n              fb.close();\n            }\n          }\n        };\n      }\n\n      protected boolean isOneway() {\n        return false;\n      }\n\n      public void start(I iface, listUser_args args, org.apache.thrift.async.AsyncMethodCallback<UserPage> resultHandler) throws org.apache.thrift.TException {\n        iface.listUser(args.pageNo,resultHandler);\n      }\n    }\n\n  }\n\n  public static class userExist_args implements org.apache.thrift.TBase<userExist_args, userExist_args._Fields>, java.io.Serializable, Cloneable, Comparable<userExist_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"userExist_args\");\n\n    private static final org.apache.thrift.protocol.TField EMAIL_FIELD_DESC = new org.apache.thrift.protocol.TField(\"email\", org.apache.thrift.protocol.TType.STRING, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new userExist_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new userExist_argsTupleSchemeFactory();\n\n    public java.lang.String email; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      EMAIL((short)1, \"email\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // EMAIL\n            return EMAIL;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.EMAIL, new org.apache.thrift.meta_data.FieldMetaData(\"email\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(userExist_args.class, metaDataMap);\n    }\n\n    public userExist_args() {\n    }\n\n    public userExist_args(\n      java.lang.String email)\n    {\n      this();\n      this.email = email;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public userExist_args(userExist_args other) {\n      if (other.isSetEmail()) {\n        this.email = other.email;\n      }\n    }\n\n    public userExist_args deepCopy() {\n      return new userExist_args(this);\n    }\n\n    @Override\n    public void clear() {\n      this.email = null;\n    }\n\n    public java.lang.String getEmail() {\n      return this.email;\n    }\n\n    public userExist_args setEmail(java.lang.String email) {\n      this.email = email;\n      return this;\n    }\n\n    public void unsetEmail() {\n      this.email = null;\n    }\n\n    /** Returns true if field email is set (has been assigned a value) and false otherwise */\n    public boolean isSetEmail() {\n      return this.email != null;\n    }\n\n    public void setEmailIsSet(boolean value) {\n      if (!value) {\n        this.email = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case EMAIL:\n        if (value == null) {\n          unsetEmail();\n        } else {\n          setEmail((java.lang.String)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case EMAIL:\n        return getEmail();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case EMAIL:\n        return isSetEmail();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof userExist_args)\n        return this.equals((userExist_args)that);\n      return false;\n    }\n\n    public boolean equals(userExist_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_email = true && this.isSetEmail();\n      boolean that_present_email = true && that.isSetEmail();\n      if (this_present_email || that_present_email) {\n        if (!(this_present_email && that_present_email))\n          return false;\n        if (!this.email.equals(that.email))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetEmail()) ? 131071 : 524287);\n      if (isSetEmail())\n        hashCode = hashCode * 8191 + email.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(userExist_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetEmail()).compareTo(other.isSetEmail());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetEmail()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.email, other.email);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"userExist_args(\");\n      boolean first = true;\n\n      sb.append(\"email:\");\n      if (this.email == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.email);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class userExist_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_argsStandardScheme getScheme() {\n        return new userExist_argsStandardScheme();\n      }\n    }\n\n    private static class userExist_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<userExist_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // EMAIL\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n                struct.email = iprot.readString();\n                struct.setEmailIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, userExist_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.email != null) {\n          oprot.writeFieldBegin(EMAIL_FIELD_DESC);\n          oprot.writeString(struct.email);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class userExist_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_argsTupleScheme getScheme() {\n        return new userExist_argsTupleScheme();\n      }\n    }\n\n    private static class userExist_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<userExist_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetEmail()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetEmail()) {\n          oprot.writeString(struct.email);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, userExist_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.email = iprot.readString();\n          struct.setEmailIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class userExist_result implements org.apache.thrift.TBase<userExist_result, userExist_result._Fields>, java.io.Serializable, Cloneable, Comparable<userExist_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"userExist_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.BOOL, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new userExist_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new userExist_resultTupleSchemeFactory();\n\n    public boolean success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __SUCCESS_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(userExist_result.class, metaDataMap);\n    }\n\n    public userExist_result() {\n    }\n\n    public userExist_result(\n      boolean success)\n    {\n      this();\n      this.success = success;\n      setSuccessIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public userExist_result(userExist_result other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.success = other.success;\n    }\n\n    public userExist_result deepCopy() {\n      return new userExist_result(this);\n    }\n\n    @Override\n    public void clear() {\n      setSuccessIsSet(false);\n      this.success = false;\n    }\n\n    public boolean isSuccess() {\n      return this.success;\n    }\n\n    public userExist_result setSuccess(boolean success) {\n      this.success = success;\n      setSuccessIsSet(true);\n      return this;\n    }\n\n    public void unsetSuccess() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((java.lang.Boolean)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return isSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof userExist_result)\n        return this.equals((userExist_result)that);\n      return false;\n    }\n\n    public boolean equals(userExist_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true;\n      boolean that_present_success = true;\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (this.success != that.success)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((success) ? 131071 : 524287);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(userExist_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"userExist_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      sb.append(this.success);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class userExist_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_resultStandardScheme getScheme() {\n        return new userExist_resultStandardScheme();\n      }\n    }\n\n    private static class userExist_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<userExist_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {\n                struct.success = iprot.readBool();\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, userExist_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.isSetSuccess()) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          oprot.writeBool(struct.success);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class userExist_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public userExist_resultTupleScheme getScheme() {\n        return new userExist_resultTupleScheme();\n      }\n    }\n\n    private static class userExist_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<userExist_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          oprot.writeBool(struct.success);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, userExist_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = iprot.readBool();\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class createUser_args implements org.apache.thrift.TBase<createUser_args, createUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<createUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"createUser_args\");\n\n    private static final org.apache.thrift.protocol.TField USER_FIELD_DESC = new org.apache.thrift.protocol.TField(\"user\", org.apache.thrift.protocol.TType.STRUCT, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new createUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new createUser_argsTupleSchemeFactory();\n\n    public User user; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      USER((short)1, \"user\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // USER\n            return USER;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.USER, new org.apache.thrift.meta_data.FieldMetaData(\"user\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(createUser_args.class, metaDataMap);\n    }\n\n    public createUser_args() {\n    }\n\n    public createUser_args(\n      User user)\n    {\n      this();\n      this.user = user;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public createUser_args(createUser_args other) {\n      if (other.isSetUser()) {\n        this.user = new User(other.user);\n      }\n    }\n\n    public createUser_args deepCopy() {\n      return new createUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      this.user = null;\n    }\n\n    public User getUser() {\n      return this.user;\n    }\n\n    public createUser_args setUser(User user) {\n      this.user = user;\n      return this;\n    }\n\n    public void unsetUser() {\n      this.user = null;\n    }\n\n    /** Returns true if field user is set (has been assigned a value) and false otherwise */\n    public boolean isSetUser() {\n      return this.user != null;\n    }\n\n    public void setUserIsSet(boolean value) {\n      if (!value) {\n        this.user = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case USER:\n        if (value == null) {\n          unsetUser();\n        } else {\n          setUser((User)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case USER:\n        return getUser();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case USER:\n        return isSetUser();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof createUser_args)\n        return this.equals((createUser_args)that);\n      return false;\n    }\n\n    public boolean equals(createUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_user = true && this.isSetUser();\n      boolean that_present_user = true && that.isSetUser();\n      if (this_present_user || that_present_user) {\n        if (!(this_present_user && that_present_user))\n          return false;\n        if (!this.user.equals(that.user))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetUser()) ? 131071 : 524287);\n      if (isSetUser())\n        hashCode = hashCode * 8191 + user.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(createUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetUser()).compareTo(other.isSetUser());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetUser()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.user, other.user);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"createUser_args(\");\n      boolean first = true;\n\n      sb.append(\"user:\");\n      if (this.user == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.user);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (user != null) {\n        user.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class createUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_argsStandardScheme getScheme() {\n        return new createUser_argsStandardScheme();\n      }\n    }\n\n    private static class createUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<createUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // USER\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.user = new User();\n                struct.user.read(iprot);\n                struct.setUserIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, createUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.user != null) {\n          oprot.writeFieldBegin(USER_FIELD_DESC);\n          struct.user.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class createUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_argsTupleScheme getScheme() {\n        return new createUser_argsTupleScheme();\n      }\n    }\n\n    private static class createUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<createUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetUser()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetUser()) {\n          struct.user.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, createUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.user = new User();\n          struct.user.read(iprot);\n          struct.setUserIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class createUser_result implements org.apache.thrift.TBase<createUser_result, createUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<createUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"createUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.BOOL, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new createUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new createUser_resultTupleSchemeFactory();\n\n    public boolean success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __SUCCESS_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(createUser_result.class, metaDataMap);\n    }\n\n    public createUser_result() {\n    }\n\n    public createUser_result(\n      boolean success)\n    {\n      this();\n      this.success = success;\n      setSuccessIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public createUser_result(createUser_result other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.success = other.success;\n    }\n\n    public createUser_result deepCopy() {\n      return new createUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      setSuccessIsSet(false);\n      this.success = false;\n    }\n\n    public boolean isSuccess() {\n      return this.success;\n    }\n\n    public createUser_result setSuccess(boolean success) {\n      this.success = success;\n      setSuccessIsSet(true);\n      return this;\n    }\n\n    public void unsetSuccess() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __SUCCESS_ISSET_ID);\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __SUCCESS_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((java.lang.Boolean)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return isSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof createUser_result)\n        return this.equals((createUser_result)that);\n      return false;\n    }\n\n    public boolean equals(createUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true;\n      boolean that_present_success = true;\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (this.success != that.success)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((success) ? 131071 : 524287);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(createUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"createUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      sb.append(this.success);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class createUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_resultStandardScheme getScheme() {\n        return new createUser_resultStandardScheme();\n      }\n    }\n\n    private static class createUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<createUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {\n                struct.success = iprot.readBool();\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, createUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.isSetSuccess()) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          oprot.writeBool(struct.success);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class createUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public createUser_resultTupleScheme getScheme() {\n        return new createUser_resultTupleScheme();\n      }\n    }\n\n    private static class createUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<createUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          oprot.writeBool(struct.success);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, createUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = iprot.readBool();\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class getUser_args implements org.apache.thrift.TBase<getUser_args, getUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<getUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"getUser_args\");\n\n    private static final org.apache.thrift.protocol.TField ID_FIELD_DESC = new org.apache.thrift.protocol.TField(\"id\", org.apache.thrift.protocol.TType.I64, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getUser_argsTupleSchemeFactory();\n\n    public long id; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      ID((short)1, \"id\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // ID\n            return ID;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __ID_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.ID, new org.apache.thrift.meta_data.FieldMetaData(\"id\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getUser_args.class, metaDataMap);\n    }\n\n    public getUser_args() {\n    }\n\n    public getUser_args(\n      long id)\n    {\n      this();\n      this.id = id;\n      setIdIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public getUser_args(getUser_args other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.id = other.id;\n    }\n\n    public getUser_args deepCopy() {\n      return new getUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      setIdIsSet(false);\n      this.id = 0;\n    }\n\n    public long getId() {\n      return this.id;\n    }\n\n    public getUser_args setId(long id) {\n      this.id = id;\n      setIdIsSet(true);\n      return this;\n    }\n\n    public void unsetId() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __ID_ISSET_ID);\n    }\n\n    /** Returns true if field id is set (has been assigned a value) and false otherwise */\n    public boolean isSetId() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ID_ISSET_ID);\n    }\n\n    public void setIdIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __ID_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case ID:\n        if (value == null) {\n          unsetId();\n        } else {\n          setId((java.lang.Long)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case ID:\n        return getId();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case ID:\n        return isSetId();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof getUser_args)\n        return this.equals((getUser_args)that);\n      return false;\n    }\n\n    public boolean equals(getUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_id = true;\n      boolean that_present_id = true;\n      if (this_present_id || that_present_id) {\n        if (!(this_present_id && that_present_id))\n          return false;\n        if (this.id != that.id)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(id);\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(getUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetId()).compareTo(other.isSetId());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetId()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.id, other.id);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"getUser_args(\");\n      boolean first = true;\n\n      sb.append(\"id:\");\n      sb.append(this.id);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class getUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_argsStandardScheme getScheme() {\n        return new getUser_argsStandardScheme();\n      }\n    }\n\n    private static class getUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<getUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // ID\n              if (schemeField.type == org.apache.thrift.protocol.TType.I64) {\n                struct.id = iprot.readI64();\n                struct.setIdIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, getUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        oprot.writeFieldBegin(ID_FIELD_DESC);\n        oprot.writeI64(struct.id);\n        oprot.writeFieldEnd();\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class getUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_argsTupleScheme getScheme() {\n        return new getUser_argsTupleScheme();\n      }\n    }\n\n    private static class getUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<getUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetId()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetId()) {\n          oprot.writeI64(struct.id);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, getUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.id = iprot.readI64();\n          struct.setIdIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class getUser_result implements org.apache.thrift.TBase<getUser_result, getUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<getUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"getUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.STRUCT, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new getUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new getUser_resultTupleSchemeFactory();\n\n    public User success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, User.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(getUser_result.class, metaDataMap);\n    }\n\n    public getUser_result() {\n    }\n\n    public getUser_result(\n      User success)\n    {\n      this();\n      this.success = success;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public getUser_result(getUser_result other) {\n      if (other.isSetSuccess()) {\n        this.success = new User(other.success);\n      }\n    }\n\n    public getUser_result deepCopy() {\n      return new getUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      this.success = null;\n    }\n\n    public User getSuccess() {\n      return this.success;\n    }\n\n    public getUser_result setSuccess(User success) {\n      this.success = success;\n      return this;\n    }\n\n    public void unsetSuccess() {\n      this.success = null;\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return this.success != null;\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      if (!value) {\n        this.success = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((User)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return getSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof getUser_result)\n        return this.equals((getUser_result)that);\n      return false;\n    }\n\n    public boolean equals(getUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true && this.isSetSuccess();\n      boolean that_present_success = true && that.isSetSuccess();\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (!this.success.equals(that.success))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287);\n      if (isSetSuccess())\n        hashCode = hashCode * 8191 + success.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(getUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"getUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      if (this.success == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.success);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (success != null) {\n        success.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class getUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_resultStandardScheme getScheme() {\n        return new getUser_resultStandardScheme();\n      }\n    }\n\n    private static class getUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<getUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.success = new User();\n                struct.success.read(iprot);\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, getUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.success != null) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          struct.success.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class getUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public getUser_resultTupleScheme getScheme() {\n        return new getUser_resultTupleScheme();\n      }\n    }\n\n    private static class getUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<getUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          struct.success.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, getUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = new User();\n          struct.success.read(iprot);\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class listUser_args implements org.apache.thrift.TBase<listUser_args, listUser_args._Fields>, java.io.Serializable, Cloneable, Comparable<listUser_args>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"listUser_args\");\n\n    private static final org.apache.thrift.protocol.TField PAGE_NO_FIELD_DESC = new org.apache.thrift.protocol.TField(\"pageNo\", org.apache.thrift.protocol.TType.I32, (short)1);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new listUser_argsStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new listUser_argsTupleSchemeFactory();\n\n    public int pageNo; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      PAGE_NO((short)1, \"pageNo\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 1: // PAGE_NO\n            return PAGE_NO;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    private static final int __PAGENO_ISSET_ID = 0;\n    private byte __isset_bitfield = 0;\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.PAGE_NO, new org.apache.thrift.meta_data.FieldMetaData(\"pageNo\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(listUser_args.class, metaDataMap);\n    }\n\n    public listUser_args() {\n    }\n\n    public listUser_args(\n      int pageNo)\n    {\n      this();\n      this.pageNo = pageNo;\n      setPageNoIsSet(true);\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public listUser_args(listUser_args other) {\n      __isset_bitfield = other.__isset_bitfield;\n      this.pageNo = other.pageNo;\n    }\n\n    public listUser_args deepCopy() {\n      return new listUser_args(this);\n    }\n\n    @Override\n    public void clear() {\n      setPageNoIsSet(false);\n      this.pageNo = 0;\n    }\n\n    public int getPageNo() {\n      return this.pageNo;\n    }\n\n    public listUser_args setPageNo(int pageNo) {\n      this.pageNo = pageNo;\n      setPageNoIsSet(true);\n      return this;\n    }\n\n    public void unsetPageNo() {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PAGENO_ISSET_ID);\n    }\n\n    /** Returns true if field pageNo is set (has been assigned a value) and false otherwise */\n    public boolean isSetPageNo() {\n      return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PAGENO_ISSET_ID);\n    }\n\n    public void setPageNoIsSet(boolean value) {\n      __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PAGENO_ISSET_ID, value);\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case PAGE_NO:\n        if (value == null) {\n          unsetPageNo();\n        } else {\n          setPageNo((java.lang.Integer)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case PAGE_NO:\n        return getPageNo();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case PAGE_NO:\n        return isSetPageNo();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof listUser_args)\n        return this.equals((listUser_args)that);\n      return false;\n    }\n\n    public boolean equals(listUser_args that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_pageNo = true;\n      boolean that_present_pageNo = true;\n      if (this_present_pageNo || that_present_pageNo) {\n        if (!(this_present_pageNo && that_present_pageNo))\n          return false;\n        if (this.pageNo != that.pageNo)\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + pageNo;\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(listUser_args other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetPageNo()).compareTo(other.isSetPageNo());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetPageNo()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.pageNo, other.pageNo);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n    }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"listUser_args(\");\n      boolean first = true;\n\n      sb.append(\"pageNo:\");\n      sb.append(this.pageNo);\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.\n        __isset_bitfield = 0;\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class listUser_argsStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_argsStandardScheme getScheme() {\n        return new listUser_argsStandardScheme();\n      }\n    }\n\n    private static class listUser_argsStandardScheme extends org.apache.thrift.scheme.StandardScheme<listUser_args> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 1: // PAGE_NO\n              if (schemeField.type == org.apache.thrift.protocol.TType.I32) {\n                struct.pageNo = iprot.readI32();\n                struct.setPageNoIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, listUser_args struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        oprot.writeFieldBegin(PAGE_NO_FIELD_DESC);\n        oprot.writeI32(struct.pageNo);\n        oprot.writeFieldEnd();\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class listUser_argsTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_argsTupleScheme getScheme() {\n        return new listUser_argsTupleScheme();\n      }\n    }\n\n    private static class listUser_argsTupleScheme extends org.apache.thrift.scheme.TupleScheme<listUser_args> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetPageNo()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetPageNo()) {\n          oprot.writeI32(struct.pageNo);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, listUser_args struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.pageNo = iprot.readI32();\n          struct.setPageNoIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n  public static class listUser_result implements org.apache.thrift.TBase<listUser_result, listUser_result._Fields>, java.io.Serializable, Cloneable, Comparable<listUser_result>   {\n    private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"listUser_result\");\n\n    private static final org.apache.thrift.protocol.TField SUCCESS_FIELD_DESC = new org.apache.thrift.protocol.TField(\"success\", org.apache.thrift.protocol.TType.STRUCT, (short)0);\n\n    private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new listUser_resultStandardSchemeFactory();\n    private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new listUser_resultTupleSchemeFactory();\n\n    public UserPage success; // required\n\n    /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n    public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n      SUCCESS((short)0, \"success\");\n\n      private static final java.util.Map<java.lang.String, _Fields> byName = new java.util.HashMap<java.lang.String, _Fields>();\n\n      static {\n        for (_Fields field : java.util.EnumSet.allOf(_Fields.class)) {\n          byName.put(field.getFieldName(), field);\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, or null if its not found.\n       */\n      public static _Fields findByThriftId(int fieldId) {\n        switch(fieldId) {\n          case 0: // SUCCESS\n            return SUCCESS;\n          default:\n            return null;\n        }\n      }\n\n      /**\n       * Find the _Fields constant that matches fieldId, throwing an exception\n       * if it is not found.\n       */\n      public static _Fields findByThriftIdOrThrow(int fieldId) {\n        _Fields fields = findByThriftId(fieldId);\n        if (fields == null) throw new java.lang.IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n        return fields;\n      }\n\n      /**\n       * Find the _Fields constant that matches name, or null if its not found.\n       */\n      public static _Fields findByName(java.lang.String name) {\n        return byName.get(name);\n      }\n\n      private final short _thriftId;\n      private final java.lang.String _fieldName;\n\n      _Fields(short thriftId, java.lang.String fieldName) {\n        _thriftId = thriftId;\n        _fieldName = fieldName;\n      }\n\n      public short getThriftFieldId() {\n        return _thriftId;\n      }\n\n      public java.lang.String getFieldName() {\n        return _fieldName;\n      }\n    }\n\n    // isset id assignments\n    public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n    static {\n      java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n      tmpMap.put(_Fields.SUCCESS, new org.apache.thrift.meta_data.FieldMetaData(\"success\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n          new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, UserPage.class)));\n      metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);\n      org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(listUser_result.class, metaDataMap);\n    }\n\n    public listUser_result() {\n    }\n\n    public listUser_result(\n      UserPage success)\n    {\n      this();\n      this.success = success;\n    }\n\n    /**\n     * Performs a deep copy on <i>other</i>.\n     */\n    public listUser_result(listUser_result other) {\n      if (other.isSetSuccess()) {\n        this.success = new UserPage(other.success);\n      }\n    }\n\n    public listUser_result deepCopy() {\n      return new listUser_result(this);\n    }\n\n    @Override\n    public void clear() {\n      this.success = null;\n    }\n\n    public UserPage getSuccess() {\n      return this.success;\n    }\n\n    public listUser_result setSuccess(UserPage success) {\n      this.success = success;\n      return this;\n    }\n\n    public void unsetSuccess() {\n      this.success = null;\n    }\n\n    /** Returns true if field success is set (has been assigned a value) and false otherwise */\n    public boolean isSetSuccess() {\n      return this.success != null;\n    }\n\n    public void setSuccessIsSet(boolean value) {\n      if (!value) {\n        this.success = null;\n      }\n    }\n\n    public void setFieldValue(_Fields field, java.lang.Object value) {\n      switch (field) {\n      case SUCCESS:\n        if (value == null) {\n          unsetSuccess();\n        } else {\n          setSuccess((UserPage)value);\n        }\n        break;\n\n      }\n    }\n\n    public java.lang.Object getFieldValue(_Fields field) {\n      switch (field) {\n      case SUCCESS:\n        return getSuccess();\n\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n    public boolean isSet(_Fields field) {\n      if (field == null) {\n        throw new java.lang.IllegalArgumentException();\n      }\n\n      switch (field) {\n      case SUCCESS:\n        return isSetSuccess();\n      }\n      throw new java.lang.IllegalStateException();\n    }\n\n    @Override\n    public boolean equals(java.lang.Object that) {\n      if (that == null)\n        return false;\n      if (that instanceof listUser_result)\n        return this.equals((listUser_result)that);\n      return false;\n    }\n\n    public boolean equals(listUser_result that) {\n      if (that == null)\n        return false;\n      if (this == that)\n        return true;\n\n      boolean this_present_success = true && this.isSetSuccess();\n      boolean that_present_success = true && that.isSetSuccess();\n      if (this_present_success || that_present_success) {\n        if (!(this_present_success && that_present_success))\n          return false;\n        if (!this.success.equals(that.success))\n          return false;\n      }\n\n      return true;\n    }\n\n    @Override\n    public int hashCode() {\n      int hashCode = 1;\n\n      hashCode = hashCode * 8191 + ((isSetSuccess()) ? 131071 : 524287);\n      if (isSetSuccess())\n        hashCode = hashCode * 8191 + success.hashCode();\n\n      return hashCode;\n    }\n\n    @Override\n    public int compareTo(listUser_result other) {\n      if (!getClass().equals(other.getClass())) {\n        return getClass().getName().compareTo(other.getClass().getName());\n      }\n\n      int lastComparison = 0;\n\n      lastComparison = java.lang.Boolean.valueOf(isSetSuccess()).compareTo(other.isSetSuccess());\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n      if (isSetSuccess()) {\n        lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.success, other.success);\n        if (lastComparison != 0) {\n          return lastComparison;\n        }\n      }\n      return 0;\n    }\n\n    public _Fields fieldForId(int fieldId) {\n      return _Fields.findByThriftId(fieldId);\n    }\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n      scheme(iprot).read(iprot, this);\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n      scheme(oprot).write(oprot, this);\n      }\n\n    @Override\n    public java.lang.String toString() {\n      java.lang.StringBuilder sb = new java.lang.StringBuilder(\"listUser_result(\");\n      boolean first = true;\n\n      sb.append(\"success:\");\n      if (this.success == null) {\n        sb.append(\"null\");\n      } else {\n        sb.append(this.success);\n      }\n      first = false;\n      sb.append(\")\");\n      return sb.toString();\n    }\n\n    public void validate() throws org.apache.thrift.TException {\n      // check for required fields\n      // check for sub-struct validity\n      if (success != null) {\n        success.validate();\n      }\n    }\n\n    private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n      try {\n        write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.ClassNotFoundException {\n      try {\n        read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n      } catch (org.apache.thrift.TException te) {\n        throw new java.io.IOException(te);\n      }\n    }\n\n    private static class listUser_resultStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_resultStandardScheme getScheme() {\n        return new listUser_resultStandardScheme();\n      }\n    }\n\n    private static class listUser_resultStandardScheme extends org.apache.thrift.scheme.StandardScheme<listUser_result> {\n\n      public void read(org.apache.thrift.protocol.TProtocol iprot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TField schemeField;\n        iprot.readStructBegin();\n        while (true)\n        {\n          schemeField = iprot.readFieldBegin();\n          if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n            break;\n          }\n          switch (schemeField.id) {\n            case 0: // SUCCESS\n              if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {\n                struct.success = new UserPage();\n                struct.success.read(iprot);\n                struct.setSuccessIsSet(true);\n              } else { \n                org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n              }\n              break;\n            default:\n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n          }\n          iprot.readFieldEnd();\n        }\n        iprot.readStructEnd();\n\n        // check for required fields of primitive type, which can't be checked in the validate method\n        struct.validate();\n      }\n\n      public void write(org.apache.thrift.protocol.TProtocol oprot, listUser_result struct) throws org.apache.thrift.TException {\n        struct.validate();\n\n        oprot.writeStructBegin(STRUCT_DESC);\n        if (struct.success != null) {\n          oprot.writeFieldBegin(SUCCESS_FIELD_DESC);\n          struct.success.write(oprot);\n          oprot.writeFieldEnd();\n        }\n        oprot.writeFieldStop();\n        oprot.writeStructEnd();\n      }\n\n    }\n\n    private static class listUser_resultTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {\n      public listUser_resultTupleScheme getScheme() {\n        return new listUser_resultTupleScheme();\n      }\n    }\n\n    private static class listUser_resultTupleScheme extends org.apache.thrift.scheme.TupleScheme<listUser_result> {\n\n      @Override\n      public void write(org.apache.thrift.protocol.TProtocol prot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet optionals = new java.util.BitSet();\n        if (struct.isSetSuccess()) {\n          optionals.set(0);\n        }\n        oprot.writeBitSet(optionals, 1);\n        if (struct.isSetSuccess()) {\n          struct.success.write(oprot);\n        }\n      }\n\n      @Override\n      public void read(org.apache.thrift.protocol.TProtocol prot, listUser_result struct) throws org.apache.thrift.TException {\n        org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;\n        java.util.BitSet incoming = iprot.readBitSet(1);\n        if (incoming.get(0)) {\n          struct.success = new UserPage();\n          struct.success.read(iprot);\n          struct.setSuccessIsSet(true);\n        }\n      }\n    }\n\n    private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {\n      return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();\n    }\n  }\n\n}\n"
  },
  {
    "path": "turbo-rest-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>turbo-rest-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>turbo-rest-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "turbo-rest-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.TurboUserServiceJsonHttpClientImpl;\nimport benchmark.service.UserService;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserService userService = new TurboUserServiceJsonHttpClientImpl(CONCURRENCY);\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "turbo-rest-client/src/main/java/benchmark/service/TurboUserServiceJsonHttpClientImpl.java",
    "content": "package benchmark.service;\n\nimport java.nio.charset.StandardCharsets;\n\nimport org.apache.http.HttpEntity;\nimport org.apache.http.client.entity.EntityBuilder;\nimport org.apache.http.client.methods.CloseableHttpResponse;\nimport org.apache.http.client.methods.HttpGet;\nimport org.apache.http.client.methods.HttpPost;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.util.EntityUtils;\n\nimport com.fasterxml.jackson.databind.JavaType;\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.util.HttpClientUtils;\nimport benchmark.rpc.util.JsonUtils;\n\n/**\n * only for client\n * \n * @author Hank\n *\n */\npublic class TurboUserServiceJsonHttpClientImpl implements UserService {\n\n\tprivate static final String URL_EXIST_USER = \"http://benchmark-server:8080/shop/auth/user/exist?v=2&email=\";\n\tprivate static final String URL_CREATE_USER = \"http://benchmark-server:8080/shop/auth/user/create?v=2\";\n\tprivate static final String URL_GET_USER = \"http://benchmark-server:8080/shop/auth/user/get?v=2&id=\";\n\tprivate static final String URL_LIST_USER = \"http://benchmark-server:8080/shop/auth/user/list?v=1&pageNo=\";\n\n\tprivate final CloseableHttpClient client;\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\tprivate final JavaType userPageType = objectMapper.getTypeFactory()//\n\t\t\t.constructParametricType(Page.class, User.class);\n\n\tpublic TurboUserServiceJsonHttpClientImpl(int concurrency) {\n\t\tclient = HttpClientUtils.createHttpClient(concurrency);\n\t}\n\n\t@Override\n\tpublic boolean existUser(String email) {\n\t\ttry {\n\t\t\tString url = URL_EXIST_USER + email;\n\n\t\t\tHttpGet request = new HttpGet(url);\n\t\t\tCloseableHttpResponse response = client.execute(request);\n\n\t\t\tString result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);\n\n\t\t\treturn \"true\".equals(result);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean createUser(User user) {\n\t\ttry {\n\t\t\tbyte[] bytes = objectMapper.writeValueAsBytes(user);\n\n\t\t\tHttpPost request = new HttpPost(URL_CREATE_USER);\n\t\t\tHttpEntity entity = EntityBuilder.create().setBinary(bytes).build();\n\t\t\trequest.setEntity(entity);\n\n\t\t\tCloseableHttpResponse response = client.execute(request);\n\n\t\t\tString result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);\n\n\t\t\treturn \"true\".equals(result);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic User getUser(long id) {\n\t\ttry {\n\t\t\tString url = URL_GET_USER + id;\n\n\t\t\tHttpGet request = new HttpGet(url);\n\t\t\tCloseableHttpResponse response = client.execute(request);\n\n\t\t\tbyte[] bytes = EntityUtils.toByteArray(response.getEntity());\n\n\t\t\treturn objectMapper.readValue(bytes, User.class);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic Page<User> listUser(int pageNo) {\n\t\ttry {\n\t\t\tString url = URL_LIST_USER + pageNo;\n\n\t\t\tHttpGet request = new HttpGet(url);\n\t\t\tCloseableHttpResponse response = client.execute(request);\n\n\t\t\tbyte[] bytes = EntityUtils.toByteArray(response.getEntity());\n\n\t\t\treturn objectMapper.readValue(bytes, userPageType);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tUserService userService = new UserServiceJsonHttpClientImpl(256);\n\n\t\tSystem.out.println(userService.existUser(\"1236\"));\n\t\tSystem.out.println(userService.getUser(123));\n\t\tSystem.out.println(userService.listUser(123));\n\t}\n\n}\n"
  },
  {
    "path": "turbo-rest-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "turbo-rest-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>turbo-rest-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>turbo-rest-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.turbo>0.0.9</version.turbo>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-rpc</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-protostuff</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t\t<compilerArgument>-parameters</compilerArgument>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "turbo-rest-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport java.util.Map;\n\nimport benchmark.rpc.service.TurboUserService;\nimport benchmark.rpc.service.TurboUserServiceServerImpl;\nimport io.netty.util.ResourceLeakDetector;\nimport io.netty.util.ResourceLeakDetector.Level;\nimport rpc.turbo.config.HostPort;\nimport rpc.turbo.server.TurboServer;\n\npublic class Server {\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tResourceLeakDetector.setLevel(Level.DISABLED);\n\n\t\ttry (TurboServer server = new TurboServer(\"shop\", \"auth\");) {\n\t\t\tMap<Class<?>, Object> services = Map.of(TurboUserService.class, new TurboUserServiceServerImpl());\n\t\t\tserver.registerService(services);\n\n\t\t\tserver.startRestServer(new HostPort(\"benchmark-server\", 8080));\n\t\t\tserver.waitUntilShutdown();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "turbo-rest-server/src/main/java/benchmark/rpc/service/TurboUserService.java",
    "content": "package benchmark.rpc.service;\n\nimport java.util.concurrent.CompletableFuture;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport rpc.turbo.annotation.TurboService;\n\n@TurboService(version = \"1.0.0\", rest = \"user\")\npublic interface TurboUserService {\n\n\t@TurboService(version = \"2.1.2\", rest = \"exist\")\n\tpublic CompletableFuture<Boolean> existUser(String email);\n\n\t@TurboService(version = \"2.1.2\", rest = \"create\")\n\tpublic CompletableFuture<Boolean> createUser(User user);\n\n\t@TurboService(version = \"2.1.2\", rest = \"get\")\n\tpublic CompletableFuture<User> getUser(long id);\n\n\t@TurboService(version = \"1.2.1\", rest = \"list\")\n\tpublic CompletableFuture<Page<User>> listUser(int pageNo);\n\n}\n"
  },
  {
    "path": "turbo-rest-server/src/main/java/benchmark/rpc/service/TurboUserServiceServerImpl.java",
    "content": "package benchmark.rpc.service;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.concurrent.CompletableFuture;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\n\npublic class TurboUserServiceServerImpl implements TurboUserService {\n\n\t@Override\n\tpublic CompletableFuture<Boolean> existUser(String email) {\n\n\t\tif (email == null || email.isEmpty()) {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t\t}\n\n\t\tif (email.charAt(email.length() - 1) < '5') {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.FALSE);\n\t\t}\n\n\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<User> getUser(long id) {\n\t\tUser user = new User();\n\n\t\tuser.setId(id);\n\t\tuser.setName(new String(\"Doug Lea\"));\n\t\tuser.setSex(1);\n\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\tuser.setEmail(new String(\"dong.lea@gmail.com\"));\n\t\tuser.setMobile(new String(\"18612345678\"));\n\t\tuser.setAddress(new String(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\"));\n\t\tuser.setIcon(new String(\"https://www.baidu.com/img/bd_logo1.png\"));\n\t\tuser.setStatus(1);\n\t\tuser.setCreateTime(LocalDateTime.now());\n\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\tList<Integer> permissions = new ArrayList<Integer>(\n\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\n\t\tuser.setPermissions(permissions);\n\n\t\treturn CompletableFuture.completedFuture(user);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<Page<User>> listUser(int pageNo) {\n\t\tList<User> userList = new ArrayList<>(15);\n\n\t\tfor (int i = 0; i < 15; i++) {\n\t\t\tUser user = new User();\n\n\t\t\tuser.setId(i);\n\t\t\tuser.setName(\"Doug Lea\" + i);\n\t\t\tuser.setSex(1);\n\t\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\t\tuser.setEmail(\"dong.lea@gmail.com\" + i);\n\t\t\tuser.setMobile(\"18612345678\" + i);\n\t\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\" + i);\n\t\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\" + i);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setCreateTime(LocalDateTime.now());\n\t\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\t\tList<Integer> permissions = new ArrayList<Integer>(\n\t\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\t\tuser.setPermissions(permissions);\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tPage<User> page = new Page<>();\n\t\tpage.setPageNo(pageNo);\n\t\tpage.setTotal(1000);\n\t\tpage.setResult(userList);\n\n\t\treturn CompletableFuture.completedFuture(page);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<Boolean> createUser(User user) {\n\t\tif (user == null) {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.FALSE);\n\t\t}\n\n\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t}\n\n}\n"
  },
  {
    "path": "turbo-rest-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "turbo-rpc-client/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "turbo-rpc-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>turbo-rpc-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>turbo-rpc-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.turbo>0.0.9</version.turbo>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-rpc</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-kryo</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-protostuff</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t\t<compilerArgument>-parameters</compilerArgument>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "turbo-rpc-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.io.IOException;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.annotations.TearDown;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.service.TurboUserService;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.netty.util.ResourceLeakDetector;\nimport io.netty.util.ResourceLeakDetector.Level;\nimport rpc.turbo.client.TurboClient;\n\n@State(Scope.Benchmark)\npublic class Client {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final AtomicInteger counter = new AtomicInteger(0);\n\tprivate final UserService _serviceUserService = new UserServiceServerImpl();\n\n\tprivate final TurboClient client;\n\tprivate final TurboUserService userService;\n\n\tpublic Client() {\n\t\tResourceLeakDetector.setLevel(Level.DISABLED);\n\n\t\tclient = new TurboClient(\"turbo-client.conf\");\n\n\t\ttry {\n\t\t\tclient.register(TurboUserService.class);\n\t\t\tuserService = client.getService(TurboUserService.class);\n\t\t} catch (Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\t@TearDown\n\tpublic void close() throws IOException {\n\t\tclient.close();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic Boolean existUser() throws Exception {\n\t\tString email = String.valueOf(counter.getAndIncrement());\n\t\treturn userService.existUser(email).join();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic Boolean createUser() throws Exception {\n\t\tint id = counter.getAndIncrement();\n\t\tUser user = _serviceUserService.getUser(id);\n\t\treturn userService.createUser(user).join();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic User getUser() throws Exception {\n\t\tint id = counter.getAndIncrement();\n\t\treturn userService.getUser(id).join();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\tpublic Page<User> listUser() throws Exception {\n\t\tint pageNo = counter.getAndIncrement();\n\t\treturn userService.listUser(pageNo).join();\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "turbo-rpc-client/src/main/java/benchmark/rpc/service/TurboUserService.java",
    "content": "package benchmark.rpc.service;\n\nimport java.util.concurrent.CompletableFuture;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport rpc.turbo.annotation.TurboService;\n\n@TurboService(version = \"1.0.0\", rest = \"user\")\npublic interface TurboUserService {\n\n\t@TurboService(version = \"2.1.2\", rest = \"exist\")\n\tpublic CompletableFuture<Boolean> existUser(String email);\n\n\t@TurboService(version = \"2.1.2\", rest = \"create\")\n\tpublic CompletableFuture<Boolean> createUser(User user);\n\n\t@TurboService(version = \"2.1.2\", rest = \"get\")\n\tpublic CompletableFuture<User> getUser(long id);\n\n\t@TurboService(version = \"1.2.1\", rest = \"list\")\n\tpublic CompletableFuture<Page<User>> listUser(int pageNo);\n\n}\n"
  },
  {
    "path": "turbo-rpc-client/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"DEBUG\">\n\t\t<!-- <appender-ref ref=\"console\" /> -->\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "turbo-rpc-client/src/main/resources/turbo-client.conf",
    "content": "#https://github.com/lightbend/config\n\napps = [\n\t{\n\t\tgroup = \"shop\"\n\t\tapp = \"auth\"\n\t\t\n\t\tserializer.class = \"rpc.turbo.serialization.kryo.KryoSerializer\"\n\t\t\n\t\t#app全局超时时间，大于0时会把所有方法的timeout都给覆盖掉，可空\n\t\tglobalTimeout = 0\n\t\t\n\t\tmaxRequestWait = 0\n\t\t\n\t\t#每个服务器几个连接，默认是1，性能不会太好\n\t\tconnectPerServer = 4\n\t\t\n\t\t#每个服务器出错上限，达到后会把该服务器相关连接放到zombieMap里面，会有进程定期检查zombieMap，如果能连上就重新放到activeMap里面\n\t\tserverErrorThreshold = 16\n\t\t\n\t\t#如果设置的话必须满足connectErrorThreshold * connectonPerServer >= serverErrorThreshold，否则会导致无法进入zombieMap中\n\t\t#connectErrorThreshold = 16\n\t\t\n\t\t#负载均衡实现\n\t\tloadBalanceFactory.class = \"rpc.turbo.loadbalance.RoundRobinLoadBalanceFactory\"\n\t\n\t\t#服务发现\n\t\tdiscover {\n\t\t\tclass = \"rpc.turbo.discover.DirectConnectDiscover\"\n\t\t\taddress = [\"benchmark-server:8080\"]\n\t\t}\n\t}\n]"
  },
  {
    "path": "turbo-rpc-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "turbo-rpc-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\txmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>turbo-rpc-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>turbo-rpc-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.spring-boot>2.1.2.RELEASE</version.spring-boot>\n\t\t<version.turbo>0.0.9</version.turbo>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-rpc</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-kryo</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-protostuff</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.turbo-rpc</groupId>\n\t\t\t<artifactId>turbo-spring-boot-starter</artifactId>\n\t\t\t<version>${version.turbo}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter</artifactId>\n\t\t\t<version>${version.spring-boot}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t\t<compilerArgument>-parameters</compilerArgument>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>repackage</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "turbo-rpc-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\nimport io.netty.util.ResourceLeakDetector;\nimport io.netty.util.ResourceLeakDetector.Level;\nimport rpc.turbo.boot.EnableTurboServer;\n\n@SpringBootApplication(scanBasePackages = { \"benchmark\" })\n@EnableTurboServer\npublic class Server {\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tResourceLeakDetector.setLevel(Level.DISABLED);\n\t\tSpringApplication.run(Server.class, args);\n\t}\n\n}\n"
  },
  {
    "path": "turbo-rpc-server/src/main/java/benchmark/rpc/service/TurboUserService.java",
    "content": "package benchmark.rpc.service;\n\nimport java.util.concurrent.CompletableFuture;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport rpc.turbo.annotation.TurboService;\n\n@TurboService(version = \"1.0.0\", rest = \"user\")\npublic interface TurboUserService {\n\n\t@TurboService(version = \"2.1.2\", rest = \"exist\")\n\tpublic CompletableFuture<Boolean> existUser(String email);\n\n\t@TurboService(version = \"2.1.2\", rest = \"create\")\n\tpublic CompletableFuture<Boolean> createUser(User user);\n\n\t@TurboService(version = \"2.1.2\", rest = \"get\")\n\tpublic CompletableFuture<User> getUser(long id);\n\n\t@TurboService(version = \"1.2.1\", rest = \"list\")\n\tpublic CompletableFuture<Page<User>> listUser(int pageNo);\n\n}\n"
  },
  {
    "path": "turbo-rpc-server/src/main/java/benchmark/rpc/service/TurboUserServiceServerImpl.java",
    "content": "package benchmark.rpc.service;\n\nimport java.time.LocalDate;\nimport java.time.LocalDateTime;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.concurrent.CompletableFuture;\n\nimport org.springframework.stereotype.Component;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\n\n@Component\npublic class TurboUserServiceServerImpl implements TurboUserService {\n\n\t@Override\n\tpublic CompletableFuture<Boolean> existUser(String email) {\n\n\t\tif (email == null || email.isEmpty()) {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t\t}\n\n\t\tif (email.charAt(email.length() - 1) < '5') {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.FALSE);\n\t\t}\n\n\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<User> getUser(long id) {\n\t\tUser user = new User();\n\n\t\tuser.setId(id);\n\t\tuser.setName(new String(\"Doug Lea\"));\n\t\tuser.setSex(1);\n\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\tuser.setEmail(new String(\"dong.lea@gmail.com\"));\n\t\tuser.setMobile(new String(\"18612345678\"));\n\t\tuser.setAddress(new String(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\"));\n\t\tuser.setIcon(new String(\"https://www.baidu.com/img/bd_logo1.png\"));\n\t\tuser.setStatus(1);\n\t\tuser.setCreateTime(LocalDateTime.now());\n\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\tList<Integer> permissions = new ArrayList<Integer>(\n\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\n\t\tuser.setPermissions(permissions);\n\n\t\treturn CompletableFuture.completedFuture(user);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<Page<User>> listUser(int pageNo) {\n\t\tList<User> userList = new ArrayList<>(15);\n\n\t\tfor (int i = 0; i < 15; i++) {\n\t\t\tUser user = new User();\n\n\t\t\tuser.setId(i);\n\t\t\tuser.setName(\"Doug Lea\" + i);\n\t\t\tuser.setSex(1);\n\t\t\tuser.setBirthday(LocalDate.of(1968, 12, 8));\n\t\t\tuser.setEmail(\"dong.lea@gmail.com\" + i);\n\t\t\tuser.setMobile(\"18612345678\" + i);\n\t\t\tuser.setAddress(\"北京市 中关村 中关村大街1号 鼎好大厦 1605\" + i);\n\t\t\tuser.setIcon(\"https://www.baidu.com/img/bd_logo1.png\" + i);\n\t\t\tuser.setStatus(1);\n\t\t\tuser.setCreateTime(LocalDateTime.now());\n\t\t\tuser.setUpdateTime(user.getCreateTime());\n\n\t\t\tList<Integer> permissions = new ArrayList<Integer>(\n\t\t\t\t\tArrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));\n\t\t\tuser.setPermissions(permissions);\n\n\t\t\tuserList.add(user);\n\t\t}\n\n\t\tPage<User> page = new Page<>();\n\t\tpage.setPageNo(pageNo);\n\t\tpage.setTotal(1000);\n\t\tpage.setResult(userList);\n\n\t\treturn CompletableFuture.completedFuture(page);\n\t}\n\n\t@Override\n\tpublic CompletableFuture<Boolean> createUser(User user) {\n\t\tif (user == null) {\n\t\t\treturn CompletableFuture.completedFuture(Boolean.FALSE);\n\t\t}\n\n\t\treturn CompletableFuture.completedFuture(Boolean.TRUE);\n\t}\n\n}\n"
  },
  {
    "path": "turbo-rpc-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-client.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"INFO\">\n\t\t<appender-ref ref=\"console\" />\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "turbo-rpc-server/src/main/resources/turbo-server.conf",
    "content": "group = shop\napp = auth\n\n#rpc序列化，默认为ProtostuffSerializer，可以修改为自己的实现\n#\"rpc.turbo.serialization.protostuff.ProtostuffSerializer\"\n#\"rpc.turbo.serialization.kryo.KryoSerializer\"\nserializer.class = \"rpc.turbo.serialization.kryo.KryoSerializer\"\n\n#http json转换，默认为JacksonMapper，可以修改为自己的实现\njsonMapper.class = \"rpc.turbo.serialization.jackson.JacksonMapper\"\n\nregisters = [\n\t{\n\t\t#Register实现\n\t\tregister.class = \"rpc.turbo.registry.DirectConnectRegister\"\n\t\t#Register地址\n\t\tregister.address = [\"benchmark-server:8086\"]\n\t\t#发布协议，RPC或者REST\n\t\tserver.protocol = \"RPC\"\n\t\t#对外服务地址，不同协议不能同一个端口，相同协议不允许出现port相同host不同的情况\n\t\tserver.address = \"benchmark-server:8080\"\n\t\t#对外服务权重\n\t\tserver.weight = 100\n\t}\n]"
  },
  {
    "path": "undertow-async-client/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "undertow-async-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>undertow-async-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>undertow-async-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "undertow-async-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceJsonHttpClientImpl;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserService userService = new UserServiceJsonHttpClientImpl(CONCURRENCY);\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "undertow-async-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "undertow-async-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>undertow-async-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>undertow-async-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.undertow>2.0.17.Final</version.undertow>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.undertow</groupId>\n\t\t\t<artifactId>undertow-core</artifactId>\n\t\t\t<version>${version.undertow}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "undertow-async-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.rpc.undertow.server.CreateUserHandler;\nimport benchmark.rpc.undertow.server.UserExistHandler;\nimport benchmark.rpc.undertow.server.GetUserHandler;\nimport benchmark.rpc.undertow.server.ListUserHandler;\nimport io.undertow.Undertow;\nimport io.undertow.UndertowOptions;\nimport io.undertow.server.HttpHandler;\nimport io.undertow.server.handlers.PathHandler;\n\npublic class Server {\n\n\tpublic static final String host = \"benchmark-server\";\n\tpublic static final int port = 8080;\n\n\tpublic static void main(String[] args) {\n\t\tUndertow.builder()//\n\t\t\t\t.addHttpListener(port, host)//\n\t\t\t\t.setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false)//\n\t\t\t\t.setServerOption(UndertowOptions.ALWAYS_SET_DATE, false)//\n\t\t\t\t.setHandler(paths())//\n\t\t\t\t.build()//\n\t\t\t\t.start();\n\t}\n\n\tprivate static HttpHandler paths() {\n\t\treturn new PathHandler()//\n\t\t\t\t.addExactPath(\"/user-exist\", new UserExistHandler())//\n\t\t\t\t.addExactPath(\"/create-user\", new CreateUserHandler())//\n\t\t\t\t.addExactPath(\"/get-user\", new GetUserHandler())//\n\t\t\t\t.addExactPath(\"/list-user\", new ListUserHandler())//\n\t\t;\n\t}\n\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/java/benchmark/rpc/undertow/server/CreateUserHandler.java",
    "content": "package benchmark.rpc.undertow.server;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport benchmark.bean.User;\nimport benchmark.rpc.util.JsonUtils;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.undertow.async.handler.AsyncHttpHandler;\nimport io.undertow.async.io.PooledByteBufferInputStream;\nimport io.undertow.server.HttpServerExchange;\nimport io.undertow.util.StatusCodes;\n\npublic class CreateUserHandler extends AsyncHttpHandler {\n\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tprotected void handleAsyncRequest(HttpServerExchange exchange, PooledByteBufferInputStream content)\n\t\t\tthrows Exception {\n\n\t\tbyte[] bytes = readBytesAndClose(content);\n\t\tUser user = objectMapper.readValue(bytes, User.class);\n\t\tuserService.createUser(user);\n\n\t\tsend(exchange, StatusCodes.OK, \"true\");\n\t}\n\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/java/benchmark/rpc/undertow/server/GetUserHandler.java",
    "content": "package benchmark.rpc.undertow.server;\n\nimport java.util.Deque;\nimport java.util.Map;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport benchmark.bean.User;\nimport benchmark.rpc.util.JsonUtils;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.undertow.async.handler.AsyncHttpHandler;\nimport io.undertow.async.io.PooledByteBufferInputStream;\nimport io.undertow.async.io.PooledByteBufferOutputStream;\nimport io.undertow.connector.ByteBufferPool;\nimport io.undertow.server.HttpServerExchange;\nimport io.undertow.util.StatusCodes;\n\npublic class GetUserHandler extends AsyncHttpHandler {\n\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tprotected void handleAsyncRequest(HttpServerExchange exchange, PooledByteBufferInputStream content)\n\t\t\tthrows Exception {\n\n\t\tMap<String, Deque<String>> params = exchange.getQueryParameters();\n\t\tString idStr = params.get(\"id\").getFirst();\n\t\tlong id = Integer.parseInt(idStr);\n\n\t\tUser user = userService.getUser(id);\n\n\t\tByteBufferPool pool = exchange.getConnection().getByteBufferPool();\n\t\tPooledByteBufferOutputStream output = new PooledByteBufferOutputStream(pool);\n\t\tobjectMapper.writeValue(output, user);\n\n\t\tsend(exchange, StatusCodes.OK, output);\n\t}\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/java/benchmark/rpc/undertow/server/ListUserHandler.java",
    "content": "package benchmark.rpc.undertow.server;\n\nimport java.util.Deque;\nimport java.util.Map;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.util.JsonUtils;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.undertow.async.handler.AsyncHttpHandler;\nimport io.undertow.async.io.PooledByteBufferInputStream;\nimport io.undertow.async.io.PooledByteBufferOutputStream;\nimport io.undertow.connector.ByteBufferPool;\nimport io.undertow.server.HttpServerExchange;\nimport io.undertow.util.StatusCodes;\n\npublic class ListUserHandler extends AsyncHttpHandler {\n\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tprotected void handleAsyncRequest(HttpServerExchange exchange, PooledByteBufferInputStream content)\n\t\t\tthrows Exception {\n\n\t\tMap<String, Deque<String>> params = exchange.getQueryParameters();\n\t\tString pageNoStr = params.get(\"pageNo\").getFirst();\n\t\tint pageNo = Integer.parseInt(pageNoStr);\n\n\t\tPage<User> userList = userService.listUser(pageNo);\n\n\t\tByteBufferPool pool = exchange.getConnection().getByteBufferPool();\n\t\tPooledByteBufferOutputStream output = new PooledByteBufferOutputStream(pool);\n\t\tobjectMapper.writeValue(output, userList);\n\n\t\tsend(exchange, StatusCodes.OK, output);\n\t}\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/java/benchmark/rpc/undertow/server/UserExistHandler.java",
    "content": "package benchmark.rpc.undertow.server;\n\nimport java.util.Deque;\nimport java.util.Map;\n\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.undertow.async.handler.AsyncHttpHandler;\nimport io.undertow.async.io.PooledByteBufferInputStream;\nimport io.undertow.server.HttpServerExchange;\nimport io.undertow.util.StatusCodes;\n\npublic class UserExistHandler extends AsyncHttpHandler {\n\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tprotected void handleAsyncRequest(HttpServerExchange exchange, PooledByteBufferInputStream content)\n\t\t\tthrows Exception {\n\n\t\tMap<String, Deque<String>> params = exchange.getQueryParameters();\n\t\tString email = params.get(\"email\").getFirst();\n\n\t\tif (userService.existUser(email)) {\n\t\t\tsend(exchange, StatusCodes.OK, \"true\");\n\t\t} else {\n\t\t\tsend(exchange, StatusCodes.OK, \"false\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/java/io/undertow/async/handler/AsyncHttpHandler.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage io.undertow.async.handler;\n\nimport static io.undertow.async.util.UnsafeUtils.unsafe;\nimport static org.xnio.Bits.intBitMask;\n\nimport java.io.IOException;\nimport java.lang.reflect.Field;\nimport java.nio.ByteBuffer;\nimport java.util.ArrayList;\n\nimport org.xnio.IoUtils;\nimport org.xnio.channels.StreamSinkChannel;\nimport org.xnio.channels.StreamSourceChannel;\n\nimport io.undertow.UndertowLogger;\nimport io.undertow.async.io.PooledByteBufferInputStream;\nimport io.undertow.async.io.PooledByteBufferOutputStream;\nimport io.undertow.connector.ByteBufferPool;\nimport io.undertow.connector.PooledByteBuffer;\nimport io.undertow.io.AsyncSenderImpl;\nimport io.undertow.io.Receiver.RequestToLargeException;\nimport io.undertow.io.Sender;\nimport io.undertow.server.Connectors;\nimport io.undertow.server.HttpHandler;\nimport io.undertow.server.HttpServerExchange;\nimport io.undertow.util.Headers;\nimport io.undertow.util.HttpString;\nimport io.undertow.util.Methods;\n\n/**\n * unsafe and only support few versions\n * \n * @author hank.whu@gmail.com\n *\n */\npublic abstract class AsyncHttpHandler implements HttpHandler {\n\n\tprivate static final PooledByteBuffer[] EMPTY_BUFFERS = PooledByteBufferInputStream.EMPTY_BUFFERS;\n\n\tprivate static final int MASK_RESPONSE_CODE = intBitMask(0, 9);\n\n\tprivate static final long exchangeResponseChannelFieldOffset;\n\tprivate static final long exchangeStatusCodeFieldOffset;\n\tprivate static final long asyncSenderImplChannelFieldOffset;\n\tprivate static final long asyncSenderImplPooledBuffersFieldOffset;\n\n\t@Override\n\tfinal public void handleRequest(HttpServerExchange exchange) throws Exception {\n\t\tHttpString httpMethod = exchange.getRequestMethod();\n\n\t\tif (httpMethod == Methods.GET) {\n\t\t\tinternalAsyncRequest(exchange, null);\n\t\t\treturn;\n\t\t}\n\n\t\tfinal String contentLengthString = exchange.getRequestHeaders().getFirst(Headers.CONTENT_LENGTH);\n\t\tfinal long contentLength;\n\n\t\tif (contentLengthString != null) {\n\t\t\tcontentLength = Long.parseLong(contentLengthString);\n\n\t\t\tif (contentLength > Integer.MAX_VALUE) {\n\t\t\t\tthrow new RequestToLargeException();\n\t\t\t}\n\t\t} else {\n\t\t\tcontentLength = -1;\n\t\t}\n\n\t\tPooledByteBuffer buffer = exchange.getConnection().getByteBufferPool().allocate();\n\t\tfinal ArrayList<PooledByteBuffer> bufferList;\n\t\tif (contentLength > 0) {\n\t\t\tint bufferLength = buffer.getBuffer().capacity();\n\t\t\tlong count = (contentLength + bufferLength - 1) / bufferLength;// ceil div\n\t\t\tbufferList = new ArrayList<>((int) count);\n\t\t} else {\n\t\t\tbufferList = new ArrayList<>(8);// usually enough\n\t\t}\n\n\t\tfinal StreamSourceChannel channel = exchange.getRequestChannel();\n\n\t\t// copy from io.undertow.server.handlers.RequestBufferingHandler\n\t\ttry {\n\t\t\tdo {\n\t\t\t\tByteBuffer b = buffer.getBuffer();\n\t\t\t\tint r = channel.read(b);\n\n\t\t\t\tif (r == -1) { // TODO: listener read\n\t\t\t\t\tif (b.position() == 0) {\n\t\t\t\t\t\tbuffer.close();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tb.flip();\n\t\t\t\t\t\tbufferList.add(buffer);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t} else if (r == 0) {\n\t\t\t\t\tfinal PooledByteBuffer finalBuffer = buffer;\n\n\t\t\t\t\tchannel.getReadSetter().set(requestChannel -> {\n\t\t\t\t\t\tPooledByteBuffer pooledByteBuffer = finalBuffer;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\tByteBuffer byteBuffer = pooledByteBuffer.getBuffer();\n\t\t\t\t\t\t\t\tint readLength = requestChannel.read(byteBuffer);\n\n\t\t\t\t\t\t\t\tif (readLength == -1) { // TODO: listener read\n\t\t\t\t\t\t\t\t\tif (byteBuffer.position() == 0) {\n\t\t\t\t\t\t\t\t\t\tpooledByteBuffer.close();\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tbyteBuffer.flip();\n\t\t\t\t\t\t\t\t\t\tbufferList.add(pooledByteBuffer);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tConnectors.resetRequestChannel(exchange);\n\t\t\t\t\t\t\t\t\trequestChannel.getReadSetter().set(null);\n\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t} else if (readLength == 0) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t} else if (!byteBuffer.hasRemaining()) {\n\t\t\t\t\t\t\t\t\tbyteBuffer.flip();\n\t\t\t\t\t\t\t\t\tbufferList.add(pooledByteBuffer);\n\n\t\t\t\t\t\t\t\t\tpooledByteBuffer = exchange.getConnection().getByteBufferPool().allocate();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} while (true);\n\t\t\t\t\t\t} catch (Throwable t) {\n\t\t\t\t\t\t\tif (t instanceof IOException) {\n\t\t\t\t\t\t\t\tUndertowLogger.REQUEST_IO_LOGGER.ioException((IOException) t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tUndertowLogger.REQUEST_IO_LOGGER.handleUnexpectedFailure(t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trelease(bufferList);\n\n\t\t\t\t\t\t\tif (pooledByteBuffer != null && pooledByteBuffer.isOpen()) {\n\t\t\t\t\t\t\t\tIoUtils.safeClose(pooledByteBuffer);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\texchange.endExchange();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tchannel.resumeReads();\n\t\t\t\t\tinternalAsyncRequest(exchange, bufferList);\n\n\t\t\t\t\treturn;\n\t\t\t\t} else if (!b.hasRemaining()) {\n\t\t\t\t\tb.flip();\n\t\t\t\t\tbufferList.add(buffer);\n\t\t\t\t\tbuffer = exchange.getConnection().getByteBufferPool().allocate();\n\t\t\t\t}\n\t\t\t} while (true);\n\n\t\t\tConnectors.resetRequestChannel(exchange);\n\t\t\tinternalAsyncRequest(exchange, bufferList);\n\t\t} catch (Throwable e) {\n\t\t\trelease(bufferList);\n\n\t\t\tif (buffer != null && buffer.isOpen()) {\n\t\t\t\tIoUtils.safeClose(buffer);\n\t\t\t}\n\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\tprivate void internalAsyncRequest(final HttpServerExchange exchange, ArrayList<PooledByteBuffer> bufferList)\n\t\t\tthrows Exception {\n\t\t// ensure exchange not end\n\t\tgetResponseChannel(exchange).resumeWrites();\n\n\t\tPooledByteBuffer[] buffers = EMPTY_BUFFERS;\n\n\t\tif (bufferList != null && bufferList.size() > 0) {\n\t\t\tbuffers = new PooledByteBuffer[bufferList.size()];\n\t\t\tbuffers = bufferList.toArray(buffers);\n\t\t}\n\n\t\thandleAsyncRequest(exchange, new PooledByteBufferInputStream(buffers));\n\t}\n\n\t/**\n\t * will be called after get all request data.</br>\n\t * \n\t * \n\t * @param exchange\n\t * \n\t * @param content\n\t *            must close it\n\t * \n\t * @throws Exception\n\t */\n\tprotected abstract void handleAsyncRequest(HttpServerExchange exchange, PooledByteBufferInputStream content)\n\t\t\tthrows Exception;\n\n\tprotected byte[] readBytesAndClose(PooledByteBufferInputStream content) {\n\t\ttry {\n\t\t\tbyte[] bytes = new byte[content.available()];\n\t\t\tcontent.read(bytes);\n\t\t\treturn bytes;\n\t\t} catch (IOException e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t} finally {\n\t\t\ttry {// must close it\n\t\t\t\tcontent.close();\n\t\t\t} catch (IOException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * response\n\t *\n\t * @param exchange\n\t * @param statusCode\n\t * @param msg\n\t */\n\tprotected final void send(HttpServerExchange exchange, int statusCode, String msg) {\n\t\tByteBufferPool pool = exchange.getConnection().getByteBufferPool();\n\t\tPooledByteBufferOutputStream output = new PooledByteBufferOutputStream(pool);\n\n\t\ttry {\n\t\t\toutput.write(msg);\n\t\t} catch (IOException e) {\n\t\t\tUndertowLogger.REQUEST_IO_LOGGER.ioException(e);\n\t\t}\n\n\t\tsend(exchange, statusCode, output);\n\t}\n\n\t/**\n\t * response\n\t * \n\t * @param exchange\n\t * @param statusCode\n\t * @param output\n\t *            auto release\n\t */\n\tprotected final void send(HttpServerExchange exchange, int statusCode, PooledByteBufferOutputStream output) {\n\t\ttry {\n\t\t\toutput.flip();\n\n\t\t\tStreamSinkChannel channel = getResponseChannel(exchange);\n\t\t\tSender sender = exchange.getResponseSender();\n\n\t\t\tsetStatusCode(exchange, statusCode);\n\t\t\tsetResponseChannel(sender, channel);\n\t\t\tsetPooledBuffers(sender, output.getPooledByteBuffers());\n\n\t\t\tsender.send(output.getByteBuffers());\n\t\t} catch (Throwable t) {\n\t\t\tUndertowLogger.REQUEST_IO_LOGGER.handleUnexpectedFailure(t);\n\t\t}\n\t}\n\n\t/**\n\t * return the buffer to the buffer pool\n\t *\n\t * @param bufferList\n\t */\n\tprivate void release(ArrayList<PooledByteBuffer> bufferList) {\n\t\tif (bufferList == null || bufferList.size() == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (int i = 0; i < bufferList.size(); ++i) {\n\t\t\tIoUtils.safeClose(bufferList.get(i));\n\t\t}\n\t}\n\n\t/**\n\t * force get response channel\n\t * \n\t * @param exchange\n\t * @return\n\t */\n\tprivate StreamSinkChannel getResponseChannel(HttpServerExchange exchange) {\n\t\tStreamSinkChannel channel = (StreamSinkChannel) unsafe().getObject(exchange,\n\t\t\t\texchangeResponseChannelFieldOffset);\n\n\t\tif (channel == null) {\n\t\t\tchannel = exchange.getResponseChannel();\n\t\t}\n\n\t\treturn channel;\n\t}\n\n\t/**\n\t * force set status code\n\t * \n\t * @param exchange\n\t * @param statusCode\n\t */\n\tprivate void setStatusCode(HttpServerExchange exchange, int statusCode) {\n\t\tint oldVal = unsafe().getInt(exchange, exchangeStatusCodeFieldOffset);\n\t\tint newVal = oldVal & ~MASK_RESPONSE_CODE | statusCode & MASK_RESPONSE_CODE;\n\n\t\tunsafe().getAndSetInt(exchange, exchangeStatusCodeFieldOffset, newVal);\n\t}\n\n\t/**\n\t * force set response channel\n\t * \n\t * @param sender\n\t * @param channel\n\t */\n\tprivate void setResponseChannel(Sender sender, StreamSinkChannel channel) {\n\t\tif (!(sender instanceof AsyncSenderImpl)) {\n\t\t\tthrow new RuntimeException(\"only support AsyncSenderImpl\");\n\t\t}\n\n\t\tunsafe().getAndSetObject(sender, asyncSenderImplChannelFieldOffset, channel);\n\t}\n\n\t/**\n\t * just for async release\n\t * \n\t * @param sender\n\t * @param pooledBuffers\n\t *            will be released\n\t */\n\tprivate void setPooledBuffers(Sender sender, PooledByteBuffer[] pooledBuffers) {\n\t\tif (!(sender instanceof AsyncSenderImpl)) {\n\t\t\tthrow new RuntimeException(\"only support AsyncSenderImpl\");\n\t\t}\n\n\t\tunsafe().getAndSetObject(sender, asyncSenderImplPooledBuffersFieldOffset, pooledBuffers);\n\t}\n\n\tstatic {\n\t\ttry {\n\t\t\tField field = HttpServerExchange.class.getDeclaredField(\"responseChannel\");\n\t\t\texchangeResponseChannelFieldOffset = unsafe().objectFieldOffset(field);\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(\"cannot find HttpServerExchange.responseChannel\", e);\n\t\t}\n\n\t\ttry {\n\t\t\tField field = HttpServerExchange.class.getDeclaredField(\"state\");\n\t\t\texchangeStatusCodeFieldOffset = unsafe().objectFieldOffset(field);\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(\"cannot find HttpServerExchange.state\", e);\n\t\t}\n\n\t\ttry {\n\t\t\tField field = AsyncSenderImpl.class.getDeclaredField(\"channel\");\n\t\t\tasyncSenderImplChannelFieldOffset = unsafe().objectFieldOffset(field);\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(\"cannot find AsyncSenderImpl.channel\", e);\n\t\t}\n\n\t\ttry {\n\t\t\tField field = AsyncSenderImpl.class.getDeclaredField(\"pooledBuffers\");\n\t\t\tasyncSenderImplPooledBuffersFieldOffset = unsafe().objectFieldOffset(field);\n\t\t} catch (Throwable e) {\n\t\t\tthrow new RuntimeException(\"cannot find AsyncSenderImpl.pooledBuffers\", e);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/java/io/undertow/async/io/PooledByteBufferInputStream.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage io.undertow.async.io;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.ByteBuffer;\nimport java.util.Objects;\n\nimport io.undertow.connector.PooledByteBuffer;\n\n/**\n * \n * @author hank.whu@gmail.com\n *\n */\npublic final class PooledByteBufferInputStream extends InputStream {\n\tpublic static final PooledByteBuffer[] EMPTY_BUFFERS = new PooledByteBuffer[0];\n\n\tprivate PooledByteBuffer[] buffers;\n\n\tprivate int index = -1;\n\tprivate ByteBuffer current;\n\n\tpublic PooledByteBufferInputStream(PooledByteBuffer[] buffers) {\n\t\tObjects.requireNonNull(buffers);\n\n\t\tfor (int i = 0; i < buffers.length; i++) {\n\t\t\tif (!buffers[i].isOpen()) {\n\t\t\t\tthrow new IllegalAccessError(\"buffers must all open\");\n\t\t\t}\n\t\t}\n\n\t\tthis.buffers = buffers;\n\t\tnext();\n\t}\n\n\tprivate void next() {\n\t\tif (buffers.length > ++index) {\n\t\t\tcurrent = buffers[index].getBuffer();\n\t\t\treturn;\n\t\t}\n\n\t\tcurrent = null;\n\t}\n\n\tpublic void flip() {\n\t\tfor (int i = 0; i < buffers.length; i++) {\n\t\t\tbuffers[i].getBuffer().flip();\n\t\t}\n\t}\n\n\t@Override\n\tpublic int read() throws IOException {\n\t\twhile (current != null && !current.hasRemaining()) {\n\t\t\tnext();\n\t\t}\n\n\t\tif (current == null) {\n\t\t\treturn -1;\n\t\t}\n\n\t\treturn current.get() & 0xFF;\n\t}\n\n\t@Override\n\tpublic int read(byte[] bytes) throws IOException {\n\t\treturn read(bytes, 0, bytes.length);\n\t}\n\n\t@Override\n\tpublic int read(byte[] bytes, int off, int len) throws IOException {\n\t\tif (bytes == null) {\n\t\t\tthrow new NullPointerException();\n\t\t} else if (off < 0 || len < 0 || len > bytes.length - off) {\n\t\t\tthrow new IndexOutOfBoundsException();\n\t\t}\n\n\t\tint readLength = 0;\n\n\t\twhile (current != null && len > 0) {\n\t\t\twhile (current != null && !current.hasRemaining()) {\n\t\t\t\tnext();\n\t\t\t}\n\n\t\t\tif (current == null) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tint currentRead = Math.min(current.remaining(), len);\n\t\t\tcurrent.get(bytes, off, currentRead);\n\n\t\t\treadLength += currentRead;\n\t\t\toff += currentRead;\n\t\t\tlen -= currentRead;\n\t\t}\n\n\t\treturn readLength == 0 ? -1 : readLength;\n\t}\n\n\t@Override\n\tpublic long skip(long n) throws IOException {\n\t\tlong remaining = n;\n\n\t\twhile (current != null && remaining > 0) {\n\t\t\twhile (current != null && !current.hasRemaining()) {\n\t\t\t\tnext();\n\t\t\t}\n\n\t\t\tif (current == null) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tint currentSkip = (int) Math.min(current.remaining(), remaining);\n\t\t\tcurrent.position(current.position() + currentSkip);\n\n\t\t\tremaining -= currentSkip;\n\t\t}\n\n\t\treturn n - remaining;\n\t}\n\n\t@Override\n\tpublic int available() throws IOException {\n\t\tint remaining = 0;\n\n\t\tfor (int i = 0; i < buffers.length; i++) {\n\t\t\tremaining += buffers[i].getBuffer().remaining();\n\t\t}\n\n\t\treturn remaining;\n\t}\n\n\t@Override\n\tpublic void close() throws IOException {\n\t\tif (buffers == null || buffers == EMPTY_BUFFERS) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (int i = 0; i < buffers.length; i++) {\n\t\t\tbuffers[i].close();\n\t\t}\n\n\t\tbuffers = EMPTY_BUFFERS;\n\t}\n\n\t@Override\n\tpublic synchronized void mark(int readlimit) {\n\t\tthrow new UnsupportedOperationException();\n\t}\n\n\t@Override\n\tpublic synchronized void reset() throws IOException {\n\t\tthrow new UnsupportedOperationException();\n\t}\n\n\t@Override\n\tpublic boolean markSupported() {\n\t\treturn false;\n\t}\n\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/java/io/undertow/async/io/PooledByteBufferOutputStream.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage io.undertow.async.io;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.nio.ByteBuffer;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.Objects;\n\nimport org.xnio.IoUtils;\n\nimport io.undertow.connector.ByteBufferPool;\nimport io.undertow.connector.PooledByteBuffer;\n\n/**\n * \n * @author hank.whu@gmail.com\n *\n */\npublic final class PooledByteBufferOutputStream extends OutputStream {\n\tprivate final ByteBufferPool byteBufferPool;\n\tprivate ArrayList<PooledByteBuffer> pooledList = new ArrayList<>(4);\n\tprivate int index = -1;\n\tprivate ByteBuffer current;\n\n\tpublic PooledByteBufferOutputStream(ByteBufferPool byteBufferPool) {\n\t\tthis.byteBufferPool = byteBufferPool;\n\t}\n\n\tpublic PooledByteBuffer[] getPooledByteBuffers() {\n\t\tPooledByteBuffer[] buffers = new PooledByteBuffer[pooledList.size()];\n\t\treturn pooledList.toArray(buffers);\n\t}\n\n\tpublic ByteBuffer[] getByteBuffers() {\n\t\tByteBuffer[] buffers = new ByteBuffer[pooledList.size()];\n\n\t\tfor (int i = 0; i < pooledList.size(); i++) {\n\t\t\tbuffers[i] = pooledList.get(i).getBuffer();\n\t\t}\n\n\t\treturn buffers;\n\t}\n\n\tpublic void flip() {\n\t\tfor (int i = 0; i < pooledList.size(); i++) {\n\t\t\tPooledByteBuffer pooled = pooledList.get(i);\n\t\t\tpooled.getBuffer().flip();\n\t\t}\n\t}\n\n\tpublic void clear() {\n\t\tfor (int i = 0; i < pooledList.size(); i++) {\n\t\t\tPooledByteBuffer pooled = pooledList.get(i);\n\t\t\tpooled.getBuffer().clear();\n\t\t}\n\n\t\tcurrent = null;\n\t\tindex = -1;\n\t}\n\n\tpublic void release() {\n\t\tfor (int i = 0; i < pooledList.size(); i++) {\n\t\t\tPooledByteBuffer pooled = pooledList.get(i);\n\t\t\tIoUtils.safeClose(pooled);\n\t\t}\n\n\t\tpooledList.clear();\n\t}\n\n\t@Override\n\tpublic void write(final byte[] bytes, int offset, int length) throws IOException {\n\t\tObjects.requireNonNull(bytes, \"bytes is null\");\n\n\t\tif (length <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (current == null) {\n\t\t\talloc();\n\t\t}\n\n\t\twhile (length > 0) {\n\t\t\tif (!current.hasRemaining()) {\n\t\t\t\talloc();\n\t\t\t}\n\n\t\t\tint writeLength = Math.min(current.remaining(), length);\n\t\t\tcurrent.put(bytes, offset, writeLength);\n\n\t\t\tlength -= writeLength;\n\t\t\toffset += writeLength;\n\t\t}\n\t}\n\n\tpublic void write(String str) throws IOException {\n\t\twrite(str.getBytes(StandardCharsets.UTF_8));\n\t}\n\n\t@Override\n\tpublic void write(byte[] bytes) throws IOException {\n\t\twrite(bytes, 0, bytes.length);\n\t}\n\n\t@Override\n\tpublic void write(int b) throws IOException {\n\t\tif (current == null || !current.hasRemaining()) {\n\t\t\talloc();\n\t\t}\n\n\t\tcurrent.put((byte) b);\n\t}\n\n\tprivate void alloc() {\n\t\tindex++;\n\n\t\tif (pooledList.size() - 1 > index) {\n\t\t\tcurrent = pooledList.get(index).getBuffer();\n\t\t\treturn;\n\t\t}\n\n\t\tPooledByteBuffer pooled = byteBufferPool.allocate();\n\t\tcurrent = pooled.getBuffer();\n\t\tpooledList.add(pooled);\n\t}\n\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/java/io/undertow/async/util/UnsafeUtils.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage io.undertow.async.util;\n\nimport sun.misc.Unsafe;\n\n/**\n * \n * @author hank.whu@gmail.com\n *\n */\npublic final class UnsafeUtils {\n\tfinal static private Unsafe _unsafe;\n\n\tstatic {\n\t\tUnsafe tmpUnsafe = null;\n\n\t\ttry {\n\t\t\tjava.lang.reflect.Field field = sun.misc.Unsafe.class.getDeclaredField(\"theUnsafe\");\n\t\t\tfield.setAccessible(true);\n\t\t\ttmpUnsafe = (sun.misc.Unsafe) field.get(null);\n\t\t} catch (java.lang.Exception e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\n\t\t_unsafe = tmpUnsafe;\n\t}\n\n\tpublic static final Unsafe unsafe() {\n\t\treturn _unsafe;\n\t}\n}\n"
  },
  {
    "path": "undertow-async-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-server.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-server.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<appender-ref ref=\"console\" />\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  },
  {
    "path": "undertow-client/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "undertow-client/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>undertow-client</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>undertow-client</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Client</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "undertow-client/src/main/java/benchmark/rpc/Client.java",
    "content": "package benchmark.rpc;\n\nimport java.util.concurrent.TimeUnit;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.annotations.BenchmarkMode;\nimport org.openjdk.jmh.annotations.Mode;\nimport org.openjdk.jmh.annotations.OutputTimeUnit;\nimport org.openjdk.jmh.annotations.Scope;\nimport org.openjdk.jmh.annotations.State;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\nimport org.openjdk.jmh.runner.options.TimeValue;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceJsonHttpClientImpl;\n\n@State(Scope.Benchmark)\npublic class Client extends AbstractClient {\n\tpublic static final int CONCURRENCY = 32;\n\n\tprivate final UserService userService = new UserServiceJsonHttpClientImpl(CONCURRENCY);\n\n\t@Override\n\tprotected UserService getUserService() {\n\t\treturn userService;\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean existUser() throws Exception {\n\t\treturn super.existUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic boolean createUser() throws Exception {\n\t\treturn super.createUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic User getUser() throws Exception {\n\t\treturn super.getUser();\n\t}\n\n\t@Benchmark\n\t@BenchmarkMode({ Mode.Throughput, Mode.AverageTime, Mode.SampleTime })\n\t@OutputTimeUnit(TimeUnit.MILLISECONDS)\n\t@Override\n\tpublic Page<User> listUser() throws Exception {\n\t\treturn super.listUser();\n\t}\n\n\tpublic static void main(String[] args) throws RunnerException {\n\t\tOptions opt = new OptionsBuilder()//\n\t\t\t\t.include(Client.class.getSimpleName())//\n\t\t\t\t.warmupIterations(3)//\n\t\t\t\t.warmupTime(TimeValue.seconds(10))//\n\t\t\t\t.measurementIterations(3)//\n\t\t\t\t.measurementTime(TimeValue.seconds(10))//\n\t\t\t\t.threads(CONCURRENCY)//\n\t\t\t\t.forks(1)//\n\t\t\t\t.build();\n\n\t\tnew Runner(opt).run();\n\t}\n\n}\n"
  },
  {
    "path": "undertow-server/.gitignore",
    "content": "/.apt_generated_tests/\n"
  },
  {
    "path": "undertow-server/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<groupId>benchmark.rpc</groupId>\n\t<artifactId>undertow-server</artifactId>\n\t<version>round-5</version>\n\t<packaging>jar</packaging>\n\n\t<name>undertow-server</name>\n\t<url>http://maven.apache.org</url>\n\n\t<properties>\n\t\t<maven.compiler.source>11</maven.compiler.source>\n\t\t<maven.compiler.target>11</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<version.benchmark-base>round-5</version.benchmark-base>\n\t\t<version.undertow>2.0.17.Final</version.undertow>\n\t</properties>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>benchmark.rpc</groupId>\n\t\t\t<artifactId>benchmark-base</artifactId>\n\t\t\t<version>${version.benchmark-base}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.undertow</groupId>\n\t\t\t<artifactId>undertow-core</artifactId>\n\t\t\t<version>${version.undertow}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>4.12</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t</dependencies>\n\n\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>3.8.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>${maven.compiler.source}</source>\n\t\t\t\t\t<target>${maven.compiler.target}</target>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-resources-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<encoding>UTF-8</encoding>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t\n\t\t\t<plugin>\n\t\t\t\t<artifactId>maven-assembly-plugin</artifactId>\n\t\t\t\t<version>3.1.0</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<descriptorRefs>\n\t\t\t\t\t\t<descriptorRef>jar-with-dependencies</descriptorRef>\n\t\t\t\t\t</descriptorRefs>\n\t\t\t\t\t<archive>\n\t\t\t\t\t\t<manifest>\n\t\t\t\t\t\t\t<mainClass>benchmark.rpc.Server</mainClass>\n\t\t\t\t\t\t</manifest>\n\t\t\t\t\t</archive>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>make-assembly</id> <!-- this is used for inheritance merges -->\n\t\t\t\t\t\t<phase>package</phase> <!-- bind to the packaging phase -->\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>single</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t</resource>\n\t\t</resources>\n\t</build>\n</project>\n"
  },
  {
    "path": "undertow-server/src/main/java/benchmark/rpc/Server.java",
    "content": "package benchmark.rpc;\n\nimport benchmark.rpc.undertow.server.CreateUserHandler;\nimport benchmark.rpc.undertow.server.UserExistHandler;\nimport benchmark.rpc.undertow.server.GetUserHandler;\nimport benchmark.rpc.undertow.server.ListUserHandler;\nimport io.undertow.Undertow;\nimport io.undertow.UndertowOptions;\nimport io.undertow.server.HttpHandler;\nimport io.undertow.server.handlers.PathHandler;\n\npublic class Server {\n\n\tpublic static final String host = \"benchmark-server\";\n\tpublic static final int port = 8080;\n\n\tpublic static void main(String[] args) {\n\t\tUndertow.builder()//\n\t\t\t\t.addHttpListener(port, host)//\n\t\t\t\t.setServerOption(UndertowOptions.ALWAYS_SET_KEEP_ALIVE, false)//\n\t\t\t\t.setServerOption(UndertowOptions.ALWAYS_SET_DATE, false)//\n\t\t\t\t.setHandler(paths())//\n\t\t\t\t.build()//\n\t\t\t\t.start();\n\t}\n\n\tprivate static HttpHandler paths() {\n\t\treturn new PathHandler()//\n\t\t\t\t.addExactPath(\"/user-exist\", new UserExistHandler())//\n\t\t\t\t.addExactPath(\"/create-user\", new CreateUserHandler())//\n\t\t\t\t.addExactPath(\"/get-user\", new GetUserHandler())//\n\t\t\t\t.addExactPath(\"/list-user\", new ListUserHandler())//\n\t\t;\n\t}\n\n}\n"
  },
  {
    "path": "undertow-server/src/main/java/benchmark/rpc/undertow/server/CreateUserHandler.java",
    "content": "package benchmark.rpc.undertow.server;\n\nimport java.nio.ByteBuffer;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport benchmark.bean.User;\nimport benchmark.rpc.util.ByteBufferUtils;\nimport benchmark.rpc.util.JsonUtils;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.undertow.server.HttpHandler;\nimport io.undertow.server.HttpServerExchange;\n\npublic class CreateUserHandler implements HttpHandler {\n\n\tprivate final ByteBuffer trueResult = ByteBufferUtils.allocateDirect(\"true\");\n\tprivate final ByteBuffer falseResult = ByteBufferUtils.allocateDirect(\"false\");\n\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tpublic void handleRequest(HttpServerExchange _exchange) throws Exception {\n\t\t_exchange.getRequestReceiver().receiveFullBytes(//\n\t\t\t\t(exchange, data) -> {// do stuff with the data\n\t\t\t\t\ttry {\n\t\t\t\t\t\tUser user = objectMapper.readValue(data, User.class);\n\t\t\t\t\t\tuserService.createUser(user);\n\n\t\t\t\t\t\texchange.getResponseSender().send(trueResult.duplicate());\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\te.printStackTrace();\n\t\t\t\t\t\texchange.setStatusCode(500);\n\t\t\t\t\t\texchange.getResponseSender().send(falseResult.duplicate());\n\t\t\t\t\t}\n\t\t\t\t}, //\n\t\t\t\t(exchange, exception) -> {// optional error handler\n\t\t\t\t\texchange.setStatusCode(500);\n\t\t\t\t\texchange.getResponseSender().send(falseResult.duplicate());\n\t\t\t\t});\n\t}\n\n}\n"
  },
  {
    "path": "undertow-server/src/main/java/benchmark/rpc/undertow/server/GetUserHandler.java",
    "content": "package benchmark.rpc.undertow.server;\n\nimport java.nio.ByteBuffer;\nimport java.util.Deque;\nimport java.util.Map;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport benchmark.bean.User;\nimport benchmark.rpc.util.ByteBufferUtils;\nimport benchmark.rpc.util.JsonUtils;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.undertow.server.HttpHandler;\nimport io.undertow.server.HttpServerExchange;\n\npublic class GetUserHandler implements HttpHandler {\n\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tpublic void handleRequest(HttpServerExchange exchange) throws Exception {\n\t\tMap<String, Deque<String>> params = exchange.getQueryParameters();\n\t\tString idStr = params.get(\"id\").getFirst();\n\t\tlong id = Integer.parseInt(idStr);\n\n\t\tUser user = userService.getUser(id);\n\n\t\tbyte[] bytes = objectMapper.writeValueAsBytes(user);\n\t\tByteBuffer buffer = ByteBufferUtils.allocate(bytes);\n\n\t\texchange.getResponseSender().send(buffer);\n\t}\n\n}\n"
  },
  {
    "path": "undertow-server/src/main/java/benchmark/rpc/undertow/server/ListUserHandler.java",
    "content": "package benchmark.rpc.undertow.server;\n\nimport java.nio.ByteBuffer;\nimport java.util.Deque;\nimport java.util.Map;\n\nimport com.fasterxml.jackson.databind.ObjectMapper;\n\nimport benchmark.bean.Page;\nimport benchmark.bean.User;\nimport benchmark.rpc.util.ByteBufferUtils;\nimport benchmark.rpc.util.JsonUtils;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.undertow.server.HttpHandler;\nimport io.undertow.server.HttpServerExchange;\n\npublic class ListUserHandler implements HttpHandler {\n\n\tprivate final ObjectMapper objectMapper = JsonUtils.objectMapper;\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tpublic void handleRequest(HttpServerExchange exchange) throws Exception {\n\t\tMap<String, Deque<String>> params = exchange.getQueryParameters();\n\t\tString pageNoStr = params.get(\"pageNo\").getFirst();\n\t\tint pageNo = Integer.parseInt(pageNoStr);\n\n\t\tPage<User> userList = userService.listUser(pageNo);\n\n\t\tbyte[] bytes = objectMapper.writeValueAsBytes(userList);\n\t\tByteBuffer buffer = ByteBufferUtils.allocate(bytes);\n\n\t\texchange.getResponseSender().send(buffer);\n\t}\n\n}\n"
  },
  {
    "path": "undertow-server/src/main/java/benchmark/rpc/undertow/server/UserExistHandler.java",
    "content": "package benchmark.rpc.undertow.server;\n\nimport java.nio.ByteBuffer;\nimport java.util.Deque;\nimport java.util.Map;\n\nimport benchmark.rpc.util.ByteBufferUtils;\nimport benchmark.service.UserService;\nimport benchmark.service.UserServiceServerImpl;\nimport io.undertow.server.HttpHandler;\nimport io.undertow.server.HttpServerExchange;\n\npublic class UserExistHandler implements HttpHandler {\n\n\tprivate final ByteBuffer trueResult = ByteBufferUtils.allocateDirect(\"true\");\n\tprivate final ByteBuffer falseResult = ByteBufferUtils.allocateDirect(\"false\");\n\tprivate final UserService userService = new UserServiceServerImpl();\n\n\t@Override\n\tpublic void handleRequest(HttpServerExchange exchange) throws Exception {\n\t\tMap<String, Deque<String>> params = exchange.getQueryParameters();\n\t\tString email = params.get(\"email\").getFirst();\n\n\t\tif (userService.existUser(email)) {\n\t\t\texchange.getResponseSender().send(trueResult.duplicate());\n\t\t} else {\n\t\t\texchange.getResponseSender().send(falseResult.duplicate());\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "undertow-server/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<jmxConfigurator />\n\n\t<appender name=\"console\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<appender name=\"rollingFile\"\n\t\tclass=\"ch.qos.logback.core.rolling.RollingFileAppender\">\n\t\t<file>logs/benchmark-rpc-server.log</file>\n\t\t<rollingPolicy class=\"ch.qos.logback.core.rolling.TimeBasedRollingPolicy\">\n\t\t\t<fileNamePattern>logs/benchmark-rpc-server.%d{yyyy-MM-dd}.log.gz\n\t\t\t</fileNamePattern>\n\t\t</rollingPolicy>\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<!-- project default level -->\n\t<logger name=\"benchmark.rpc\" level=\"INFO\" />\n\n\t<root level=\"WARN\">\n\t\t<appender-ref ref=\"console\" />\n\t\t<appender-ref ref=\"rollingFile\" />\n\t</root>\n</configuration>\n"
  }
]