He-Pin opened a new issue, #3136:
URL: https://github.com/apache/pekko/issues/3136

   ### Motivation
   
   Apache Pekko 2.0 raised the minimum JDK version to 17. However, many parts 
of the codebase still use pre-JDK 9 patterns that can now be replaced with 
cleaner, safer, and sometimes more performant JDK 9-17 APIs. This meta-issue 
tracks the identification and migration of these patterns.
   
   ### Scope
   
   Each migration should be a separate PR for reviewability and bisectability.
   
   ---
   
   #### 1. Replace manual `CompletableFuture` timeout with `orTimeout()` / 
`completeOnTimeout()` (JDK 9)
   
   `FutureTimeoutSupport.timeoutCompletionStage` is already `@deprecated("Use 
CompletableFuture#orTimeout instead.", "2.0.0")` but still used internally by 
`Patterns.timeout()`. Rewrite the implementation to use 
`CompletableFuture.orTimeout()` directly, eliminating the `Scheduler`-based 
manual timeout.
   
   **Files:** 
`actor/src/main/scala/org/apache/pekko/pattern/FutureTimeoutSupport.scala`, 
`actor/src/main/scala/org/apache/pekko/pattern/Patterns.scala`
   
   #### 2. Replace `Collections.emptyList/emptySet/unmodifiableSet` with 
`List.of/Set.of` in production code (JDK 9)
   
   Several production Scala files still use `java.util.Collections.emptyList()` 
/ `emptySet()` / `unmodifiableSet(emptySet())`. Replace with 
`java.util.List.of()` / `Set.of()` for cleaner semantics and fewer allocations.
   
   **Files:**
   - `actor/src/main/scala/org/apache/pekko/dispatch/AbstractDispatcher.scala` 
(line 580)
   - 
`actor/src/main/scala/org/apache/pekko/dispatch/affinity/AffinityPool.scala` 
(line 241)
   - 
`actor-typed/src/main/scala/org/apache/pekko/actor/typed/javadsl/Behaviors.scala`
 (line 363)
   - 
`actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/internal/TestAppender.scala`
 (line 99)
   - 
`persistence-typed/src/main/scala/org/apache/pekko/persistence/typed/javadsl/EventSourcedBehavior.scala`
 (line 186)
   - `stream/src/main/scala/org/apache/pekko/stream/Attributes.scala` (line 281)
   - 
`stream/src/main/scala/org/apache/pekko/stream/javadsl/StatefulMapConcatAccumulator.scala`
 (line 38)
   - 
`stream/src/main/scala/org/apache/pekko/stream/impl/fusing/StreamOfStreams.scala`
 (line 402)
   
   #### 3. Use ByteBuffer fluent API chains with JDK 9 covariant returns (JDK 9)
   
   JDK 9 changed `ByteBuffer.clear()`, `position(int)`, `limit(int)`, `flip()`, 
`rewind()`, `mark()`, `reset()` to return `ByteBuffer` instead of `Buffer`. 
This enables fluent chaining. Many separate-statement patterns can be 
consolidated.
   
   **Files:**
   - `actor/src/main/scala/org/apache/pekko/io/TcpConnection.scala` (lines 
267-274, 451-455, 481-484)
   - `actor/src/main/scala/org/apache/pekko/io/UdpConnection.scala` (lines 
132-138, 156-159)
   - `actor/src/main/scala/org/apache/pekko/io/UdpListener.scala` (lines 
102-110)
   - `actor/src/main/scala/org/apache/pekko/io/WithUdpSend.scala` (lines 86-92)
   - 
`stream/src/main/scala/org/apache/pekko/stream/impl/io/TlsEngineHelpers.scala` 
(lines 30-34)
   - `stream/src/main/scala/org/apache/pekko/stream/impl/io/IOSources.scala` 
(lines 108-123)
   - `stream/src/main/scala/org/apache/pekko/stream/impl/io/TLSActor.scala` 
(multiple locations)
   - 
`stream/src/main/scala/org/apache/pekko/stream/impl/io/TlsGraphStage.scala` 
(multiple locations)
   
   #### 4. Optimize EnvelopeBufferPool.copy() with ByteBuffer duplicate+slice 
(JDK 9)
   
   `EnvelopeBufferPool.copy()` currently allocates an intermediate 
`Array[Byte]`, does `rewind()` + `get(bytes)` + manual position save/restore. 
Using `byteBuffer.duplicate()` + JDK 9 covariant returns + `slice()` eliminates 
the intermediate allocation.
   
   **Files:** 
`remote/src/main/scala/org/apache/pekko/remote/artery/EnvelopeBufferPool.scala` 
(lines 571-580)
   
   #### 5. Update Scaladoc examples from `Arrays.asList` to `List.of` (JDK 9)
   
   Scaladoc examples in the Stream Java DSL use `Arrays.asList(...)` which 
creates a mutable list. Update to `List.of(...)` for immutable semantics 
consistent with modern Java style.
   
   **Files:**
   - `stream/src/main/scala/org/apache/pekko/stream/javadsl/Source.scala` 
(lines 131, 1558, 3548, 3581)
   - `stream/src/main/scala/org/apache/pekko/stream/javadsl/Flow.scala` (lines 
1624, 1658, 3434-3435)
   - `stream/src/main/scala/org/apache/pekko/stream/javadsl/SubSource.scala` 
(lines 1002, 1036, 2381)
   - `stream/src/main/scala/org/apache/pekko/stream/javadsl/SubFlow.scala` 
(lines 1016, 1050)
   
   #### 6. Use StackWalker for stack trace inspection (JDK 9)
   
   `TestKitUtils.testNameFromCallStack` uses 
`Thread.currentThread.getStackTrace` which eagerly constructs the full stack 
trace array. `StackWalker` lazily walks the stack and is more efficient.
   
   **Files:** 
`testkit/src/main/scala/org/apache/pekko/testkit/TestKitUtils.scala` (line 39)
   
   ### Out of scope
   
   - **Protobuf generated files** (`*Messages.java`, `*Formats.java`, 
`ReplicatedEventSourcing.java`): auto-generated, not hand-edited
   - **`OptionalUtil.java`**: uses `OptionalLong.isPresent()` + `getAsLong()` 
correctly for Scala `Option` interop
   - **`PekkoException.scala`**: copies cause stack trace between Throwables, 
`StackWalker` is not applicable
   - **`ByteBufferCleaner.java`**: `Unsafe.invokeCleaner` is the standard way 
to clean direct ByteBuffers
   - **`HexFormat` (JDK 17)**: only one minor error-message use, not worth 
changing
   - **`Charset.forName`**: already fully migrated to `StandardCharsets` 
throughout
   
   ### References
   
   None - proactive modernization.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to