4

Scala と Akka アクターを使用してインタラクティブ ブローカー API を作成しています。

サーバーに接続し、IO マネージャーと通信して要求を送信し、TWS からの応答を受信するクライアント アクターがあります。接続は正常に機能し、リクエストを送信してレスポンスを取得できます。

その後、1 分後に IO マネージャーから PeerClosed メッセージを自動的に受け取ります。明示的に閉じない限り、接続を開いたままにしたいと思います。設定しようとしましkeepOpenOnPeerClosed = trueたが、何も変わりません。

アクターは次のとおりです。

class Client(remote: InetSocketAddress, clientId: Int, extraAuth: Boolean, onConnected: Session => Unit, listener: EWrapper) extends Actor {
    final val ClientVersion: Int = 63
    final val ServerVersion: Int = 38
    final val MinServerVerLinking: Int = 70

    import Tcp._
    import context.system

    IO(Tcp) ! Connect(remote)

    def receive = {

        case CommandFailed(_: Connect) =>
          print("connect failed")
          context stop self

        case c@Connected(remote, local) => {

          val connection = sender()
          connection ! Register(self, keepOpenOnPeerClosed = true)
          context become connected(connection,1)
          val clientVersionBytes = ByteString.fromArray(String.valueOf(ClientVersion).getBytes() ++ Array[Byte](0.toByte))
          println("Sending Client Version " + clientVersionBytes)
          sender() ! Write(clientVersionBytes)
       }
     }
      def connected(connection: ActorRef, serverVersion: Int): Receive = {
        case request: Request =>
          print("Send request " + request)
          connection ! Write(ByteString(request.toBytes(serverVersion)))
        case CommandFailed(w: Write) =>
          connection ! Close
          print("write failed")
        case Received(data) => {
          println(data)
          implicit val is = new DataInputStream(new ByteArrayInputStream(data.toArray))
          EventDispatcher.consumers.get(readInt()) match {
            case Some(consumer) => {
              consumer.consume(listener, serverVersion)
            }
            case None => {
              listener.error(EClientErrors.NoValidId, EClientErrors.UnknownId.code, EClientErrors.UnknownId.msg)
            }
          }
        }
        case _ : ConnectionClosed => context stop self
      }    

IBJts API (標準の Java Socket を使用) を使用して接続した場合、同じ動作はし​​ません。

4

1 に答える 1

2

キープアライブオプションで試しましたか?

sender ! Tcp.SO.KeepAlive(on = true)

于 2015-04-24T15:59:59.893 に答える