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-samples.git


The following commit(s) were added to refs/heads/main by this push:
     new 0e6b505  refactor: replace deprecated `extends App` with explicit main 
method (#178)
0e6b505 is described below

commit 0e6b5055d1540c49cd8b55ebb049fd71c7d4ff0a
Author: He-Pin(kerr) <[email protected]>
AuthorDate: Mon Jul 6 16:24:18 2026 +0800

    refactor: replace deprecated `extends App` with explicit main method (#178)
    
    Motivation:
    `extends App` is deprecated in Scala 3. Replace with explicit `def main`
    method for forward compatibility.
    
    Modification:
    Replace `object X extends App { ... }` with
    `object X { def main(args: Array[String]): Unit = { ... } }`
    in 5 sample application files.
    
    Result:
    No more usage of deprecated `scala.App` trait. Code is compatible with 
Scala 3.
    
    Tests:
    Not run - docs only
    
    References:
    None - Scala 3 compatibility
---
 .../src/main/scala/com/example/ClusteringApp.scala | 10 +--
 .../pekko/sample/cluster/kubernetes/DemoApp.scala  | 38 ++++++-----
 .../client/src/main/scala/client/ClientApp.scala   | 36 +++++-----
 .../sharding/embeddedkafka/KafkaBroker.scala       | 24 ++++---
 .../kafka/producer/UserEventProducer.scala         | 78 +++++++++++-----------
 5 files changed, 98 insertions(+), 88 deletions(-)

diff --git 
a/pekko-sample-cluster-docker-compose-scala/src/main/scala/com/example/ClusteringApp.scala
 
b/pekko-sample-cluster-docker-compose-scala/src/main/scala/com/example/ClusteringApp.scala
index 915d382..ab91685 100644
--- 
a/pekko-sample-cluster-docker-compose-scala/src/main/scala/com/example/ClusteringApp.scala
+++ 
b/pekko-sample-cluster-docker-compose-scala/src/main/scala/com/example/ClusteringApp.scala
@@ -3,9 +3,11 @@ package com.example
 import org.apache.pekko.actor.typed.ActorSystem
 import com.typesafe.config.ConfigFactory
 
-object ClusteringApp extends App {
-  val config = ConfigFactory.load()
-  val clusterName = config.getString("clustering.cluster.name")
+object ClusteringApp {
+  def main(args: Array[String]): Unit = {
+    val config = ConfigFactory.load()
+    val clusterName = config.getString("clustering.cluster.name")
 
-  ActorSystem(ClusterListener(), clusterName)
+    ActorSystem(ClusterListener(), clusterName)
+  }
 }
diff --git 
a/pekko-sample-cluster-kubernetes-scala/src/main/scala/pekko/sample/cluster/kubernetes/DemoApp.scala
 
b/pekko-sample-cluster-kubernetes-scala/src/main/scala/pekko/sample/cluster/kubernetes/DemoApp.scala
index 928209c..bae234d 100644
--- 
a/pekko-sample-cluster-kubernetes-scala/src/main/scala/pekko/sample/cluster/kubernetes/DemoApp.scala
+++ 
b/pekko-sample-cluster-kubernetes-scala/src/main/scala/pekko/sample/cluster/kubernetes/DemoApp.scala
@@ -12,28 +12,30 @@ import org.apache.pekko.{ actor => classic }
 
 import scala.concurrent.ExecutionContext
 
-object DemoApp extends App {
+object DemoApp {
+  def main(args: Array[String]): Unit = {
 
-  ActorSystem[Nothing](Behaviors.setup[Nothing] { context =>
-      import org.apache.pekko.actor.typed.scaladsl.adapter._
-      implicit val classicSystem: classic.ActorSystem = 
context.system.toClassic
-      implicit val ec: ExecutionContext = context.system.executionContext
+    ActorSystem[Nothing](Behaviors.setup[Nothing] { context =>
+        import org.apache.pekko.actor.typed.scaladsl.adapter._
+        implicit val classicSystem: classic.ActorSystem = 
context.system.toClassic
+        implicit val ec: ExecutionContext = context.system.executionContext
 
-      val cluster = Cluster(context.system)
-      context.log.info("Started [" + context.system + "], cluster.selfAddress 
= " + cluster.selfMember.address + ")")
+        val cluster = Cluster(context.system)
+        context.log.info("Started [" + context.system + "], 
cluster.selfAddress = " + cluster.selfMember.address + ")")
 
-      Http().newServerAt("0.0.0.0", 8080).bind(complete("Hello world"))
+        Http().newServerAt("0.0.0.0", 8080).bind(complete("Hello world"))
 
-      // Create an actor that handles cluster domain events
-      val listener = 
context.spawn(Behaviors.receive[ClusterEvent.MemberEvent]((ctx, event) => {
-          ctx.log.info("MemberEvent: {}", event)
-          Behaviors.same
-        }), "listener")
+        // Create an actor that handles cluster domain events
+        val listener = 
context.spawn(Behaviors.receive[ClusterEvent.MemberEvent]((ctx, event) => {
+            ctx.log.info("MemberEvent: {}", event)
+            Behaviors.same
+          }), "listener")
 
-      Cluster(context.system).subscriptions ! Subscribe(listener, 
classOf[ClusterEvent.MemberEvent])
+        Cluster(context.system).subscriptions ! Subscribe(listener, 
classOf[ClusterEvent.MemberEvent])
 
-      PekkoManagement.get(classicSystem).start()
-      ClusterBootstrap.get(classicSystem).start()
-      Behaviors.empty
-    }, "appka")
+        PekkoManagement.get(classicSystem).start()
+        ClusterBootstrap.get(classicSystem).start()
+        Behaviors.empty
+      }, "appka")
+  }
 }
diff --git 
a/pekko-sample-kafka-to-sharding-scala/client/src/main/scala/client/ClientApp.scala
 
b/pekko-sample-kafka-to-sharding-scala/client/src/main/scala/client/ClientApp.scala
index 8049506..2b99b26 100644
--- 
a/pekko-sample-kafka-to-sharding-scala/client/src/main/scala/client/ClientApp.scala
+++ 
b/pekko-sample-kafka-to-sharding-scala/client/src/main/scala/client/ClientApp.scala
@@ -11,24 +11,26 @@ import scala.concurrent.ExecutionContextExecutor
 import scala.concurrent.duration.Duration
 import scala.io.StdIn
 
-object ClientApp extends App {
-  implicit val system: ActorSystem = ActorSystem("UserClient")
-  implicit val mat: Materializer = Materializer.createMaterializer(system)
-  implicit val ec: ExecutionContextExecutor = system.dispatcher
-  val clientSettings = GrpcClientSettings.connectToServiceAt("127.0.0.1", 
8081).withTls(false)
-  val client = UserServiceClient(clientSettings)
+object ClientApp {
+  def main(args: Array[String]): Unit = {
+    implicit val system: ActorSystem = ActorSystem("UserClient")
+    implicit val mat: Materializer = Materializer.createMaterializer(system)
+    implicit val ec: ExecutionContextExecutor = system.dispatcher
+    val clientSettings = GrpcClientSettings.connectToServiceAt("127.0.0.1", 
8081).withTls(false)
+    val client = UserServiceClient(clientSettings)
 
-  var userId = ""
-  while (userId != ":q") {
-    println("Enter user id or :q to quit")
-    userId = StdIn.readLine()
-    if (userId != ":q") {
-      val runningTotal = 
Await.result(client.userStats(UserStatsRequest(userId)), Duration.Inf)
-      println(
-        s"User ${userId} has made ${runningTotal.totalPurchases} purchases for 
a total of ${runningTotal.amountSpent}p")
-    }
+    var userId = ""
+    while (userId != ":q") {
+      println("Enter user id or :q to quit")
+      userId = StdIn.readLine()
+      if (userId != ":q") {
+        val runningTotal = 
Await.result(client.userStats(UserStatsRequest(userId)), Duration.Inf)
+        println(
+          s"User ${userId} has made ${runningTotal.totalPurchases} purchases 
for a total of ${runningTotal.amountSpent}p")
+      }
 
+    }
+    println("Exiting")
+    system.terminate()
   }
-  println("Exiting")
-  system.terminate()
 }
diff --git 
a/pekko-sample-kafka-to-sharding-scala/kafka/src/main/scala/sample/sharding/embeddedkafka/KafkaBroker.scala
 
b/pekko-sample-kafka-to-sharding-scala/kafka/src/main/scala/sample/sharding/embeddedkafka/KafkaBroker.scala
index f1eb3b9..0753d19 100644
--- 
a/pekko-sample-kafka-to-sharding-scala/kafka/src/main/scala/sample/sharding/embeddedkafka/KafkaBroker.scala
+++ 
b/pekko-sample-kafka-to-sharding-scala/kafka/src/main/scala/sample/sharding/embeddedkafka/KafkaBroker.scala
@@ -3,20 +3,22 @@ package sample.sharding.embeddedkafka
 import net.manub.embeddedkafka.{ EmbeddedKafka, EmbeddedKafkaConfig }
 import org.slf4j.LoggerFactory
 
-object KafkaBroker extends App with EmbeddedKafka {
-  val log = LoggerFactory.getLogger(this.getClass)
+object KafkaBroker extends EmbeddedKafka {
+  def main(args: Array[String]): Unit = {
+    val log = LoggerFactory.getLogger(this.getClass)
 
-  val port = 9092
-  val topic = "user-events"
-  val partitions = 128
+    val port = 9092
+    val topic = "user-events"
+    val partitions = 128
 
-  implicit val config: EmbeddedKafkaConfig = EmbeddedKafkaConfig(kafkaPort = 
port)
-  val server = EmbeddedKafka.start()
+    implicit val config: EmbeddedKafkaConfig = EmbeddedKafkaConfig(kafkaPort = 
port)
+    val server = EmbeddedKafka.start()
 
-  createCustomTopic(topic = topic, partitions = partitions)
+    createCustomTopic(topic = topic, partitions = partitions)
 
-  log.info(s"Kafka running: localhost:$port")
-  log.info(s"Topic '$topic' with $partitions partitions created")
+    log.info(s"Kafka running: localhost:$port")
+    log.info(s"Topic '$topic' with $partitions partitions created")
 
-  server.broker.awaitShutdown()
+    server.broker.awaitShutdown()
+  }
 }
diff --git 
a/pekko-sample-kafka-to-sharding-scala/producer/src/main/scala/sharding/kafka/producer/UserEventProducer.scala
 
b/pekko-sample-kafka-to-sharding-scala/producer/src/main/scala/sharding/kafka/producer/UserEventProducer.scala
index 74621c4..f8a32a4 100644
--- 
a/pekko-sample-kafka-to-sharding-scala/producer/src/main/scala/sharding/kafka/producer/UserEventProducer.scala
+++ 
b/pekko-sample-kafka-to-sharding-scala/producer/src/main/scala/sharding/kafka/producer/UserEventProducer.scala
@@ -15,42 +15,44 @@ import scala.concurrent.Future
 import scala.concurrent.duration._
 import scala.util.Random
 
-object UserEventProducer extends App {
-
-  implicit val system: ActorSystem = ActorSystem(
-    "UserEventProducer",
-    ConfigFactory.parseString("""
-      pekko.actor.provider = "local" 
-     """.stripMargin).withFallback(ConfigFactory.load()).resolve())
-
-  val log = Logging(system, "UserEventProducer")
-
-  val config = system.settings.config.getConfig("pekko.kafka.producer")
-
-  val producerConfig = 
ProducerConfig(system.settings.config.getConfig("kafka-to-sharding-producer"))
-
-  val producerSettings: ProducerSettings[String, Array[Byte]] =
-    ProducerSettings(config, new StringSerializer, new ByteArraySerializer)
-      .withBootstrapServers(producerConfig.bootstrapServers)
-
-  val nrUsers = 200
-  val maxPrice = 10000
-  val maxQuantity = 5
-  val products = List("cat t-shirt", "pekko t-shirt", "skis", "climbing 
shoes", "rope")
-
-  val done: Future[Done] =
-    Source
-      .tick(1.second, 1.second, "tick")
-      .map(_ => {
-        val randomEntityId = Random.nextInt(nrUsers).toString
-        val price = Random.nextInt(maxPrice)
-        val quantity = Random.nextInt(maxQuantity)
-        val product = products(Random.nextInt(products.size))
-        val message = UserPurchaseProto(randomEntityId, product, quantity, 
price).toByteArray
-        log.info("Sending message to user {}", randomEntityId)
-        // rely on the default kafka partitioner to hash the key and 
distribute among shards
-        // the logic of the default partitioner must be replicated in 
MessageExtractor entityId -> shardId function
-        new ProducerRecord[String, Array[Byte]](producerConfig.topic, 
randomEntityId, message)
-      })
-      .runWith(Producer.plainSink(producerSettings))
+object UserEventProducer {
+  def main(args: Array[String]): Unit = {
+
+    implicit val system: ActorSystem = ActorSystem(
+      "UserEventProducer",
+      ConfigFactory.parseString("""
+        pekko.actor.provider = "local" 
+       """.stripMargin).withFallback(ConfigFactory.load()).resolve())
+
+    val log = Logging(system, "UserEventProducer")
+
+    val config = system.settings.config.getConfig("pekko.kafka.producer")
+
+    val producerConfig = 
ProducerConfig(system.settings.config.getConfig("kafka-to-sharding-producer"))
+
+    val producerSettings: ProducerSettings[String, Array[Byte]] =
+      ProducerSettings(config, new StringSerializer, new ByteArraySerializer)
+        .withBootstrapServers(producerConfig.bootstrapServers)
+
+    val nrUsers = 200
+    val maxPrice = 10000
+    val maxQuantity = 5
+    val products = List("cat t-shirt", "pekko t-shirt", "skis", "climbing 
shoes", "rope")
+
+    val done: Future[Done] =
+      Source
+        .tick(1.second, 1.second, "tick")
+        .map(_ => {
+          val randomEntityId = Random.nextInt(nrUsers).toString
+          val price = Random.nextInt(maxPrice)
+          val quantity = Random.nextInt(maxQuantity)
+          val product = products(Random.nextInt(products.size))
+          val message = UserPurchaseProto(randomEntityId, product, quantity, 
price).toByteArray
+          log.info("Sending message to user {}", randomEntityId)
+          // rely on the default kafka partitioner to hash the key and 
distribute among shards
+          // the logic of the default partitioner must be replicated in 
MessageExtractor entityId -> shardId function
+          new ProducerRecord[String, Array[Byte]](producerConfig.topic, 
randomEntityId, message)
+        })
+        .runWith(Producer.plainSink(producerSettings))
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to