@@ -19,14 +19,10 @@ package com.njkim.reactivecrypto.idax
19
19
import com.fasterxml.jackson.databind.ObjectMapper
20
20
import com.fasterxml.jackson.module.kotlin.readValue
21
21
import com.njkim.reactivecrypto.core.common.model.currency.CurrencyPair
22
+ import com.njkim.reactivecrypto.core.netty.HeartBeatHandler
22
23
import com.njkim.reactivecrypto.idax.model.IdaxMessageFrame
23
24
import com.njkim.reactivecrypto.idax.model.IdaxOrderBook
24
25
import com.njkim.reactivecrypto.idax.model.IdaxTickData
25
- import io.netty.channel.ChannelHandlerContext
26
- import io.netty.handler.codec.http.websocketx.TextWebSocketFrame
27
- import io.netty.handler.timeout.IdleState
28
- import io.netty.handler.timeout.IdleStateEvent
29
- import io.netty.handler.timeout.IdleStateHandler
30
26
import mu.KotlinLogging
31
27
import reactor.core.publisher.Flux
32
28
import reactor.core.publisher.toFlux
@@ -62,8 +58,10 @@ class IdaxRawWebsocketClient(
62
58
return HttpClient .create()
63
59
.tcpConfiguration { tcp ->
64
60
tcp.doOnConnected {
65
- // okex websocket 은 30초동안 응답이 없는경우 해당 연결을 끊는다. 이를 막기 위해서 20초마다 ping 요청을 보낸다.
66
- it.addHandlerFirst(" heartBeat" , HeartBeatHandler (false , 2 , 0 , 0 , TimeUnit .SECONDS ))
61
+ it.addHandlerFirst(
62
+ " heartBeat" ,
63
+ HeartBeatHandler (false , 2 , TimeUnit .SECONDS , 1 ) { " {\" event\" :\" ping\" }" }
64
+ )
67
65
}
68
66
}
69
67
.websocket()
@@ -96,8 +94,10 @@ class IdaxRawWebsocketClient(
96
94
return HttpClient .create()
97
95
.tcpConfiguration { tcp ->
98
96
tcp.doOnConnected {
99
- // okex websocket 은 30초동안 응답이 없는경우 해당 연결을 끊는다. 이를 막기 위해서 20초마다 ping 요청을 보낸다.
100
- it.addHandlerFirst(" heartBeat" , HeartBeatHandler (false , 2 , 0 , 0 , TimeUnit .SECONDS ))
97
+ it.addHandlerFirst(
98
+ " heartBeat" ,
99
+ HeartBeatHandler (false , 2 , TimeUnit .SECONDS , 1 ) { " {\" event\" :\" ping\" }" }
100
+ )
101
101
}
102
102
}
103
103
.websocket()
@@ -138,20 +138,4 @@ class IdaxRawWebsocketClient(
138
138
}
139
139
.map { objectMapper.readValue<IdaxMessageFrame <List <IdaxOrderBook >>>(it) }
140
140
}
141
-
142
- private inner class HeartBeatHandler (
143
- observeOutput : Boolean ,
144
- readerIdleTime : Long ,
145
- writerIdleTime : Long ,
146
- allIdleTime : Long ,
147
- unit : TimeUnit
148
- ) : IdleStateHandler(observeOutput, readerIdleTime, writerIdleTime, allIdleTime, unit) {
149
-
150
- @Throws(Exception ::class )
151
- override fun channelIdle (ctx : ChannelHandlerContext , evt : IdleStateEvent ) {
152
- if (evt.state() == IdleState .READER_IDLE ) {
153
- ctx.channel().writeAndFlush(TextWebSocketFrame (" {\" event\" :\" ping\" }" ))
154
- }
155
- }
156
- }
157
141
}
0 commit comments