在Java项目中使用BaaS REST前,需要获取REST身份、获取 REST SDK、添加依赖及修改配置项。
关于如何获取 REST 身份,请参见文档 获取REST身份。
SDK 通用说明
第一步:添加依赖
在 pom 中依赖 restclient 的 Jar 包,可以通过下载SDK到本地,并按如下方式引入SDK;也可以通过直接下载Demo工程进行(点击下载Demo工程)。
SDK下载链接
不带依赖的下载链接:rest-client-2.16.5.jar
自带依赖的下载链接:rest-client-2.16.5-with-dependencies.ja
说明使用自带依赖的JAR包,则无需在POM文件中添加下方间接依赖的内容。
依赖形式
直接依赖
// 该命令在项目中运行 // 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);
}
}
}
}