2016-09-23 12 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はログインしようとしません。

関連する問題