TarsJava 快速入门

服务开发

接口文件定义

接口文件定义是通过Tars接口描述语言来定义,在src/main/resources目录下建立hello.tars文件,内容如下

  1. module TestApp
  2. {
  3. interface Hello
  4. {
  5. string hello(int no, string name);
  6. };
  7. };

接口文件编译

提供插件编译生成java代码,在tars-maven-plugin添加生成java文件配置

  1. <plugin>
  2. <groupId>com.tencent.tars</groupId>
  3. <artifactId>tars-maven-plugin</artifactId>
  4. <version>1.6.1</version>
  5. <configuration>
  6. <tars2JavaConfig>
  7. <!-- tars文件位置 -->
  8. <tarsFiles>
  9. <tarsFile>${basedir}/src/main/resources/hello.tars</tarsFile>
  10. </tarsFiles>
  11. <!-- 源文件编码 -->
  12. <tarsFileCharset>UTF-8</tarsFileCharset>
  13. <!-- 生成服务端代码 -->
  14. <servant>true</servant>
  15. <!-- 生成源代码编码 -->
  16. <charset>UTF-8</charset>
  17. <!-- 生成的源代码目录 -->
  18. <srcPath>${basedir}/src/main/java</srcPath>
  19. <!-- 生成源代码包前缀 -->
  20. <packagePrefixName>com.qq.tars.quickstart.server.</packagePrefixName>
  21. </tars2JavaConfig>
  22. </configuration>
  23. </plugin>

在工程根目录下执行mvn tars:tars2java

  1. @Servant
  2. public interface HelloServant {
  3. public String hello(int no, String name);
  4. }

服务接口实现

新创建一个HelloServantImpl.java文件,实现HelloServant.java接口

  1. public class HelloServantImpl implements HelloServant {
  2. @Override
  3. public String hello(int no, String name) {
  4. return String.format("hello no=%s, name=%s, time=%s", no, name, System.currentTimeMillis());
  5. }
  6. }

服务暴露配置

在resources下创建一个servants.xml的配置文件,服务编写后需要进程启动时加载配置暴露服务,配置如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <servants>
  3. <servant name="HelloObj">
  4. <home-api>com.qq.tars.quickstart.server.testapp.HelloServant</home-api>
  5. <home-class>com.qq.tars.quickstart.server.testapp.impl.HelloServantImpl</home-class>
  6. </servant>
  7. </servants>

说明:除了此方法之外,还可以采用spring模式来配置服务,详情见tars_java_spring.md。

服务编译打包

在工程根目录下执行 mvn package生成war包,后续可以管理系统进行发布。

客户端同步/异步调用服务

  • 构建客户端工程项目
  • 添加依赖
<dependency>
    <groupId>com.tencent.tars</groupId>
       <artifactId>tars-client</artifactId>
       <version>1.6.1</version>
       <type>jar</type>
</dependency>
  • 添加插件

    <plugin>
         <groupId>com.tencent.tars</groupId>
         <artifactId>tars-maven-plugin</artifactId>
         <version>1.6.1</version>
         <configuration>
             <tars2JavaConfig>
                 <!-- tars文件位置 -->
                 <tarsFiles>
                     <tarsFile>${basedir}/src/main/resources/hello.tars</tarsFile>
                 </tarsFiles>
                 <!-- 源文件编码 -->
                 <tarsFileCharset>UTF-8</tarsFileCharset>
                 <!-- 生成代码,PS:客户端调用,这里需要设置为false -->
                 <servant>false</servant>
                 <!-- 生成源代码编码 -->
                 <charset>UTF-8</charset>
                 <!-- 生成的源代码目录 -->
                 <srcPath>${basedir}/src/main/java</srcPath>
                 <!-- 生成源代码包前缀 -->
                 <packagePrefixName>com.qq.tars.quickstart.client.</packagePrefixName>
             </tars2JavaConfig>
         </configuration>
    </plugin>
    
- 根据服务tars接口文件生成代码
​```java
@Servant
public interface HelloPrx {

    public String hello(int no, String name);

          public String hello(int no, String name, @TarsContext java.util.Map<String, String> ctx);

          public void async_hello(@TarsCallback HelloPrxCallback callback, int no, String name);

          public void async_hello(@TarsCallback HelloPrxCallback callback, int no, String name, @TarsContext java.util.Map<String, String> ctx);
}
  • 同步调用
public static void main(String[] args) {
    CommunicatorConfig cfg = new CommunicatorConfig();
        //构建通信器
        Communicator communicator = CommunicatorFactory.getInstance().getCommunicator(cfg);
        //通过通信器,生成代理对象
        HelloPrx proxy = communicator.stringToProxy(HelloPrx.class, "TestApp.HelloServer.HelloObj");
        String ret = proxy.hello(1000, "HelloWorld");
        System.out.println(ret);
}
  • 异步调用
public static void main(String[] args) {
    CommunicatorConfig cfg = new CommunicatorConfig();
        //构建通信器
        Communicator communicator = CommunicatorFactory.getInstance().getCommunicator(cfg);
        //通过通信器,生成代理对象
        HelloPrx proxy = communicator.stringToProxy(HelloPrx.class, "TestApp.HelloServer.HelloObj");
        proxy.async_hello(new HelloPrxCallback() {

            @Override
            public void callback_expired() {
            }

            @Override
            public void callback_exception(Throwable ex) {
            }

            @Override
            public void callback_hello(String ret) {
                System.out.println(ret);
            }
        }, 1000, "HelloWorld");
}