2016-09-23 5 views

답변

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는 로그인을 시도하지 않습니다.