6. 订阅服务示例
订阅服务提供了星火链网-底层区块链平台区块、交易订阅功能。本节为星火链订阅服务的示例。
6.1节描述环境要求;
6.2节描述方法说明;
6.3节订阅示例。
github代码库地址:https://github.com/CAICT-DEV/bif-core-subscribe-tool
6.1 环境要求
本节描述订阅服务环境要求。
6.2 方法说明
本节描述订阅服务提供的主要方法。包括AddChainResponseMethod、AddChainMethod、send方法。
6.2.1 AddChainResponseMethod
接口说明
该接口用于接收响应消息。
调用方法
BlockChainAdapter AddChainResponseMethod(Overlay.ChainMessageType.CHAIN_HELLO_VALUE,new BlockChainAdapterProc() {public void ChainMethod (byte[] msg, int length) {}});
请求参数
序号 | 类型 | 说明 |
---|---|---|
1 | Overlay.ChainMessageType.CHAIN_HELLO_VALUE | hello数据类型 |
2 | BlockChainAdapterProc(){} | 定义消息处理方法 |
示例
//接收hello响应消息
BlockChainAdapter.AddChainResponseMethod(Overlay.ChainMessageType.CHAIN_HELLO_VALUE, new BlockChainAdapterProc() {
public void ChainMethod (byte[] msg, int length) {
OnChainHello(msg, length);
}
});
6.2.2 AddChainMethod
接口说明
该接口用于接收请求消息,请求消息是区块链实时推送的消息。
调用方法
BlockChainAdapter AddChainMethod(Overlay.ChainMessageType.CHAIN_TX_ENV_STORE_VALUE,,new BlockChainAdapterProc() {public void ChainMethod (byte[] msg, int length) {}});
请求参数
序号 | 类型 | 说明 |
---|---|---|
1 | Overlay.ChainMessageType.CHAIN_TX_ENV_STORE_VALUE/CHAIN_LEDGER_TXS_VALUE | 交易/区块数据类型 |
2 | BlockChainAdapterProc(){} | 定义消息处理方法 |
示例
//接收区块链实时推送的消息-交易信息
BlockChainAdapter.AddChainMethod(Overlay.ChainMessageType.CHAIN_TX_ENV_STORE_VALUE, new BlockChainAdapterProc() {
public void ChainMethod (byte[] msg, int length) {
OnChainTxEnvStore(msg, length);
}
});
//接收区块链实时推送的消息-区块信息
BlockChainAdapter.AddChainMethod(Overlay.ChainMessageType.CHAIN_LEDGER_TXS_VALUE, new BlockChainAdapterProc() {
public void ChainMethod (byte[] msg, int length) {
OnChainLedgerTxs(msg, length);
}
});
6.2.3 Send
接口说明
该接口订阅指定账号交易信息。
调用方法
BlockChainAdapter Send(Overlay.ChainMessageType.CHAIN_SUBSCRIBE_TX.getNumber(), tx.build().toByteArray()));
请求参数
序号 | 类型 | 说明 |
---|---|---|
1 | Overlay.ChainMessageType.CHAIN_SUBSCRIBE_TX.getNumber() | 交易/区块数据类型 |
示例
//订阅指定账号交易信息
String srcAddress="";
Overlay.ChainSubscribeTx.Builder tx=Overlay.ChainSubscribeTx.newBuilder();
tx.addAddress(srcAddress);
if (!BlockChainAdapter.Send(Overlay.ChainMessageType.CHAIN_SUBSCRIBE_TX.getNumber(), tx.build().toByteArray())) {
System.out.println("send tx failed");
}
6.3 订阅示例
该示例主要实现功能为订阅did:bid:efHmvWpqfVzv5rLNSMrhEdNegLz9AcnS账号交易信息。
示例
private static chain_test chainTest;
/**
* BIF-Core-SDK
*/
String httpUrl = "http://172.19.6.22:37002";
BIFSDK sdk = BIFSDK.getInstance(httpUrl);
/**
* 订阅服务
*/
String webSocketUrl = "ws://172.19.6.22:810";
boolean isConnected = false;
/**
* 订阅账号
*/
String srcAddress = "did:bid:efHmvWpqfVzv5rLNSMrhEdNegLz9AcnS";
/**
* 消息适配器
*/
private BlockChainAdapter chain_message_one_;
public static void main(String[] argv) {
chainTest = new chain_test();
chainTest.Initialize();
System.out.println("*****************start chain_message successfully******************");
//chainTest.Stop();
}
public void Stop() {
chain_message_one_.Stop();
}
/**
* 订阅初始化
*/
public void Initialize() {
chain_message_one_ = new BlockChainAdapter(webSocketUrl);
//接收hello响应消息
chain_message_one_.AddChainResponseMethod(Overlay.ChainMessageType.CHAIN_HELLO_VALUE, new BlockChainAdapterProc() {
public void ChainMethod (byte[] msg, int length) {
OnChainHello(msg, length);
}
});
//接收区块链实时推送的消息-交易信息
chain_message_one_.AddChainMethod(Overlay.ChainMessageType.CHAIN_TX_ENV_STORE_VALUE, new BlockChainAdapterProc() {
public void ChainMethod (byte[] msg, int length) {
OnChainTxEnvStore(msg, length);
}
});
//接收区块链实时推送的消息-区块信息
chain_message_one_.AddChainMethod(Overlay.ChainMessageType.CHAIN_LEDGER_TXS_VALUE, new BlockChainAdapterProc() {
public void ChainMethod (byte[] msg, int length) {
OnChainLedgerTxs(msg, length);
}
});
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//发送hello请求
Overlay.ChainHello.Builder chain_hello = Overlay.ChainHello.newBuilder();
chain_hello.setTimestamp(System.currentTimeMillis());
if (!chain_message_one_.Send(Overlay.ChainMessageType.CHAIN_HELLO.getNumber(), chain_hello.build().toByteArray())) {
System.out.println("send hello failed");
}
//订阅指定账号交易信息
Overlay.ChainSubscribeTx.Builder tx=Overlay.ChainSubscribeTx.newBuilder();
tx.addAddress(srcAddress);
if (!chain_message_one_.Send(Overlay.ChainMessageType.CHAIN_SUBSCRIBE_TX.getNumber(), tx.build().toByteArray())) {
System.out.println("send tx failed");
}
}
//hello消息处理
private void OnChainHello(byte[] msg, int length) {
try {
Overlay.ChainStatus chain_status = Overlay.ChainStatus.parseFrom(msg);
System.out.println("chain_status "+chain_status);
isConnected = true;
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
//交易消息处理
private void OnChainTxEnvStore(byte[] msg, int length) {
try {
Chain.TransactionEnvStore envStore = Chain.TransactionEnvStore.parseFrom(msg);
System.out.println("OnChainTxEnvStore hash:" + ToHex.bytesToHex(envStore.getHash().toByteArray()));
} catch (Exception e) {
e.printStackTrace();
}
}
//区块消息处理
private void OnChainLedgerTxs(byte[] msg, int length) {
try {
Overlay.LedgerTxs envStore = Overlay.LedgerTxs.parseFrom(msg);
System.out.println("header size:" + envStore.getLedgerLength());
} catch (Exception e) {
e.printStackTrace();
}
}