zainali5120
2021-04-22 380d515da39a7873847edb9a761a501b8b495d15
优化TRC20同步
2 files modified
78 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/blackchain/service/TrxUsdtUpdateService.java 35 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/blackchain/service/TrxUsdtUpdateService.java
@@ -12,10 +12,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.tron.common.utils.ByteArray;
@@ -55,7 +52,7 @@
    /**
     *  扫块 同步充值USDT-TRC20和TRX
     */
    public void monitorCoinListener() {
    public void monitorCoinListener(Long blockNum) {
        if (CollectionUtils.isEmpty(addressList)) {
            List<MemberCoinAddressEntity> coinAddressList = memberCoinAddressDao.selectAllBlockAddressBySymbolAndTag(CoinTypeEnum.USDT.name(), "TRC20");
            if (CollectionUtils.isNotEmpty(coinAddressList)) {
@@ -64,23 +61,6 @@
                });
            }
        }
        // 扫块区块
       Object trc20BlockNum = redisUtils.get("USDT_TRC20_BLOCK_NUM");
        if(trc20BlockNum==null){
            trc20BlockNum = 28471475L;
        }
        Long blockNum = Long.valueOf(trc20BlockNum.toString());
//        log.info("---{}",blockNum);
        // 查询一下最新区块
        long getnowblock = getnowblock()-20L;
//        log.info("--->{}, {}", blockNum, System.currentTimeMillis());
        if(getnowblock<blockNum){
            // 如果当前区块比最新已确认区块还大,则不继续执行
            return;
        }
        redisUtils.set("USDT_TRC20_BLOCK_NUM",blockNum + 1L);
        if (CollectionUtils.isEmpty(addressList)) {
            return;
        }
@@ -215,7 +195,7 @@
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("TRON-PRO-API-KEY",Trc20Service.API_KEY);
        HttpEntity<String> request = new HttpEntity<>(param);
        HttpEntity<String> request = new HttpEntity<>(param,headers);
        ResponseEntity<String> result = restTemplate.postForEntity(url, request, String.class);
//        System.out.println("url:" + url + ",param:" + param + ",result:" + result.getBody());
        return result;
@@ -349,10 +329,15 @@
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("TRON-PRO-API-KEY",Trc20Service.API_KEY);
        //HttpEntity<String> request = new HttpEntity<>();
        String forObject = restTemplate.getForObject(url, String.class);
        HttpEntity<String> request = new HttpEntity<>(headers);
        ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
        String forObject = exchange.getBody();
        //System.out.println(forObject);
        // String forObject = restTemplate.getForObject(url, String.class);
        String number = JSON.parseObject(forObject).getJSONObject("block_header").getJSONObject("raw_data").getString("number");
        return Long.valueOf(number);
    }
}
src/main/java/com/xcong/excoin/quartz/job/BlockCoinUpdateJob.java
@@ -13,7 +13,9 @@
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
 * 链上币种同步任务
@@ -22,7 +24,7 @@
 * @date 2020-07-02
 **/
@Component
@ConditionalOnProperty(prefix = "app", name = "block-job", havingValue = "true")
//@ConditionalOnProperty(prefix = "app", name = "block-job", havingValue = "true")
public class BlockCoinUpdateJob {
    @Resource
@@ -34,6 +36,11 @@
    @Resource
    RedisUtils redisUtils;
    // 创世区块时间 ,每三秒出一个块
    private final static Long TRX_CSQK=1530442002L;
    public static ConcurrentLinkedQueue<Long> TRC_BLOCK = new ConcurrentLinkedQueue<>();
    /**
     * TRC20_USDT 同步
     */
@@ -41,14 +48,43 @@
    @Async
    public void usdtTc20Update() {
        // 波场3秒出一个块
        trxUsdtUpdateService.monitorCoinListener();
        Long blocnNum = TRC_BLOCK.poll();
        if(blocnNum==null){
            return;
        }
        trxUsdtUpdateService.monitorCoinListener(blocnNum);
    }
    @Scheduled(cron = "0/2 * * * * ? ")
    public void usdtTc20UpdateQueue() {
        // 当前时间戳
        long currentTimeMillis = System.currentTimeMillis()/1000;
        // 计算当前最新区块
        // 波场3秒出一个块 根据创世区块的时间可以计算出当前最新区块号
        Long count = (currentTimeMillis-TRX_CSQK)/3;
        // 减去未确认的区块
        long getnowblock =count-25;
        // 生成块到队列
        Object trc20BlockNum = redisUtils.get("USDT_TRC20_BLOCK_NUM");
        if(trc20BlockNum==null){
            // 没有则取最新的块
            trc20BlockNum =getnowblock;
            redisUtils.set("USDT_TRC20_BLOCK_NUM",getnowblock);
        }
        Long blockNum = Long.valueOf(trc20BlockNum.toString());
        if(getnowblock<blockNum){
            // 如果当前区块比最新已确认区块还大,则不继续执行
            return;
        }
        // 将得到的区块+1 放入队列
        TRC_BLOCK.add(blockNum+1L);
        redisUtils.incr("USDT_TRC20_BLOCK_NUM",1);
    }
    /**
     * ETH_USDT 同步 使用扫块 废弃这个定时任务
     */
    //@Scheduled(cron = "0 0/10 * * * ? ")
    @Deprecated
    //@Deprecated
    public void ethUsdtUpdate() {
        blockCoinService.updateEthUsdt();
    }
@@ -84,4 +120,5 @@
        blockCoinService.updateXrp();
    }
}