연결 IP에 도달 할 수없는 시나리오를 상상해보십시오. 이 경우 QuickFIX/J는 매개 변수 ReconnectInterval
으로 구성된 30 초마다 자동으로 다시 연결을 시도합니다. 어떻게 이러한 행동을 피할 수 있습니까?QuickFix/J가 연결에 실패 할 때 어떻게 자동 재 연결을 피합니까?
1
A
답변
0
이 아이디어는 QuickFix/J에서 ReconnectInterval
매개 변수를 검색하고 Session
이 아직 로그온하지 않은 경우에만 Session
을 죽일 별도의 스레드를 만듭니다.
이 작업을 수행하려면 QuickFix/J 스레드가 다시 연결하기 전에 스레드를 분명히 해고해야합니다. 다시 말하면, ReconnectInterval=30
을 설정했다면 ... 앞서 언급 한 스레드를 실행하고 모든 초기화 프로그램을 닫아야합니다. 이렇게하면 QuickFix/J는 다시 연결을 재 시도하지 않게됩니다.
import java.io.InputStream
import java.util.Locale
import scala.util.control.NonFatal
import quickfix._
import quickfix.field._
class SimpleConnection(val configInputStream: InputStream,
val messageFactory: quickfix.MessageFactory)
extends MessageCracker
with quickfix.Application {
private val locale = Locale.getDefault.getCountry
private val settings = new SessionSettings(configInputStream)
private val storeFactory = new FileStoreFactory(settings)
private val loggerFactory = new QuickfixLoggerFactory(settings)
private var initiatorOption: Option[SocketInitiator] = None
private var sessionOption : Option[SessionID] = None
private var senderSeqOption: Option[Int] = None
private var targetSeqOption: Option[Int] = None
override def onLogout(sessionId: SessionID): Unit = {
log.info("onLogout called for %s".format(sessionId))
initiatorOption.foreach(initiator => initiator.stop(true))
fireDisconnectedState // inform listeners
initiatorOption = None
sessionOption = None
}
override def onCreate(sessionId: SessionID): Unit = {
log.info("onCreate called for %s".format(sessionId))
val session = Session.lookupSession(sessionId)
val interval = settings.getLong(session.getSessionID, "ReconnectInterval")
if(interval <= 10)
log.error("ReconnectInterval should be at least 10secs.")
else {
import java.util.concurrent.Executors
import scala.concurrent.ExecutionContext
val executor = ExecutionContext.fromExecutor(Executors.newSingleThreadExecutor)
val monitor = new Runnable {
override def run(): Unit = {
val sleep = (interval-5)*1000
Thread.sleep(sleep)
if(!session.isLoggedOn) {
log.warn("Killing QuickFix/J session before reconnection.")
onLogout(session.getSessionID)
}
}
}
executor.execute(monitor)
}
senderSeqOption.foreach(session.setNextSenderMsgSeqNum(_))
targetSeqOption.foreach(session.setNextTargetMsgSeqNum(_))
senderSeqOption = None
targetSeqOption = None
}
}
1
애플리케이션 클래스는 ApplicationExtended
대신 Application
확장해야합니다. 그런 다음 canLogon 메서드를 무시하고 false를 반환하면 Quickfixj는 로그인을 시도하지 않습니다.