【问题标题】:Why does connection close automatically after 1 minute using Akka TCP?为什么使用 Akka TCP 1 分钟后连接会自动关闭?
【发布时间】:2015-04-24 23:59:59
【问题描述】:

我正在使用 Scala 和 Akka actor 编写一个 Interactive Broker 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 套接字)连接,我不会有相同的行为

【问题讨论】:

  • 我使用的基于 Akka 的 WebSocket 库也会发生同样的情况,大概是出于同样的原因。我很困惑。
  • 我今天重试了,但不再超时。但我仍然不明白原因。
  • 你在什么系统(mac、Linux、windows)上做这个?这很可能是套接字超时。
  • 它在 Mac 上。 OS X 10.9 小牛队。

标签: scala akka akka-io


【解决方案1】:

您是否尝试过使用保活选项?

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

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多