监听事件的模板如下:
(注意:链上监听时采用的WebSocket,容易断开,需要自己断线重连处理)
/**
* 监听NFT合约事件
*/
public JSONObject subscribeTradeEvent() {
JSONObject obj=new JSONObject();
Web3j web3j = null;
WebSocketService ws =null;
WebSocketClient webSocketClient=null;
ThreadPoolExecutor threadPoolExecutor = GameConstant.getTradeThreadPoolExecutor();
try {
String coin_ws_url = SystemParamUtil.getCoinWsUrl();
webSocketClient=new WebSocketClient(new URI(coin_ws_url));
ws = new WebSocketService(webSocketClient, false);
ws.connect();
web3j = Web3j.build(ws);
EthFilter filter = new EthFilter(DefaultBlockParameterName.LATEST, DefaultBlockParameterName.LATEST, contractAddress_ntf);
Event event1 = new Event(BtTradeConstant.transferForNft,Arrays.asList(new TypeReference<Address>() {},new TypeReference<Address>() {},new TypeReference<Uint256>() {}));
// Event event2 = new Event(BtTradeConstant.safeTransferFromWithMemoForNft,Arrays.asList(new TypeReference<Address>() {},new TypeReference<Address>() {},new TypeReference<Uint256>() {}
// ,new TypeReference<Utf8String>() {}));
// Event event3 = new Event(BtTradeConstant.safeBatchTransferFromWithMemoNft,Arrays.asList(new TypeReference<Address>() {},new TypeReference<Address>() {},new TypeReference<DynamicArray<Uint256>>() {}
// ,new TypeReference<Utf8String>() {}));
filter.addOptionalTopics(EventEncoder.encode(event1)/*,EventEncoder.encode(event2),EventEncoder.encode(event3)*/);
logger.warn("==============启动监听NFT合约交易事件==================");
web3j.ethLogFlowable(filter).subscribe(log -> {
logger.warn("========收到事件(NFT),hash== " +log.getTransactionHash());
//处理自己的业务
});
}catch (Exception e) {
logger.error("=====subscribeTradeEvent(NFT)监听器异常==================", e);
try {
if(web3j!=null){
web3j.shutdown();
}
if(ws!=null){
ws.close();
}
if(webSocketClient!=null){
webSocketClient.close();
}
} catch (Exception e1) {
logger.error("=====subscribeTradeEvent sleep(NFT)异常==================", e1);
}
}
obj.put("Web3j", web3j);
obj.put("WebSocketService", ws);
obj.put("WebSocketClient", webSocketClient);
return obj;
}
//断线重连
public class NftDaemonThread extends Thread{
private static final Logger logger = LoggerFactory.getLogger(NftDaemonThread.class);
private JSONObject subscribeObj;
private NftTradeListener tradeListener;
public NftDaemonThread(){
}
public NftDaemonThread(JSONObject subscribeObj,NftTradeListener tradeListener){
this.subscribeObj=subscribeObj;
this.tradeListener=tradeListener;
}
@Override
public void run() {
logger.warn("============启动NFT合约监听守护线程=============");
while(true){
try {
Web3j web3j = (Web3j) subscribeObj.get("Web3j");
WebSocketService ws =(WebSocketService) subscribeObj.get("WebSocketService");
WebSocketClient webSocketClient= (WebSocketClient) subscribeObj.get("WebSocketClient");
if(webSocketClient!=null&&!webSocketClient.isOpen()){
if(web3j!=null){
web3j.shutdown();
}
if(ws!=null){
ws.close();
}
webSocketClient.close();
JSONObject subscribeObj=tradeListener.subscribeTradeEvent();
//启动合约监听守护线程
NftDaemonThread nftDaemonThread=new NftDaemonThread(subscribeObj,tradeListener);
nftDaemonThread.start();
break;
}
Thread.sleep(5000);
} catch (InterruptedException e) {
logger.error("========================NftDaemonThread异常=====================",e);
}
}
}
}