聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

世界快報:java命令行中的DstRpcServer怎么運行?操作步驟

來源:CSDN 時間:2023-02-07 10:25:55

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();  }}

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 岛国精品在线