SDK 使用说明

在Java项目中使用BaaS REST前,需要获取REST身份、获取 REST SDK、添加依赖及修改配置项。

说明

关于如何获取 REST 身份,请参见文档 获取REST身份

SDK 通用说明

第一步:添加依赖

在 pom 中依赖 restclient 的 Jar 包,可以通过下载SDK到本地,并按如下方式引入SDK;也可以通过直接下载Demo工程进行(点击下载Demo工程)。

SDK下载链接

依赖形式

  • 直接依赖

    // 该命令在项目中运行
    // mvn install:install-file -Dfile=jar包的位置 -DgroupId=com.antfinancial.antchain.baas.tool -DartifactId=rest-client -Dversion=2.16.5 -Dpackaging=jar
    // 运行成功后再pom.xml增加相应依赖
    <dependency>
        <groupId>com.antfinancial.antchain.baas.tool</groupId>
        <artifactId>rest-client</artifactId>
        <version>2.16.5</version>
    </dependency>
    
  • 间接依赖

    <dependencies>
         <dependency>
             <groupId>com.alipay.mychainx</groupId>
             <artifactId>mychainx-sdk-java-all</artifactId>
             <version>0.10.2.24.5</version>
         </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
             <version>3.5</version>
         </dependency>
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
             <version>1.2.83</version>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
             <version>23.0</version>
         </dependency>
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcpkix-jdk15on</artifactId>
             <version>1.66</version>
         </dependency>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
             <version>4.4.1</version>
         </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-core</artifactId>
             <version>4.3.13.RELEASE</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-autoconfigure</artifactId>
             <version>2.7.10</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
             <version>2.7.10</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.retry</groupId>
             <artifactId>spring-retry</artifactId>
             <version>1.1.5.RELEASE</version>
         </dependency>
     </dependencies>
    
说明

demo中使用的 Spring Boot 版本为 2.7.10,如果您有任何兼容性问题,请联系蚂蚁技术支持。

第二步:添加配置项

我们将交易分成三种类别:

  • 查询交易:所有查询交易都不需要签名(需要明确指定bizid,不需要链相关的配置)。        

  • 需要管理员签名的交易:包括创建账户/冻结账户,部署原生合约(需要明确指定bizid,不需要链相关的配置)。

  • 其他交易:需要使用本地私钥签名和使用KMS签名。其中3类交易如果需要使用KMS签名的,需要配置tenantid,否则,需要配置其他的配置项,但是无论是那种配置,都可以使用1和2两类交易。    

说明
  • 第1种和第2种交易均需要明确指定bizid,无需链相关的配置。 以上三种交易如果需要使用KMS签名的,则需要配置tenantid,否则,需要配置其他的配置项。不论是哪种配置,都可以使用第1和第2类交易。

  • 关于如何获取bizid,可参见 开始使用REST服务 > 获取链ID

添加配置项后的示例代码如下:

mychain:
  rest:
    bizid: ad73c6dc  #链的bizid  可以在控制台
    cipher-suit: ec  #链的签名算法 ec or sm  默认为ec
    rest-url: https://rest.baas.alipay.com   #resturl,为固定值,无需更改
    access-id: baas_admin                #ak,可在控制台链操作栏下的更多 > 查看REST身份,获取Access-ID
    access-secret: access.key            #secret,可在控制台链操作栏下的更多 > 获取REST身份,下载AccessKey
    default-account: wasm_test           #账户名,托管模式不需要配置,可在控制台上创建非托管账户后填入,
    default-account-key: user.key        #账户私钥,托管模式不需要配置,可在控制台创建非托管账户后获取,需放在项目的resources目录中
    default-account-pwd: 123Yui*2        #账户密码,托管模式不需要配置,可在控制台创建非托管账户后填入
    tenantid: mytenant                   #使用KMS签名,需要tenantid,即阿里云UID;非托管模式可以不需要
    account: 为密钥托管账户的账户名,非托管模式不需要
    kmsId: 为密钥托管账户kmsidkey,可以在控制台查看,非托管模式不需要
