如何使用不响应的Akka Java API创建TCP接收器

时间:2016-11-07 19:20:49

标签: java tcp streaming akka

我使用此example作为我的起点。

在该示例中,服务器使用修改后的文本进行响应,但在我的情况下,服务器不需要响应。

查看其他类似的问题,我知道我可以传递Empty ByteString或使用filter(p - > false)来不发回任何内容。但是,在这种情况下,问题是我的whenComplete块没有被执行。即异常被吞噬。有办法避免这种情况吗?帮助赞赏!

connections.runForeach(connection -> {
System.out.println("New connection from: " + connection.remoteAddress());

final Flow<ByteString, ByteString, NotUsed> echo = Flow.of(ByteString.class)
.via(Framing.delimiter(ByteString.fromString("\n"), 256, FramingTruncation.DISALLOW))
.map(ByteString::utf8String)
.map(s -> s + "!!!\n")
.map(ByteString::fromString);

connection.handleWith(echo, mat);
}, mat).whenComplete((done,throwable) -> 
    { 
    //exception handling
    }
);

1 个答案:

答案 0 :(得分:0)

您的分析是正确的,现在您在服务器关闭而不是每个连接时做出反应。

对完成的各个连接的反应将在传递给连接的流程中完成,如下所示:

final Tcp tcp = Tcp.get(system);
tcp.bind("127.0.0.1", 6789).runForeach((connection) -> {

  final Flow<ByteString, ByteString, NotUsed> echo = Flow.of(ByteString.class)
    .via(Framing.delimiter(ByteString.fromString("\n"), 256, FramingTruncation.DISALLOW))
    .map(ByteString::utf8String)
    .map(s -> s + "!!!\n")
    .map(ByteString::fromString)
    .watchTermination((notUsed, completionStage) -> {
      completionStage.whenComplete((done, exception) -> {
        System.out.println("Connection from " + connection.remoteAddress() + " completed");
      });
      return notUsed;
    });

  connection.handleWith(echo, materializer);
}, materializer);