-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathTradeEventHandler.java
More file actions
84 lines (74 loc) · 3.78 KB
/
TradeEventHandler.java
File metadata and controls
84 lines (74 loc) · 3.78 KB
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
package com.cleanengine.coin.chart.handler;
import com.cleanengine.coin.chart.dto.PrevRateDto;
import com.cleanengine.coin.chart.dto.RealTimeDataDto;
import com.cleanengine.coin.chart.dto.TradeEventDto;
import com.cleanengine.coin.chart.service.ChartSubscriptionService; // 의존성 추가
import com.cleanengine.coin.chart.service.RealTimeDataPrevRateService;
import com.cleanengine.coin.chart.service.RealTimeTradeService;
import com.cleanengine.coin.chart.service.WebsocketSendService;
import com.cleanengine.coin.trade.application.TradeExecutedEvent;
import com.cleanengine.coin.trade.entity.Trade;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionalEventListener;
@Component
@RequiredArgsConstructor
@Slf4j
public class TradeEventHandler {
private final RealTimeTradeService realTimeTradeService;
private final WebsocketSendService websocketSendService;
private final ChartSubscriptionService chartSubscriptionService; // 주입
private final RealTimeDataPrevRateService realTimeDataPrevRateService;
//event로 이벤틀 처리해야한다.
//eventListener는 void로 처리를 해야한다
@TransactionalEventListener
public void handleTradeEvent(TradeExecutedEvent event) {
Trade trade = event.getTrade();
if (trade == null) {
log.warn("Trade 객체가 null");
return;
}
String ticker = trade.getTicker();
TradeEventDto tradeEventDto = getTradeEventDto(trade);
log.debug("TradeEventHandler 수신 : {}", trade);
// 실시간 데이터 체결내역
// 해당 종목에 대한 구독자가 있는지 확인
if (chartSubscriptionService.isSubscribedToRealTimeTradeRate(ticker)) {
log.debug("종목 {} 실시간 체결 정보 구독자 확인됨. 데이터 처리 및 전송 시작.", ticker);
//실시간 체결가 및 변동률 전송
try {
RealTimeDataDto dto = realTimeTradeService.generateRealTimeData(tradeEventDto);
websocketSendService.sendChangeRate(dto, dto.getTicker()); // dto.getTicker()는 이미 ticker와 동일
log.debug("실시간 체결가 및 변동률 업데이트 전송 완료 : {}", ticker);
} catch (Exception e) {
log.error("종목 {} 실시간 체결가 및 변동률 업데이트 전송 중 오류: {}", ticker, e.getMessage(), e);
}
} else {
log.debug("종목 {} 실시간 체결 정보 구독자 없음. 데이터 전송 생략.", ticker);
}
//전날 종가 변동률 전송
if(chartSubscriptionService.isSubscribedToPrevRate(ticker)) {
log.debug("종목 {} 전일 대비 변동률 구독자 확인됨. 데이터 전송 시작.", ticker);
try {
PrevRateDto dto = realTimeDataPrevRateService.generatePrevRateData(tradeEventDto);
websocketSendService.sendPrevRate(dto, dto.getTicker()); // dto.getTicker()는 이미 ticker와 동일
log.debug("종목 {} 전일 대비 변동률 전송 완료 : {}", ticker, dto);
} catch (Exception e) {
log.error("종목 {} 전일 대비 변동률 전송 중 오류: {}", ticker, e.getMessage(), e);
}
}else {
log.debug("종목 {} 전일 대비 변동률 구독자 없음. 데이터 전송 생략.", ticker);
}
}
@NotNull
public static TradeEventDto getTradeEventDto(Trade trade) {
return new TradeEventDto(
trade.getTicker(),
trade.getSize(),
trade.getPrice(),
trade.getTradeTime()
);
}
}