说明

在配置过程中,以上参数请不要全部配置。如果是托管模式,则只需配置托管模式相关的参数;如果是非托管模式,则只需配置非托管模式相关的参数。

第三步:注入restclient类

@Autowired
private RestClient restClient;

消费托管MQ的使用说明

在Java项目中使用BaaS REST进行消费托管MQ之前,请参见本文上方的 SDK 通用说明获取REST身份、下载 REST SDK、添加依赖及修改配置项。

说明
  • 在修改配置项时,无需进行链账户相关的额外配置。

  • SDK 版本需升级至2.15.3及以上版本,消费托管MQ相关的接口参数,请参见 消费托管MQ接口

消费托管MQ的示例主干代码如下:

package com.alipay.mychain.baas.demo;

import com.antfinancial.mychain.baas.tool.restclient.RestClient;
import com.antfinancial.mychain.baas.tool.restclient.model.MQAckRequest;
import com.antfinancial.mychain.baas.tool.restclient.model.MQMessage;
import com.antfinancial.mychain.baas.tool.restclient.request.AckMQMessageRequest;
import com.antfinancial.mychain.baas.tool.restclient.request.ConsumeMQMessageRequest;
import com.antfinancial.mychain.baas.tool.restclient.response.AckMQMessageResponse;
import com.antfinancial.mychain.baas.tool.restclient.response.ConsumeMQMessageResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;

@SpringBootApplication
public class MQConsumerDemo implements CommandLineRunner {

    @Autowired
    private RestClient restClient;

    // 配置下行数据流ID;在BaaS数据导出服务控制台中,导出任务ID即为下行数据流ID
    private static String streamId = "WG6qO8WQ";

    public boolean worker(MQMessage message) {
        // 消息处理逻辑, 会保证消息至少被处理一次
        System.out.println("Received " + message.getMessage_id() + ": " + message.getMessage_body());
        return true;
    }

    public static void main(String[] args){
        try {
            SpringApplication springApplication = new SpringApplication(MQConsumerDemo.class);
            springApplication.run(args);
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    public void run(String... strings) throws Exception {
        final ConsumeMQMessageRequest request = new ConsumeMQMessageRequest();
        request.setStreamId(streamId);
        // 循环消费消息
        while(true) {
            ConsumeMQMessageResponse response = restClient.consumeMQMessage(request);
            if (response.getError().getCode() == 200) {
                // 成功获取的待消费的消息,构造消息的 Ack 请求,并逐条消息调用 worker 进行处理(性能不足时可以改为并发调用 worker)
                AckMQMessageRequest ackMQMessageRequest = new AckMQMessageRequest();
                ackMQMessageRequest.setStreamId(streamId);
                ackMQMessageRequest.setMqAckRequests(new ArrayList<MQAckRequest>(response.getResult().size()));
                for (MQMessage msg : response.getResult()) {
                    MQAckRequest ackRequest = new MQAckRequest();
                    ackRequest.setReceipt_handle(msg.getReceipt_handle());
                    ackRequest.setState(worker(msg) ? "success" : "failed");
                    ackMQMessageRequest.getMqAckRequests().add(ackRequest);
                }
                if (ackMQMessageRequest.getMqAckRequests().size() > 0) {
                    // 确认消息的处理结果,失败的消息会在一定时间后重新被 consumeMQMessage 消费到
                    AckMQMessageResponse ackMQMessageResponse = restClient.ackMQMessage(ackMQMessageRequest);
                    if (response.getError().getCode() != 200) {
                        System.out.println("Ack mq message failed: " + ackMQMessageResponse.getError().getCode() + ", " + ackMQMessageResponse.getError().getMessage());
                    }
                }
            } else {
                System.out.println("Consume mq message failed: " + response.getError().getCode() + ", " + response.getError().getMessage());
                Thread.sleep(1000);
            }
        }


    }
}