1. 问题描述
我们的项目是基于端到端通信的。分为客户端、服务端。项目大致分为5个模块。 server、client、core、common以及test模块。 显而易见,server是服务端模块,client是客户端模块,core是项目核心数据结构模块,common是公共类模块(比如一些工具类),test模块从各个子项目抽出来的作为一个单独的test模块。 项目地址:DistKV Project 欢迎star、fork以及contributing。现在的问题是:需要在test模块中测试跟服务端的通信,看得到的结果是否符合预期。 最简单的做法就是:在测试的时候,我们在server模块,通过IEDA点击绿色的Run按钮,就可以启动服务端了,然后在test模块运行测试代码,完成了测试之后,我们再去server模块Stop掉服务端。 这样做存在的问题在于:每次测试都要Run一下服务端的代码,不麻烦? 而且我们运行mvn test命令的时候,应该不需要关心server模块的东西。这称为"解耦合"?
(资料图片仅供参考)
2. 解决办法
我们先考虑在命令行中应该怎么去跑一个程序。简单的Hello World大家都会跑,无非就是先用javac编译,再java运行。但是Hello World不需要依赖其他jar包,所以这样是可行的。 而我们的服务端DstRpcServer.java文件里面依赖了很多第三方包,所以我们单纯的进入到server模块的DstRpcServer.java文件所在路径,执行下面两条语句是不行的。 javac DstRpcServer.java以及 java DstRpcServer原因有两个:
第一个是依赖很多第三方jar包。第二个是因为该路径不是classpath。
注:maven项目的classpath一般在模块下的target/classes下面。 因此,如果我们要在命令行中运行这个DstRpcServer.java,应该怎么运行? 第一步:需要将相关依赖打包成一个jar包,设置DstRpcServer为入口主类。此阶段只要借助以下插件完成。
maven-assembly-pluginjar-with-dependenciesorg.dst.server.service.DstRpcServermake-assemblypackagesingle
第二步:运行 java -classpath C:\Users\Administrator\Desktop\gitProject\dst\server\target\dst-server-1.0-SNAPSHOT-jar-with-dependencies.jar org.dst.server.service.DstRpcServer此处的classpath是我本地项目的路径。类名应该是完整类名,即包名+类名。 但我们怎么在执行mvn test的时候让其执行呢。 完整解决办法:我们在test模块中,利用ProcessBuilder类去新创建一个进程去执行这个命令。执行完之后再销毁该进程。 需要注意的点是:我们需要根据每个人电脑的上的项目路径来动态获取classpath。
public class TestUtil { private static final Logger LOGGER = LoggerFactory.getLogger(TestUtil.class); //get the relative path private static final String SUFFIX_JAR_DIR = "server" + File.separator + "target" + File.separator + "dst-server-1.0-SNAPSHOT-jar-with-dependencies.jar"; private static Process rpcServerProcess = null; /** * @param command the command to start rpc server using a new process. */ private static void executeCommand(Listcommand) { try { LOGGER.debug("Executing command: {}", String.join(" ", command)); ProcessBuilder processBuilder = new ProcessBuilder(command).redirectOutput(ProcessBuilder.Redirect.INHERIT) .redirectError(ProcessBuilder.Redirect.INHERIT); rpcServerProcess = processBuilder.start(); // TODO(qwang): Refine this wait rpcServerProcess.waitFor(1, TimeUnit.SECONDS); } catch (Exception e) { rpcServerProcess.destroy(); throw new RuntimeException("Error executing command " + String.join(" ", command), e); } } public static void startRpcServer() { final File userDir = new File(System.getProperty("user.dir")); // get the absolute path final String jarDir = userDir.getParent() + File.separator + SUFFIX_JAR_DIR; final ListstartCommand = ImmutableList.of( "java", "-classpath", jarDir, "org.dst.server.service.DstRpcServer" ); executeCommand(startCommand); } public static void stopRpcServer() { rpcServerProcess.destroy(); }}
然后在测试代码中调用该类的方法。
public class DstRpcServerTest { @Test public void testRpcServer() { //start the server TestUtil.startRpcServer(); RpcClientOptions options = new RpcClientOptions(); options.setProtocolType(Options.ProtocolType.PROTOCOL_BAIDU_STD_VALUE); options.setWriteTimeoutMillis(1000); options.setReadTimeoutMillis(1000); options.setMaxTotalConnections(1000); options.setMinIdleConnections(10); String url = "list://127.0.0.1:8082"; RpcClient client = new RpcClient(url, options); DstStringService stringService = BrpcProxy.getProxy(client, DstStringService.class); // Test string put request DstServerProtocol.StringPutRequest stringPutRequest = DstServerProtocol.StringPutRequest.newBuilder() .setKey("k1") .setValue("v1") .build(); DstServerProtocol.StringPutResponse stringResponse = stringService.strPut(stringPutRequest); Assertions.assertEquals("ok", stringResponse.getResult()); // Test string get request DstServerProtocol.StringGetRequest strGetRequest = DstServerProtocol.StringGetRequest.newBuilder() .setKey("k1") .build(); DstServerProtocol.StringGetResponse stringGetRequest = stringService.strGet(strGetRequest); Assertions.assertEquals("v1", stringGetRequest.getResult()); client.stop();// stop the server TestUtil.stopRpcServer(); }}
近日,首届兴智杯全国人工智能创新应用大赛行业赋能专题赛结果揭晓,6个涉煤项目获奖。 其中,国家能源集团物资公司国家能源智慧供应链更多
2023-02-08 10:05:25据商务部重要生产资料市场监测系统显示,上周(2023年1月23日-29日),云南省煤炭均价为1525元吨,环比下跌03%。其中,无烟煤均价1000元更多
2023-02-08 10:07:09蒙古GoGo网消息,额尔登斯塔本陶勒盖公司计划从2月中旬起在网上交易煤炭。 据Mysteel集团通报称,额尔登斯塔本陶勒盖公司将从2月中旬起更多
2023-02-08 10:07:48受中下游环节库存高企、终端企业消费低迷和澳煤进口放宽等因素影响,节后动力煤市场悲观情绪蔓延,价格承压持续下跌,目前北方港口各主流更多
2023-02-08 10:15:23近日,在中国煤炭工业协会开展的煤炭企业优秀五小技术创新成果评比中,由CCTD创新发明的数字煤市一体机荣获一等奖。 CCTD以数字赋能传更多
2023-02-08 09:55:44上周,由于国际终端用户库存普遍较高,对进口动力煤采购意愿持续低迷,澳大利亚动力煤价格继续下行,而由于受到印度煤炭现货市场需求增加更多
2023-02-07 15:00:43中国平煤神马集团利用自主研发的第二代烯法生产环己醇催化技术生产的纯苯精脱硫催化剂、苯部分加氢催化剂、环己烯水合催化剂,因催化性能更多
2023-02-07 11:02:082月6日下午,中国工程院院士、浙江理工大学校长、浙江省现代纺织技术创新中心主任陈文兴,北京服装学院材料设计与工程学院教授、原院长、更多
2023-02-07 11:15:56据CCTD了解,近日,国家能源局再核准新疆地区两个煤矿项目,产能合计360万吨年。 ①吐鲁番七泉湖矿区新域煤矿120万吨年项目:建设单位更多
2023-02-07 09:57:00近日,国家矿山安监局贵州局、贵州省应急管理厅、贵州省自然资源厅、贵州省能源局、贵州省司法厅、贵州省高级人民法院、贵州省人民检察院更多
2023-02-07 10:01:15