rename akka-docs dir to docs (#62)

This commit is contained in:
PJ Fanning 2022-12-02 10:49:40 +01:00 committed by GitHub
parent 13dce0ec69
commit 708da8caec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
1029 changed files with 2033 additions and 2039 deletions

View file

@ -0,0 +1,107 @@
/*
* Copyright (C) 2015-2022 Lightbend Inc. <https://www.lightbend.com>
*/
package jdocs.stream.io;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.concurrent.CompletionStage;
import org.apache.pekko.Done;
import org.apache.pekko.NotUsed;
import org.apache.pekko.actor.ActorSystem;
import org.apache.pekko.stream.ActorAttributes;
import org.apache.pekko.stream.javadsl.Sink;
import org.apache.pekko.stream.javadsl.FileIO;
import org.apache.pekko.stream.javadsl.Source;
import jdocs.AbstractJavaTest;
import jdocs.stream.SilenceSystemOut;
import org.apache.pekko.testkit.javadsl.TestKit;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.apache.pekko.stream.*;
import org.apache.pekko.util.ByteString;
public class StreamFileDocTest extends AbstractJavaTest {
static ActorSystem system;
@BeforeClass
public static void setup() {
system = ActorSystem.create("StreamFileDocTest");
}
@AfterClass
public static void tearDown() {
TestKit.shutdownActorSystem(system);
system = null;
}
final SilenceSystemOut.System System = SilenceSystemOut.get();
{
// Using 4 spaces here to align with code in try block below.
// #file-source
final Path file = Paths.get("example.csv");
// #file-source
}
{
// #file-sink
final Path file = Paths.get("greeting.txt");
// #file-sink
}
@Test
public void demonstrateMaterializingBytesWritten() throws IOException {
final Path file = Files.createTempFile(getClass().getName(), ".tmp");
try {
// #file-source
Sink<ByteString, CompletionStage<Done>> printlnSink =
Sink.<ByteString>foreach(chunk -> System.out.println(chunk.utf8String()));
CompletionStage<IOResult> ioResult = FileIO.fromPath(file).to(printlnSink).run(system);
// #file-source
} finally {
Files.delete(file);
}
}
@Test
public void demonstrateSettingDispatchersInCode() throws IOException {
final Path file = Files.createTempFile(getClass().getName(), ".tmp");
try {
Sink<ByteString, CompletionStage<IOResult>> fileSink =
// #custom-dispatcher-code
FileIO.toPath(file)
.withAttributes(ActorAttributes.dispatcher("custom-blocking-io-dispatcher"));
// #custom-dispatcher-code
} finally {
Files.delete(file);
}
}
@Test
public void demontrateFileIOWriting() throws IOException {
final Path file = Files.createTempFile(getClass().getName(), ".tmp");
try {
// #file-sink
Sink<ByteString, CompletionStage<IOResult>> fileSink = FileIO.toPath(file);
Source<String, NotUsed> textSource = Source.single("Hello Akka Stream!");
CompletionStage<IOResult> ioResult =
textSource.map(ByteString::fromString).runWith(fileSink, system);
// #file-sink
} finally {
Files.delete(file);
}
}
}

View file

@ -0,0 +1,188 @@
/*
* Copyright (C) 2015-2022 Lightbend Inc. <https://www.lightbend.com>
*/
package jdocs.stream.io;
import java.util.concurrent.CompletionStage;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.apache.pekko.NotUsed;
import org.apache.pekko.stream.javadsl.Framing;
import jdocs.AbstractJavaTest;
import jdocs.stream.SilenceSystemOut;
import org.apache.pekko.testkit.javadsl.TestKit;
import java.net.InetSocketAddress;
import java.util.concurrent.TimeUnit;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.apache.pekko.actor.ActorSystem;
import org.apache.pekko.stream.javadsl.*;
import org.apache.pekko.stream.javadsl.Tcp.*;
import org.apache.pekko.testkit.SocketUtil;
import org.apache.pekko.testkit.TestProbe;
import org.apache.pekko.util.ByteString;
public class StreamTcpDocTest extends AbstractJavaTest {
static ActorSystem system;
@BeforeClass
public static void setup() {
system = ActorSystem.create("StreamTcpDocTest");
}
@AfterClass
public static void tearDown() {
TestKit.shutdownActorSystem(system);
system = null;
}
final SilenceSystemOut.System System = SilenceSystemOut.get();
private final ConcurrentLinkedQueue<String> input = new ConcurrentLinkedQueue<>();
{
input.add("Hello world");
input.add("What a lovely day");
}
private String readLine(String prompt) {
String s = input.poll();
return (s == null ? "q" : s);
}
@Test
public void demonstrateSimpleServerConnection() {
{
// #echo-server-simple-bind
// IncomingConnection and ServerBinding imported from Tcp
final Source<IncomingConnection, CompletionStage<ServerBinding>> connections =
Tcp.get(system).bind("127.0.0.1", 8888);
// #echo-server-simple-bind
}
{
final InetSocketAddress localhost = SocketUtil.temporaryServerAddress("127.0.0.1", false);
final Source<IncomingConnection, CompletionStage<ServerBinding>> connections =
Tcp.get(system).bind(localhost.getHostString(), localhost.getPort());
// #echo-server-simple-handle
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, system);
},
system);
// #echo-server-simple-handle
}
}
@Test
public void actuallyWorkingClientServerApp() throws Exception {
final InetSocketAddress localhost = SocketUtil.temporaryServerAddress("127.0.0.1", false);
final TestProbe serverProbe = new TestProbe(system);
final Source<IncomingConnection, CompletionStage<ServerBinding>> connections =
Tcp.get(system).bind(localhost.getHostString(), localhost.getPort());
final CompletionStage<ServerBinding> bindingCS =
// #welcome-banner-chat-server
connections
.to(
Sink.foreach(
(IncomingConnection connection) -> {
// server logic, parses incoming commands
final Flow<String, String, NotUsed> commandParser =
Flow.<String>create()
.takeWhile(elem -> !elem.equals("BYE"))
.map(elem -> elem + "!");
final String welcomeMsg =
"Welcome to: "
+ connection.localAddress()
+ " you are: "
+ connection.remoteAddress()
+ "!";
final Source<String, NotUsed> welcome = Source.single(welcomeMsg);
final Flow<ByteString, ByteString, NotUsed> serverLogic =
Flow.of(ByteString.class)
.via(
Framing.delimiter(
ByteString.fromString("\n"), 256, FramingTruncation.DISALLOW))
.map(ByteString::utf8String)
// #welcome-banner-chat-server
.map(
command -> {
serverProbe.ref().tell(command, null);
return command;
})
// #welcome-banner-chat-server
.via(commandParser)
.merge(welcome)
.map(s -> s + "\n")
.map(ByteString::fromString);
connection.handleWith(serverLogic, system);
}))
.run(system);
// #welcome-banner-chat-server
// make sure server is bound before we do anything else
bindingCS.toCompletableFuture().get(3, TimeUnit.SECONDS);
{
// just for docs, never actually used
// #repl-client
final Flow<ByteString, ByteString, CompletionStage<OutgoingConnection>> connection =
Tcp.get(system).outgoingConnection("127.0.0.1", 8888);
// #repl-client
}
{
final Flow<ByteString, ByteString, CompletionStage<OutgoingConnection>> connection =
Tcp.get(system).outgoingConnection(localhost.getHostString(), localhost.getPort());
// #repl-client
final Flow<String, ByteString, NotUsed> replParser =
Flow.<String>create()
.takeWhile(elem -> !elem.equals("q"))
.concat(Source.single("BYE")) // will run after the original flow completes
.map(elem -> ByteString.fromString(elem + "\n"));
final Flow<ByteString, ByteString, NotUsed> repl =
Flow.of(ByteString.class)
.via(Framing.delimiter(ByteString.fromString("\n"), 256, FramingTruncation.DISALLOW))
.map(ByteString::utf8String)
.map(
text -> {
System.out.println("Server: " + text);
return "next";
})
.map(elem -> readLine("> "))
.via(replParser);
CompletionStage<OutgoingConnection> connectionCS = connection.join(repl).run(system);
// #repl-client
// make sure it got connected (or fails the test)
connectionCS.toCompletableFuture().get(5L, TimeUnit.SECONDS);
}
serverProbe.expectMsg("Hello world");
serverProbe.expectMsg("What a lovely day");
serverProbe.expectMsg("BYE");
}
}