This is an automated email from the ASF dual-hosted git repository.
He-Pin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko-http.git
The following commit(s) were added to refs/heads/main by this push:
new a7538229a refactor: remove deprecated HttpApp (since Akka HTTP 10.2.0)
(#1125)
a7538229a is described below
commit a7538229a75833bd0649d8ee71a563fd6f275e56
Author: He-Pin(kerr) <[email protected]>
AuthorDate: Thu Jul 9 19:27:16 2026 +0800
refactor: remove deprecated HttpApp (since Akka HTTP 10.2.0) (#1125)
Motivation:
HttpApp was deprecated since Akka HTTP 10.2.0 as it doesn't reflect the
latest APIs.
Modification:
Deleted HttpApp source files (Scala and Java) and all associated test files:
- http/src/main/scala/.../HttpApp.scala
- http/src/main/java/.../HttpApp.java
- http-tests/.../HttpAppSpec.scala (Scala + Java)
- http-tests/.../MinimalHttpApp.java
- http-tests/.../SneakHttpApp.java
Updated ApiMayChangeDocCheckerSpec to remove HttpApp from filter list.
Added MiMa filters for binary compatibility exceptions.
Result:
Deprecated HttpApp removed.
---
.../scala/docs/ApiMayChangeDocCheckerSpec.scala | 10 +-
.../pekko/http/javadsl/server/MinimalHttpApp.java | 53 -----
.../pekko/http/javadsl/server/SneakHttpApp.java | 42 ----
.../pekko/http/javadsl/server/HttpAppSpec.scala | 246 -------------------
.../pekko/http/scaladsl/server/HttpAppSpec.scala | 263 ---------------------
.../apache/pekko/http/javadsl/server/HttpApp.java | 210 ----------------
.../remove-deprecated-methods.excludes | 4 +
.../pekko/http/scaladsl/server/HttpApp.scala | 183 --------------
8 files changed, 9 insertions(+), 1002 deletions(-)
diff --git a/docs/src/test/scala/docs/ApiMayChangeDocCheckerSpec.scala
b/docs/src/test/scala/docs/ApiMayChangeDocCheckerSpec.scala
index 19d917c3f..ad5278f06 100644
--- a/docs/src/test/scala/docs/ApiMayChangeDocCheckerSpec.scala
+++ b/docs/src/test/scala/docs/ApiMayChangeDocCheckerSpec.scala
@@ -42,14 +42,14 @@ class ApiMayChangeDocCheckerSpec extends AnyWordSpec with
Matchers with BeforeAn
className.replaceAll("\\$minus", "-").split("\\$")(0)
}
- private def isHttpClass(className: String): Boolean =
- className.startsWith(httpPackagePrefix)
-
- // As Specs, Directives and HttpApp inherit get all directives methods, we
skip those as they are not really bringing any extra info
+ // As Specs and Directives inherit get all directives methods, we skip those
as they are not really bringing any extra info
def removeClassesToIgnore(method: MethodInfo): Boolean = {
- Seq("Spec", ".Directives", ".HttpApp").exists(method.getClassName.contains)
+ Seq("Spec", ".Directives").exists(method.getClassName.contains)
}
+ private def isHttpClass(className: String): Boolean =
+ className.startsWith(httpPackagePrefix)
+
def collectMissing(docPage: Seq[String])(set: Set[String], name: String):
Set[String] = {
if (docPage.exists(line => line.contains(name)))
set
diff --git
a/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/MinimalHttpApp.java
b/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/MinimalHttpApp.java
deleted file mode 100644
index 33c48cc7f..000000000
---
a/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/MinimalHttpApp.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * license agreements; and to You under the Apache License, version 2.0:
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * This file is part of the Apache Pekko project, which was derived from Akka.
- */
-
-/*
- * Copyright (C) 2009-2022 Lightbend Inc. <https://www.lightbend.com>
- */
-
-package org.apache.pekko.http.javadsl.server;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionStage;
-import org.apache.pekko.Done;
-import org.apache.pekko.actor.ActorSystem;
-import org.apache.pekko.http.javadsl.ServerBinding;
-
-@SuppressWarnings("deprecation")
-public class MinimalHttpApp extends HttpApp {
-
- CompletableFuture<Done> shutdownTrigger = new CompletableFuture<>();
- CompletableFuture<ServerBinding> bindingPromise = new CompletableFuture<>();
-
- public void shutdown() {
- shutdownTrigger.complete(Done.getInstance());
- }
-
- @Override
- protected Route routes() {
- return path("foo", () -> complete("bar"));
- }
-
- @Override
- protected void postHttpBinding(ServerBinding binding) {
- super.postHttpBinding(binding);
- bindingPromise.complete(binding);
- }
-
- @Override
- protected void postHttpBindingFailure(Throwable cause) {
- super.postHttpBindingFailure(cause);
- bindingPromise.completeExceptionally(cause);
- }
-
- @Override
- protected CompletionStage<Done> waitForShutdownSignal(ActorSystem system) {
- return shutdownTrigger;
- }
-}
diff --git
a/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/SneakHttpApp.java
b/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/SneakHttpApp.java
deleted file mode 100644
index 962a33414..000000000
---
a/http-tests/src/test/java/org/apache/pekko/http/javadsl/server/SneakHttpApp.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * license agreements; and to You under the Apache License, version 2.0:
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * This file is part of the Apache Pekko project, which was derived from Akka.
- */
-
-/*
- * Copyright (C) 2009-2022 Lightbend Inc. <https://www.lightbend.com>
- */
-
-package org.apache.pekko.http.javadsl.server;
-
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.pekko.actor.ActorSystem;
-import org.apache.pekko.http.javadsl.ServerBinding;
-
-public class SneakHttpApp extends MinimalHttpApp {
-
- AtomicBoolean postServerShutdownCalled = new AtomicBoolean(false);
- AtomicBoolean postBindingCalled = new AtomicBoolean(false);
- AtomicBoolean postBindingFailureCalled = new AtomicBoolean(false);
-
- @Override
- protected void postServerShutdown(Optional<Throwable> failure, ActorSystem
system) {
- postServerShutdownCalled.set(true);
- }
-
- @Override
- protected void postHttpBinding(ServerBinding binding) {
- postBindingCalled.set(true);
- bindingPromise.complete(binding);
- }
-
- @Override
- protected void postHttpBindingFailure(Throwable cause) {
- postBindingFailureCalled.set(true);
- }
-}
diff --git
a/http-tests/src/test/scala/org/apache/pekko/http/javadsl/server/HttpAppSpec.scala
b/http-tests/src/test/scala/org/apache/pekko/http/javadsl/server/HttpAppSpec.scala
deleted file mode 100644
index 52cfc3526..000000000
---
a/http-tests/src/test/scala/org/apache/pekko/http/javadsl/server/HttpAppSpec.scala
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * license agreements; and to You under the Apache License, version 2.0:
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * This file is part of the Apache Pekko project, which was derived from Akka.
- */
-
-/*
- * Copyright (C) 2009-2022 Lightbend Inc. <https://www.lightbend.com>
- */
-
-package org.apache.pekko.http.javadsl.server
-
-import java.net.InetSocketAddress
-import java.net.ServerSocket
-import java.net.SocketException
-import java.util.concurrent.{ TimeUnit, TimeoutException }
-
-import scala.concurrent.{ Await, Future }
-import scala.concurrent.duration.Duration
-
-import org.apache.pekko
-import pekko.Done
-import pekko.http.impl.util.PekkoSpecWithMaterializer
-import pekko.http.javadsl.ServerBinding
-import pekko.http.javadsl.settings.ServerSettings
-import pekko.http.scaladsl.Http
-import pekko.http.scaladsl.client.RequestBuilding
-import pekko.http.scaladsl.model.{ HttpRequest, StatusCodes }
-import pekko.testkit.EventFilter
-
-import org.scalatest.concurrent.Eventually
-
-import com.typesafe.config.ConfigFactory
-
-class HttpAppSpec extends PekkoSpecWithMaterializer with RequestBuilding with
Eventually {
- import system.dispatcher
-
- def withMinimal(testCode: MinimalHttpApp => Any): Unit = {
- val minimal = new MinimalHttpApp()
- try testCode(minimal)
- finally {
- if (!minimal.shutdownTrigger.isDone)
minimal.shutdownTrigger.complete(Done)
- }
- }
-
- def withSneaky(testCode: SneakHttpApp => Any): Unit = {
- val sneaky = new SneakHttpApp()
- try testCode(sneaky)
- finally {
- if (!sneaky.shutdownTrigger.isDone) sneaky.shutdownTrigger.complete(Done)
- }
- }
-
- "HttpApp Java" should {
-
- "start only with host and port" in withMinimal { minimal =>
- val server = Future {
- minimal.startServer("localhost", 0)
- }
-
- val binding = minimal.bindingPromise.get(5, TimeUnit.SECONDS)
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdown()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
-
- }
-
- "start without ActorSystem" in withMinimal { minimal =>
- val server = Future {
- minimal.startServer("localhost", 0,
ServerSettings.create(ConfigFactory.load))
- }
-
- val binding = minimal.bindingPromise.get(5, TimeUnit.SECONDS)
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdown()
-
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
-
- }
-
- "start providing an ActorSystem" in withMinimal { minimal =>
- val server = Future {
- log.debug("Before startServer 1")
- val res = minimal.startServer("localhost", 0, system)
- log.debug("After startServer 1")
- res
-
}(system.dispatchers.lookup("pekko.actor.default-blocking-io-dispatcher"))
-
- val binding =
- try minimal.bindingPromise.get(2, TimeUnit.SECONDS)
- catch {
- case e: TimeoutException =>
-
java.lang.management.ManagementFactory.getThreadMXBean.dumpAllThreads(true,
true).foreach(println)
- throw e
- }
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdown()
-
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
- system.whenTerminated.isCompleted should ===(false)
-
- }
-
- "start providing an ActorSystem and Settings" in withMinimal { minimal =>
- val server = Future {
- log.debug("Before startServer 2")
- val res = minimal.startServer("localhost", 0,
ServerSettings.create(system), system)
- log.debug("After startServer 2")
- res
-
}(system.dispatchers.lookup("pekko.actor.default-blocking-io-dispatcher"))
-
- val binding =
- try minimal.bindingPromise.get(2, TimeUnit.SECONDS)
- catch {
- case e: TimeoutException =>
-
java.lang.management.ManagementFactory.getThreadMXBean.dumpAllThreads(true,
true).foreach(println)
- throw e
- }
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdown()
-
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
- system.whenTerminated.isCompleted should ===(false)
-
- }
-
- "provide binding if available" in withMinimal { minimal =>
- intercept[IllegalStateException] {
- minimal.binding()
- }
-
- val server = Future {
- minimal.startServer("127.0.0.1", 0,
ServerSettings.create(ConfigFactory.load))
- }
-
- val binding = minimal.bindingPromise.get(5, TimeUnit.SECONDS)
-
- minimal.binding().localAddress.getAddress.getHostAddress should
===("127.0.0.1")
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdown()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
-
- }
-
- "notify" when {
-
- "shutting down" in withSneaky { sneaky =>
- val server = Future {
- sneaky.startServer("localhost", 0,
ServerSettings.create(ConfigFactory.load))
- }
-
- sneaky.postServerShutdownCalled.get() should ===(false)
-
- val binding = sneaky.bindingPromise.get(5, TimeUnit.SECONDS)
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- sneaky.shutdown()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
- eventually {
- sneaky.postServerShutdownCalled.get() should ===(true)
- }
-
- }
-
- "after binding is successful" in withSneaky { sneaky =>
- val server = Future {
- sneaky.startServer("localhost", 0,
ServerSettings.create(ConfigFactory.load))
- }
-
- val binding = sneaky.bindingPromise.get(5, TimeUnit.SECONDS)
-
- sneaky.postBindingCalled.get() should ===(true)
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- sneaky.shutdown()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
-
- }
-
- "after binding is unsuccessful" in withSneaky { sneaky =>
- val serverSocket = new ServerSocket()
- serverSocket.bind(new InetSocketAddress("127.0.0.1", 0))
- val port = serverSocket.getLocalPort
-
- try {
- EventFilter[SocketException](pattern = ".*Address already in use.*",
occurrences = 1).intercept {
- sneaky.startServer("localhost", port, system)
- }
-
- eventually {
- sneaky.postBindingFailureCalled.get() should ===(true)
- }
- } finally serverSocket.close()
- }
-
- }
-
- }
-
- private def callAndVerify(binding: ServerBinding, path: String) = {
-
- val host = binding.localAddress.getHostString
- val port = binding.localAddress.getPort
-
- val request = HttpRequest(uri = s"http://$host:$port/$path")
- val response = Http().singleRequest(request)
- response.futureValue.status should ===(StatusCodes.OK)
- }
-
-}
diff --git
a/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/HttpAppSpec.scala
b/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/HttpAppSpec.scala
deleted file mode 100644
index e196f84a9..000000000
---
a/http-tests/src/test/scala/org/apache/pekko/http/scaladsl/server/HttpAppSpec.scala
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * license agreements; and to You under the Apache License, version 2.0:
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * This file is part of the Apache Pekko project, which was derived from Akka.
- */
-
-/*
- * Copyright (C) 2009-2022 Lightbend Inc. <https://www.lightbend.com>
- */
-
-package org.apache.pekko.http.scaladsl.server
-
-import java.net.InetSocketAddress
-import java.net.ServerSocket
-import java.net.SocketException
-import java.util.concurrent.TimeUnit
-import java.util.concurrent.atomic.AtomicBoolean
-
-import scala.concurrent.{ Await, ExecutionContext, Future, Promise }
-import scala.concurrent.duration.Duration
-import scala.util.Try
-
-import org.apache.pekko
-import pekko.Done
-import pekko.actor.ActorSystem
-import pekko.http.impl.util.PekkoSpecWithMaterializer
-import pekko.http.scaladsl.Http
-import pekko.http.scaladsl.Http.ServerBinding
-import pekko.http.scaladsl.client.RequestBuilding
-import pekko.http.scaladsl.model.{ HttpRequest, StatusCodes }
-import pekko.http.scaladsl.settings.ServerSettings
-import pekko.testkit.EventFilter
-
-import org.scalatest.concurrent.Eventually
-
-import com.typesafe.config.ConfigFactory
-
-class HttpAppSpec extends PekkoSpecWithMaterializer with RequestBuilding with
Eventually {
- import system.dispatcher
-
- class MinimalApp extends HttpApp {
-
- val shutdownPromise = Promise[Done]()
- val bindingPromise = Promise[ServerBinding]()
-
- def shutdownServer(): Unit = shutdownPromise.success(Done)
-
- override protected def routes: Route =
- path("foo") {
- complete("bar")
- }
-
- override protected def postHttpBinding(binding: ServerBinding): Unit = {
- super.postHttpBinding(binding)
- bindingPromise.success(binding)
- }
-
- override protected def waitForShutdownSignal(system: ActorSystem)(implicit
ec: ExecutionContext): Future[Done] = {
- shutdownPromise.future
- }
- }
-
- class SneakyServer extends MinimalApp {
-
- val postBindingCalled = new AtomicBoolean(false)
- val postBindingFailureCalled = new AtomicBoolean(false)
- val postShutdownCalled = new AtomicBoolean(false)
-
- override protected def postHttpBindingFailure(cause: Throwable): Unit =
postBindingFailureCalled.set(true)
-
- override protected def postHttpBinding(binding: ServerBinding): Unit = {
- postBindingCalled.set(true)
- bindingPromise.success(binding)
- }
-
- override protected def postServerShutdown(attempt: Try[Done], system:
ActorSystem): Unit =
- postShutdownCalled.set(true)
- }
-
- def withMinimal(testCode: MinimalApp => Any): Unit = {
- val minimal = new MinimalApp()
- try testCode(minimal)
- finally {
- if (!minimal.shutdownPromise.isCompleted)
minimal.shutdownPromise.success(Done)
- }
- }
-
- def withSneaky(testCode: SneakyServer => Any): Unit = {
- val sneaky = new SneakyServer()
- try testCode(sneaky)
- finally {
- if (!sneaky.shutdownPromise.isCompleted)
sneaky.shutdownPromise.success(Done)
- }
- }
-
- "HttpApp" should {
-
- "start only with host and port" in withMinimal { minimal =>
- val server = Future {
- minimal.startServer("localhost", 0)
- }
-
- val binding = Await.result(minimal.bindingPromise.future, Duration(5,
TimeUnit.SECONDS))
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdownServer()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
- }
-
- "start without ActorSystem" in withMinimal { minimal =>
- val server = Future {
- minimal.startServer("localhost", 0, ServerSettings(ConfigFactory.load))
- }
-
- val binding = Await.result(minimal.bindingPromise.future, Duration(5,
TimeUnit.SECONDS))
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdownServer()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
-
- }
-
- "start providing an ActorSystem" in withMinimal { minimal =>
- val server = Future {
- minimal.startServer("localhost", 0, system)
- }
-
- val binding = Await.result(minimal.bindingPromise.future, Duration(5,
TimeUnit.SECONDS))
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdownServer()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
- system.whenTerminated.isCompleted should ===(false)
-
- }
-
- "start providing an ActorSystem and Settings" in withMinimal { minimal =>
- val server = Future {
- minimal.startServer("localhost", 0, ServerSettings(system), system)
- }
-
- val binding = Await.result(minimal.bindingPromise.future, Duration(5,
TimeUnit.SECONDS))
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdownServer()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
- system.whenTerminated.isCompleted should ===(false)
-
- }
-
- "provide binding if available" in withMinimal { minimal =>
- minimal.binding().isFailure should ===(true)
-
- val server = Future {
- minimal.startServer("127.0.0.1", 0, ServerSettings(ConfigFactory.load))
- }
-
- val binding = Await.result(minimal.bindingPromise.future, Duration(5,
TimeUnit.SECONDS))
-
- minimal.binding().isSuccess should ===(true)
- minimal.binding().get.localAddress.getAddress.getHostAddress should
===("127.0.0.1")
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- minimal.shutdownServer()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
-
- }
-
- "notify" when {
-
- "shutting down" in withSneaky { sneaky =>
- val server = Future {
- sneaky.startServer("localhost", 0,
ServerSettings(ConfigFactory.load))
- }
-
- val binding = Await.result(sneaky.bindingPromise.future, Duration(5,
TimeUnit.SECONDS))
-
- sneaky.postShutdownCalled.get() should ===(false)
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- sneaky.shutdownServer()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
- eventually {
- sneaky.postShutdownCalled.get() should ===(true)
- }
-
- }
-
- "after binding is successful" in withSneaky { sneaky =>
- val server = Future {
- sneaky.startServer("localhost", 0,
ServerSettings(ConfigFactory.load))
- }
-
- val binding = Await.result(sneaky.bindingPromise.future, Duration(5,
TimeUnit.SECONDS))
-
- sneaky.postBindingCalled.get() should ===(true)
-
- // Checking server is up and running
- callAndVerify(binding, "foo")
-
- // Requesting the server to shutdown
- sneaky.shutdownServer()
- Await.ready(server, Duration(1, TimeUnit.SECONDS))
- server.isCompleted should ===(true)
-
- }
-
- "after binding is unsuccessful" in withSneaky { sneaky =>
- val serverSocket = new ServerSocket()
- serverSocket.bind(new InetSocketAddress("127.0.0.1", 0))
- val port = serverSocket.getLocalPort
-
- try {
- EventFilter[SocketException](pattern = ".*Address already in use.*",
occurrences = 1).intercept {
- sneaky.startServer("localhost", port, system)
- }
-
- eventually {
- sneaky.postBindingFailureCalled.get() should ===(true)
- }
- } finally serverSocket.close()
- }
-
- }
-
- }
-
- private def callAndVerify(binding: ServerBinding, path: String) = {
- val host = binding.localAddress.getHostString
- val port = binding.localAddress.getPort
-
- val request = HttpRequest(uri = s"http://$host:$port/$path")
- val response = Http().singleRequest(request)
- response.futureValue.status should ===(StatusCodes.OK)
- }
-}
diff --git
a/http/src/main/java/org/apache/pekko/http/javadsl/server/HttpApp.java
b/http/src/main/java/org/apache/pekko/http/javadsl/server/HttpApp.java
deleted file mode 100644
index 336f470a8..000000000
--- a/http/src/main/java/org/apache/pekko/http/javadsl/server/HttpApp.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * license agreements; and to You under the Apache License, version 2.0:
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * This file is part of the Apache Pekko project, which was derived from Akka.
- */
-
-/*
- * Copyright (C) 2009-2022 Lightbend Inc. <https://www.lightbend.com>
- */
-
-package org.apache.pekko.http.javadsl.server;
-
-import com.typesafe.config.ConfigFactory;
-import java.io.IOException;
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionStage;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicReference;
-import org.apache.pekko.Done;
-import org.apache.pekko.actor.ActorSystem;
-import org.apache.pekko.event.Logging;
-import org.apache.pekko.http.javadsl.Http;
-import org.apache.pekko.http.javadsl.ServerBinding;
-import org.apache.pekko.http.javadsl.settings.ServerSettings;
-
-/**
- * DEPRECATED, consider
https://github.com/apache/pekko-http-quickstart-java.g8 instead
- *
- * <p>Bootstrap trait for Http Server. It helps booting up a pekko-http server
by only defining the
- * desired routes. It offers additional hooks to modify the default behavior.
- *
- * @deprecated HttpApp this doesn't reflect the latest APIs, since Akka HTTP
10.2.0
- */
-@Deprecated(since = "Akka HTTP 10.2.0")
-public abstract class HttpApp extends AllDirectives {
-
- private AtomicReference<ServerBinding> serverBinding = new
AtomicReference<>();
-
- /**
- * Holds a reference to the {@link ActorSystem} used to start this server.
Stopping this system
- * will interfere with the proper functioning condition of the server.
- */
- protected AtomicReference<ActorSystem> systemReference = new
AtomicReference<>();
-
- /** Start a server on the specified host and port. Note that this method is
blocking. */
- public void startServer(String host, int port) throws ExecutionException,
InterruptedException {
- startServer(host, port, ServerSettings.create(ConfigFactory.load()));
- }
-
- /**
- * Start a server on the specified host and port, using the provided {@link
ActorSystem}. Note
- * that this method is blocking.
- *
- * @param system ActorSystem to use for starting the app, if null is passed
in a new default
- * ActorSystem will be created instead, which will be terminated when
the server is stopped.
- */
- public void startServer(String host, int port, ActorSystem system)
- throws ExecutionException, InterruptedException {
- startServer(host, port, ServerSettings.create(system),
Optional.ofNullable(system));
- }
-
- /**
- * Start a server on the specified host and port, using the provided
settings. Note that this
- * method is blocking.
- */
- public void startServer(String host, int port, ServerSettings settings)
- throws ExecutionException, InterruptedException {
- startServer(host, port, settings, Optional.empty());
- }
-
- /**
- * Start a server on the specified host and port, using the provided
settings and {@link
- * ActorSystem}. Note that this method is blocking.
- *
- * @param system ActorSystem to use for starting the app, if null is passed
in a new default
- * ActorSystem will be created instead, which will be terminated when
the server is stopped.
- */
- public void startServer(String host, int port, ServerSettings settings,
ActorSystem system)
- throws ExecutionException, InterruptedException {
- startServer(host, port, settings, Optional.ofNullable(system));
- }
-
- /**
- * Start a server on the specified host and port, using the provided
settings and {@link
- * ActorSystem} if present. Note that this method is blocking. This method
may throw an {@link
- * ExecutionException} or {@link InterruptedException} if the future that
signals that the server
- * should shutdown is interrupted or cancelled.
- *
- * @param system ActorSystem to use for starting the app, if an empty
Optional is passed in a new
- * default ActorSystem will be created instead, which will be terminated
when the server is
- * stopped.
- */
- public void startServer(
- String host, int port, ServerSettings settings, Optional<ActorSystem>
system)
- throws ExecutionException, InterruptedException {
-
- final ActorSystem theSystem =
- system.orElseGet(() ->
ActorSystem.create(Logging.simpleName(this).replaceAll("\\$", "")));
- systemReference.set(theSystem);
-
- CompletionStage<ServerBinding> bindingFuture =
- Http.get(theSystem).newServerAt(host,
port).withSettings(settings).bind(routes());
-
- bindingFuture.handle(
- (binding, exception) -> {
- if (exception != null) {
- postHttpBindingFailure(exception);
- } else {
- // setting the server binding for possible future uses in the
client
- serverBinding.set(binding);
- postHttpBinding(binding);
- }
- return null;
- });
-
- try {
- bindingFuture
- .thenCompose(
- ignore -> waitForShutdownSignal(theSystem)) // chaining both
futures to fail fast
- .toCompletableFuture()
- .exceptionally(
- ignored -> Done.getInstance()) // If the future fails, we want
to complete normally
- .get(); // It's waiting forever because maybe there is never a
shutdown signal
- } finally {
- bindingFuture
- .thenCompose(ServerBinding::unbind)
- .handle(
- (success, exception) -> {
- postServerShutdown(Optional.ofNullable(exception), theSystem);
- if (system.isEmpty()) {
- // we created the system. we should cleanup!
- theSystem.terminate();
- }
- return null;
- });
- }
- }
-
- /**
- * It tries to retrieve the {@link ServerBinding} if the server has been
successfully started. It
- * throws an {@link IllegalStateException} otherwise. You can use this
method to attempt to
- * retrieve the {@link ServerBinding} at any point in time to, for example,
stop the server due to
- * unexpected circumstances.
- */
- ServerBinding binding() {
- if (serverBinding.get() == null)
- throw new IllegalStateException("Binding not yet stored. Have you called
startServer?");
- return serverBinding.get();
- }
-
- /**
- * Hook that will be called just after the server termination. Override this
method if you want to
- * perform some cleanup actions after the server is stopped. The {@code
failure} parameter
- * contains a {@link java.lang.Throwable} only if there has been a problem
shutting down the
- * server.
- */
- protected void postServerShutdown(Optional<Throwable> failure, ActorSystem
system) {
- systemReference.get().log().info("Shutting down the server");
- }
-
- /**
- * Hook that will be called just after the Http server binding is done.
Override this method if
- * you want to perform some actions after the server is up.
- */
- protected void postHttpBinding(ServerBinding binding) {
- systemReference
- .get()
- .log()
- .info(
- "Server online at http://"
- + binding.localAddress().getHostName()
- + ":"
- + binding.localAddress().getPort()
- + "/");
- }
-
- /**
- * Hook that will be called in case the Http server binding fails. Override
this method if you
- * want to perform some actions after the server binding failed.
- */
- protected void postHttpBindingFailure(Throwable cause) {
- systemReference.get().log().error(cause, "Error starting the server: " +
cause.getMessage());
- }
-
- /**
- * Hook that lets the user specify the future that will signal the shutdown
of the server whenever
- * completed.
- */
- protected CompletionStage<Done> waitForShutdownSignal(ActorSystem system) {
- final CompletableFuture<Done> promise = new CompletableFuture<>();
- Runtime.getRuntime().addShutdownHook(new Thread(() ->
promise.complete(Done.getInstance())));
- CompletableFuture.runAsync(
- () -> {
- System.out.println("Press RETURN to stop...");
- try {
- if (System.in.read() >= 0) promise.complete(Done.getInstance());
- } catch (IOException e) {
- systemReference.get().log().error(e, "Problem occurred! " +
e.getMessage());
- }
- });
- return promise;
- }
-
- /** Override to implement the route that will be served by this http server.
*/
- protected abstract Route routes();
-}
diff --git
a/http/src/main/mima-filters/2.0.x.backwards.excludes/remove-deprecated-methods.excludes
b/http/src/main/mima-filters/2.0.x.backwards.excludes/remove-deprecated-methods.excludes
index fd1cd0a1c..8acd22811 100644
---
a/http/src/main/mima-filters/2.0.x.backwards.excludes/remove-deprecated-methods.excludes
+++
b/http/src/main/mima-filters/2.0.x.backwards.excludes/remove-deprecated-methods.excludes
@@ -101,3 +101,7 @@
ProblemFilters.exclude[DirectMissingMethodProblem]("org.apache.pekko.http.scalad
ProblemFilters.exclude[DirectMissingMethodProblem]("org.apache.pekko.http.scaladsl.server.UnsupportedRequestContentTypeRejection.andThen")
ProblemFilters.exclude[DirectMissingMethodProblem]("org.apache.pekko.http.scaladsl.server.UnsupportedRequestContentTypeRejection.compose")
ProblemFilters.exclude[MissingTypesProblem]("org.apache.pekko.http.scaladsl.server.UnsupportedRequestContentTypeRejection$")
+
+# Remove deprecated HttpApp (since Akka HTTP 10.2.0)
+ProblemFilters.exclude[MissingClassProblem]("org.apache.pekko.http.scaladsl.server.HttpApp")
+ProblemFilters.exclude[MissingClassProblem]("org.apache.pekko.http.javadsl.server.HttpApp")
diff --git
a/http/src/main/scala/org/apache/pekko/http/scaladsl/server/HttpApp.scala
b/http/src/main/scala/org/apache/pekko/http/scaladsl/server/HttpApp.scala
deleted file mode 100644
index e5edb6297..000000000
--- a/http/src/main/scala/org/apache/pekko/http/scaladsl/server/HttpApp.scala
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * license agreements; and to You under the Apache License, version 2.0:
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * This file is part of the Apache Pekko project, which was derived from Akka.
- */
-
-/*
- * Copyright (C) 2009-2022 Lightbend Inc. <https://www.lightbend.com>
- */
-
-package org.apache.pekko.http.scaladsl.server
-
-import java.util.concurrent.atomic.AtomicReference
-
-import scala.concurrent.{ blocking, Await, ExecutionContext,
ExecutionContextExecutor, Future, Promise }
-import scala.concurrent.duration.Duration
-import scala.io.StdIn
-import scala.util.{ Failure, Success, Try }
-
-import org.apache.pekko
-import pekko.Done
-import pekko.actor.ActorSystem
-import pekko.event.Logging
-import pekko.http.scaladsl.Http
-import pekko.http.scaladsl.Http.ServerBinding
-import pekko.http.scaladsl.settings.ServerSettings
-
-import com.typesafe.config.ConfigFactory
-
-/**
- * DEPRECATED, consider
https://github.com/apache/pekko-http-quickstart-scala.g8 instead
- *
- * Bootstrap trait for Http Server. It helps booting up a pekko-http server by
only defining the desired routes.
- * It offers additional hooks to modify the default behavior.
- */
-@deprecated("HttpApp this doesn't reflect the latest APIs", "Akka HTTP 10.2.0")
-abstract class HttpApp extends Directives {
-
- private val serverBinding = new AtomicReference[ServerBinding]()
-
- /**
- * `ActorSystem` used to start this server. Stopping this system will
interfere with the proper functioning condition of the server.
- */
- protected val systemReference = new AtomicReference[ActorSystem]()
-
- /**
- * Start a server on the specified host and port.
- * Note that this method is blocking
- */
- def startServer(host: String, port: Int): Unit = {
- startServer(host, port, ServerSettings(ConfigFactory.load))
- }
-
- /**
- * Start a server on the specified host and port, using the provided
`ActorSystem`.
- * Note that this method is blocking
- *
- * @param system ActorSystem to use for starting the app,
- * if `null` is passed in a new default ActorSystem will be created
instead, which will
- * be terminated when the server is stopped.
- */
- def startServer(host: String, port: Int, system: ActorSystem): Unit = {
- startServer(host, port, ServerSettings(system), Option(system))
- }
-
- /**
- * Start a server on the specified host and port, using the provided
settings.
- * Note that this method is blocking.
- */
- def startServer(host: String, port: Int, settings: ServerSettings): Unit = {
- startServer(host, port, settings, None)
- }
-
- /**
- * Start a server on the specified host and port, using the provided
settings and `ActorSystem`.
- * Note that this method is blocking.
- *
- * @param system ActorSystem to use for starting the app,
- * if `null` is passed in a new default ActorSystem will be created
instead, which will
- * be terminated when the server is stopped.
- */
- def startServer(host: String, port: Int, settings: ServerSettings, system:
ActorSystem): Unit = {
- startServer(host, port, settings, Option(system))
- }
-
- /**
- * Start a server on the specified host and port, using the provided
settings and `ActorSystem` if present.
- * Note that this method is blocking.
- *
- * @param system ActorSystem to use for starting the app,
- * if `None` is passed in a new default ActorSystem will be created
instead, which will
- * be terminated when the server is stopped.
- */
- def startServer(host: String, port: Int, settings: ServerSettings, system:
Option[ActorSystem]): Unit = {
- implicit val theSystem =
system.getOrElse(ActorSystem(Logging.simpleName(this).replaceAll("\\$", "")))
- systemReference.set(theSystem)
- implicit val executionContext: ExecutionContextExecutor =
theSystem.dispatcher
-
- val bindingFuture =
- Http().newServerAt(host, port)
- .withSettings(settings)
- .bind(routes)
-
- bindingFuture.onComplete {
- case Success(binding) =>
- // setting the server binding for possible future uses in the client
- serverBinding.set(binding)
- postHttpBinding(binding)
- case Failure(cause) =>
- postHttpBindingFailure(cause)
- }
-
- Await.ready(
- bindingFuture.flatMap(_ => waitForShutdownSignal(theSystem)), //
chaining both futures to fail fast
- Duration.Inf) // It's waiting forever because maybe there is never a
shutdown signal
-
- bindingFuture
- .flatMap(_.unbind())
- .onComplete(attempt => {
- postServerShutdown(attempt, theSystem)
- // we created the system. we should cleanup!
- if (system.isEmpty) theSystem.terminate()
- })
- }
-
- /**
- * It tries to retrieve the `ServerBinding` if the server has been
successfully started. It fails otherwise.
- * You can use this method to attempt to retrieve the `ServerBinding` at any
point in time to, for example, stop the server due to unexpected circumstances.
- */
- def binding(): Try[ServerBinding] = {
- if (serverBinding.get() == null)
- Failure(new IllegalStateException("Binding not yet stored. Have you
called startServer?"))
- else Success(serverBinding.get())
- }
-
- /**
- * Hook that will be called just after the server termination. Override this
method if you want to perform some cleanup actions after the server is stopped.
- * The `attempt` parameter is represented with a `Try` type that is
successful only if the server was successfully shut down.
- */
- protected def postServerShutdown(attempt: Try[Done], system: ActorSystem):
Unit = {
- systemReference.get().log.info("Shutting down the server")
- }
-
- /**
- * Hook that will be called just after the Http server binding is done.
Override this method if you want to perform some actions after the server is up.
- */
- protected def postHttpBinding(binding: Http.ServerBinding): Unit = {
- systemReference.get().log.info(
- s"Server online at
http://${binding.localAddress.getHostName}:${binding.localAddress.getPort}/")
- }
-
- /**
- * Hook that will be called in case the Http server binding fails. Override
this method if you want to perform some actions after the server binding failed.
- */
- protected def postHttpBindingFailure(cause: Throwable): Unit = {
- systemReference.get().log.error(cause, s"Error starting the server
${cause.getMessage}")
- }
-
- /**
- * Hook that lets the user specify the future that will signal the shutdown
of the server whenever completed.
- */
- protected def waitForShutdownSignal(system: ActorSystem)(implicit ec:
ExecutionContext): Future[Done] = {
- val promise = Promise[Done]()
- sys.addShutdownHook {
- promise.trySuccess(Done)
- }
- Future {
- blocking {
- if (StdIn.readLine("Press RETURN to stop...\n") != null)
- promise.trySuccess(Done)
- }
- }
- promise.future
- }
-
- /**
- * Override to implement the routes that will be served by this http server.
- */
- protected def routes: Route
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]