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