您的位置:首页 > 数据 >
全球球精选!java命令行中的DstRpcServer怎么运行?操作步骤
来源:CSDN 2023-02-08 10:55:52

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个涉煤项目荣获首届全国人工智能创新应用大赛奖 环球动态

6个涉煤项目荣获首届全国人工智能创新应用大赛奖

  近日,首届兴智杯全国人工智能创新应用大赛行业赋能专题赛结果揭晓,6个涉煤项目获奖。  其中,国家能源集团物资公司国家能源智慧供应链更多

2023-02-08 10:05:25
1月第四周云南省煤炭价格环比略跌

1月第四周云南省煤炭价格环比略跌

  据商务部重要生产资料市场监测系统显示,上周(2023年1月23日-29日),云南省煤炭均价为1525元吨,环比下跌03%。其中,无烟煤均价1000元更多

2023-02-08 10:07:09
蒙古煤炭单日进口量超过千车 创两年新高|每日讯息

蒙古煤炭单日进口量超过千车 创两年新高|每日讯息

  蒙古GoGo网消息,额尔登斯塔本陶勒盖公司计划从2月中旬起在网上交易煤炭。  据Mysteel集团通报称,额尔登斯塔本陶勒盖公司将从2月中旬起更多

2023-02-08 10:07:48
CCTD:动力煤市场偏弱,但不宜过度看空_今日播报

CCTD:动力煤市场偏弱,但不宜过度看空_今日播报

  受中下游环节库存高企、终端企业消费低迷和澳煤进口放宽等因素影响,节后动力煤市场悲观情绪蔓延,价格承压持续下跌,目前北方港口各主流更多

2023-02-08 10:15:23
CCTD发明“楼宇里的煤市AI机器人——数字煤市一体机”荣获一等奖|焦点热文

CCTD发明“楼宇里的煤市AI机器人——数字煤市一体

  近日,在中国煤炭工业协会开展的煤炭企业优秀五小技术创新成果评比中,由CCTD创新发明的数字煤市一体机荣获一等奖。  CCTD以数字赋能传更多

2023-02-08 09:55:44
全球讯息:CCTD:国际主要港口动力煤价格涨跌互现

全球讯息:CCTD:国际主要港口动力煤价格涨跌互现

  上周,由于国际终端用户库存普遍较高,对进口动力煤采购意愿持续低迷,澳大利亚动力煤价格继续下行,而由于受到印度煤炭现货市场需求增加更多

2023-02-07 15:00:43
全球热头条丨中国平煤神马集团新产品一年增收过亿元

全球热头条丨中国平煤神马集团新产品一年增收过亿

  中国平煤神马集团利用自主研发的第二代烯法生产环己醇催化技术生产的纯苯精脱硫催化剂、苯部分加氢催化剂、环己烯水合催化剂,因催化性能更多

2023-02-07 11:02:08
中国平煤神马集团聘任中国工程院院士陈文兴为首席科学家_世界速读

中国平煤神马集团聘任中国工程院院士陈文兴为首席

  2月6日下午,中国工程院院士、浙江理工大学校长、浙江省现代纺织技术创新中心主任陈文兴,北京服装学院材料设计与工程学院教授、原院长、更多

2023-02-07 11:15:56
近三个月国家能源局已核准新疆7个煤矿项目 产能1230万吨/年_全球热议

近三个月国家能源局已核准新疆7个煤矿项目 产能1

  据CCTD了解,近日,国家能源局再核准新疆地区两个煤矿项目,产能合计360万吨年。  ①吐鲁番七泉湖矿区新域煤矿120万吨年项目:建设单位更多

2023-02-07 09:57:00
贵州出台矿山安全行刑衔接实施办法-全球快资讯

贵州出台矿山安全行刑衔接实施办法-全球快资讯

  近日,国家矿山安监局贵州局、贵州省应急管理厅、贵州省自然资源厅、贵州省能源局、贵州省司法厅、贵州省高级人民法院、贵州省人民检察院更多

2023-02-07 10:01:15