Akka源发送不完整的消息

时间:2018-08-09 09:21:45

标签: scala akka akka-stream bytestream

我正在通过akka Source和Tcp发送字节作为字节字符串数组,完整数组的长度包括:begin ++ len ++ gzip ++ sign ++ term是997,但是只有710个字节到达服务器。代码在这里:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Source, Tcp}
import akka.util.ByteString
import scala.concurrent.duration._
import scala.concurrent.{Await, Future}


class UpperServiceClient(ip: String, port: Int){
  def run = {
    implicit val system = ActorSystem("ClientSys")
    implicit val materializer = ActorMaterializer()

    ...
    // Initializing of (begin, len, gzip, sign, term) arrays
    ...

    val conn = Tcp().outgoingConnection(ip, port)
    val res: Future[ByteString] = Source(begin ++ len ++ gzip ++ sign ++ term).via(conn).
      runFold(ByteString.empty) { (acc, in) => acc ++ in }

    val resp = Await.result(res, 3.seconds)
  }
}

服务器接受并成功处理前710个字节。服务器上没有问题,是因为当我尝试从另一个客户端发送那些字节时消息已完成。 有什么想法可以解决这个问题吗?还是有人可以建议如何将邮件分成两部分并通过一个连接发送?

1 个答案:

答案 0 :(得分:0)

可能解决方案是从Source值而非Iterator值构造Array

val sourceIterator : () => Iterator[ByteString] = 
  () => Iterable.apply(begin, len, gzip, sign, term)
                .map(_.iterator)
                .reduceLeftOption(_ ++ _)
                .getOrElse(Iterator.empty)

val byteStringSource : Source[ByteString,_] = Source fromIterator sourceIterator

如果这不起作用,那么我猜想有一个配置设置(在客户端akka,客户端OS或客户端网络接口中,...)正在设置出站邮件大小的限制... < / p>