1
zj
2024-08-14 dedaaf738a1d483b4594d46622eaa9791f7e5bcd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package org.example.task;
 
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.example.common.*;
import org.example.pojo.Currency;
import org.example.pojo.bo.CurrencyBitgetBo;
import org.example.server.impl.CurrencySerivceImpl;
import org.example.util.ConverterUtil;
import org.example.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.sql.SQLOutput;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
 
/**
 * @program: demo
 * @description: bitget交易所
 * @create: 2024-07-15 17:24
 **/
@Component
@Slf4j
public class BitgetStock {
 
    @Autowired
    private CurrencySerivceImpl currencyService;
 
    private final Lock syncCurrencyLock = new ReentrantLock();
 
 
    /**
     * 同步bitget交易所交易对
     */
    @Scheduled(cron = "0 0/45 * * * ?")
//    @Scheduled(cron = "0/10 * * * * ?")
    public void syncCurrency() {
        //  使用Lock来确保同步
        syncCurrencyLock.lock();
        log.info("【同步bitget交易所交易对】---->开始");
        try {
            sync();
        } catch (Exception e) {
            log.error("【同步bitget交易所交易对】出现异常:    " + e.getMessage());
            e.printStackTrace();
        } finally {
            syncCurrencyLock.unlock();
            log.info("【同步bitget交易所交易对】---->结束");
        }
    }
 
    public void sync() throws IOException {
        //  调用外部接口获取数据
        String json = doGet();
        //  对返回数据格式进行校验
        if (json != null && !json.isEmpty()) {
            ObjectMapper objectMapper = new ObjectMapper();
            Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {
            });
            String symbolsJson = objectMapper.writeValueAsString(map.get("data"));
            Gson gson = new Gson();
            List<CurrencyBitgetBo> getList = gson.fromJson(symbolsJson, new TypeToken<List<CurrencyBitgetBo>>() {
            }.getType());
 
            getList.parallelStream().forEach(person -> person.setSymbol(StringUtils.remove(person.getSymbol(), "-")));
 
            List<Currency> dbList = currencyService.list(new LambdaQueryWrapper<Currency>().eq(Currency::getSource,"bitget"));
            Set<String> symbolSet = getList.stream().map(CurrencyBitgetBo::getSymbol).collect(Collectors.toSet());
            List<Currency> removeList = dbList.stream()
                    .filter(currency -> !symbolSet.contains(currency.getSymbol()))
                    .collect(Collectors.toList());
 
            if(CollectionUtils.isNotEmpty(removeList)){
                removeList.forEach(f->{
                    RedisUtil.delete("bitget"+f.getSymbol());
                });
            }
 
            //  获取数据库中已有的symbol列表
            currencyService.remove(new LambdaQueryWrapper<Currency>().eq(Currency::getSource,"bitget"));
 
            List<Currency> saveList = getList.stream()
                    .map(currency -> {
                        Currency newCurrency = new Currency();
                        newCurrency.setSymbol(currency.getSymbol());
                        newCurrency.setBaseAsset(currency.getBaseCoin());
                        newCurrency.setQuoteAsset(currency.getQuoteCoin());
                        newCurrency.setSource(currency.getSource());
                        return newCurrency;
                    })
                    .collect(Collectors.toList());
            //  批量保存新增数据到数据库
            if (CollectionUtils.isNotEmpty(saveList)) {
                currencyService.saveBatch(saveList);
            }
        } else {
            log.info("同步bitget交易所交易对,外部接口返回数据为空");
        }
    }
 
    public static String doGet() throws IOException {
        HttpClient httpClient = HttpClients.createDefault();
        HttpGet request = new HttpGet("https://api.bitget.com/api/v2/spot/public/symbols");
        HttpResponse response = httpClient.execute(request);
        try {
            // 处理响应内容
            HttpEntity entity = response.getEntity();
            String responseBody = EntityUtils.toString(entity);
            return responseBody;
        } finally {
            // 确保释放资源
            EntityUtils.consume(response.getEntity());
        }
    }
}