Offset in a relational DB with R2DBC
The R2dbcProjection
R2dbcProjection
has support for storing the offset in a relational database using R2DBC via Akka Persistence R2DBC.
The source of the envelopes is from a SourceProvider
, which can be:
- events from Event Sourced entities via the SourceProvider for eventsBySlices with the eventsBySlices query
- state changes for Durable State entities via the SourceProvider for changesBySlices with the changesBySlices query
- any other
SourceProvider
with supported offset types
A R2dbcHandler
R2dbcHandler
receives a R2dbcSession
R2dbcSession
instance and an envelope. The R2dbcSession
provides the means to access an open R2DBC connection that can be used to process the envelope. The target database operations can be run in the same transaction as the storage of the offset, which means that exactly-once processing semantics is supported. It also offers at-least-once semantics.
Dependencies
The Akka dependencies are available from Akka’s library repository. To access them there, you need to configure the URL for this repository.
- sbt
resolvers += "Akka library repository".at("https://repo.akka.io/maven")
- Maven
<project> ... <repositories> <repository> <id>akka-repository</id> <name>Akka library repository</name> <url>https://repo.akka.io/maven</url> </repository> </repositories> </project>
- Gradle
repositories { mavenCentral() maven { url "https://repo.akka.io/maven" } }
To use the R2DBC module of Akka Projections add the following dependency in your project:
- Maven
<properties> <scala.binary.version>2.13</scala.binary.version> </properties> <dependencies> <dependency> <groupId>com.lightbend.akka</groupId> <artifactId>akka-projection-r2dbc_${scala.binary.version}</artifactId> <version>1.6.5</version> </dependency> <dependency> <groupId>com.lightbend.akka</groupId> <artifactId>akka-persistence-r2dbc_${scala.binary.version}</artifactId> <version>1.3.0</version> </dependency> </dependencies>
- sbt
libraryDependencies ++= Seq( "com.lightbend.akka" %% "akka-projection-r2dbc" % "1.6.5", "com.lightbend.akka" %% "akka-persistence-r2dbc" % "1.3.0" )
- Gradle
def versions = [ ScalaBinary: "2.13" ] dependencies { implementation "com.lightbend.akka:akka-projection-r2dbc_${versions.ScalaBinary}:1.6.5" implementation "com.lightbend.akka:akka-persistence-r2dbc_${versions.ScalaBinary}:1.3.0" }
Note that Akka R2DBC changed configuration structure in 1.2.0 needed for this version of Akka Projection, if upgrading from Akka Projection 1.4.x you will likely need to update your configuration according to the migration guide
Akka Projections R2DBC depends on Akka 2.10.0 or later, and note that it is important that all akka-*
dependencies are in the same version, so it is recommended to depend on them explicitly to avoid problems with transient dependencies causing an unlucky mix of versions.
Project Info: Akka Projections R2DBC | |
---|---|
Artifact | com.lightbend.akka
akka-projection-r2dbc
1.6.5
|
JDK versions | Eclipse Temurin JDK 11 Eclipse Temurin JDK 17 Eclipse Temurin JDK 21 |
Scala versions | 2.13.15, 3.3.4 |
JPMS module name | akka.projection.r2dbc |
License | |
Readiness level |
Since 1.4.0, 2023-03-23
|
Home page | https://akka.io |
API documentation | |
Forums | |
Release notes | GitHub releases |
Issues | GitHub issues |
Sources | https://github.com/akka/akka-projection |
Transitive dependencies
The table below shows akka-projection-r2dbc
’s direct dependencies, and the second tab shows all libraries it depends on transitively.
- Direct dependencies
Organization Artifact Version com.lightbend.akka akka-persistence-r2dbc_2.13 1.3.0 com.lightbend.akka akka-projection-core_2.13 1.6.5 com.lightbend.akka akka-projection-durable-state_2.13 1.6.5 com.lightbend.akka akka-projection-eventsourced_2.13 1.6.5 com.lightbend.akka akka-projection-grpc_2.13 1.6.5 com.typesafe.akka akka-persistence-query_2.13 2.10.0 com.typesafe.akka akka-persistence-typed_2.13 2.10.0 com.typesafe.akka akka-stream-typed_2.13 2.10.0 org.scala-lang scala-library 2.13.15 - Dependency tree
com.lightbend.akka akka-persistence-r2dbc_2.13 1.3.0 BUSL-1.1 com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-remote_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-pki_2.13 2.10.0 BUSL-1.1 com.hierynomus asn-one 0.6.0 The Apache License, Version 2.0 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.agrona agrona 1.22.0 The Apache License, Version 2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 io.r2dbc r2dbc-pool 1.0.1.RELEASE Apache License 2.0 io.projectreactor.addons reactor-pool 1.0.1 The Apache Software License, Version 2.0 io.projectreactor reactor-core 3.5.20 Apache License, Version 2.0 org.reactivestreams reactive-streams 1.0.4 MIT-0 io.projectreactor reactor-core 3.5.20 Apache License, Version 2.0 org.reactivestreams reactive-streams 1.0.4 MIT-0 io.r2dbc r2dbc-spi 1.0.0.RELEASE Apache License 2.0 org.reactivestreams reactive-streams 1.0.4 MIT-0 io.r2dbc r2dbc-spi 1.0.0.RELEASE Apache License 2.0 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.postgresql r2dbc-postgresql 1.0.6.RELEASE Apache License 2.0 com.ongres.scram client 2.1 The 2-Clause BSD License com.ongres.scram common 2.1 The 2-Clause BSD License com.ongres.stringprep saslprep 1.1 The 2-Clause BSD License com.ongres.stringprep stringprep 1.1 The 2-Clause BSD License io.projectreactor.netty reactor-netty-core 1.1.22 The Apache Software License, Version 2.0 io.netty netty-handler-proxy 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec-http 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-handler 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-native-unix-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec-socks 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-handler 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-native-unix-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver-dns-native-macos 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver-dns-classes-macos 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver-dns 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec-dns 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-handler 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-native-unix-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-native-unix-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver-dns 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec-dns 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-handler 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-codec 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-native-unix-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-native-epoll 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-classes-epoll 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-native-unix-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport-native-unix-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-transport 4.1.112.Final Apache License, Version 2.0 io.netty netty-buffer 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.netty netty-resolver 4.1.112.Final Apache License, Version 2.0 io.netty netty-common 4.1.112.Final Apache License, Version 2.0 io.projectreactor reactor-core 3.5.20 Apache License, Version 2.0 org.reactivestreams reactive-streams 1.0.4 MIT-0 io.projectreactor reactor-core 3.5.20 Apache License, Version 2.0 org.reactivestreams reactive-streams 1.0.4 MIT-0 io.r2dbc r2dbc-spi 1.0.0.RELEASE Apache License 2.0 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.lightbend.akka akka-projection-core_2.13 1.6.5 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.lightbend.akka akka-projection-durable-state_2.13 1.6.5 com.lightbend.akka akka-projection-core_2.13 1.6.5 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.lightbend.akka akka-projection-eventsourced_2.13 1.6.5 com.lightbend.akka akka-projection-core_2.13 1.6.5 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.lightbend.akka akka-projection-grpc_2.13 1.6.5 com.lightbend.akka.grpc akka-grpc-runtime_2.13 2.5.0 BUSL-1.1 com.google.protobuf protobuf-java 3.25.5 BSD-3-Clause com.thesamet.scalapb scalapb-runtime_2.13 0.11.17 Apache 2 com.google.protobuf protobuf-java 3.25.5 BSD-3-Clause com.thesamet.scalapb lenses_2.13 0.11.17 Apache 2 org.scala-lang.modules scala-collection-compat_2.13 2.12.0 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang.modules scala-collection-compat_2.13 2.12.0 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-discovery_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-http-core_2.13 10.7.0 BUSL-1.1 com.typesafe.akka akka-parsing_2.13 10.7.0 BUSL-1.1 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-http_2.13 10.7.0 BUSL-1.1 com.typesafe.akka akka-http-core_2.13 10.7.0 BUSL-1.1 com.typesafe.akka akka-parsing_2.13 10.7.0 BUSL-1.1 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-pki_2.13 2.10.0 BUSL-1.1 com.hierynomus asn-one 0.6.0 The Apache License, Version 2.0 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-pki_2.13 2.10.0 BUSL-1.1 com.hierynomus asn-one 0.6.0 The Apache License, Version 2.0 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 io.grpc grpc-core 1.63.2 Apache 2.0 com.google.android annotations 4.1.1.4 Apache 2.0 com.google.code.gson gson 2.10.1 Apache-2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-context 1.63.2 Apache 2.0 io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.perfmark perfmark-api 0.26.0 Apache 2.0 org.codehaus.mojo animal-sniffer-annotations 1.23 MIT license io.grpc grpc-netty-shaded 1.63.2 Apache 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-core 1.63.2 Apache 2.0 com.google.android annotations 4.1.1.4 Apache 2.0 com.google.code.gson gson 2.10.1 Apache-2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-context 1.63.2 Apache 2.0 io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.perfmark perfmark-api 0.26.0 Apache 2.0 org.codehaus.mojo animal-sniffer-annotations 1.23 MIT license io.grpc grpc-util 1.63.2 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-core 1.63.2 Apache 2.0 com.google.android annotations 4.1.1.4 Apache 2.0 com.google.code.gson gson 2.10.1 Apache-2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-context 1.63.2 Apache 2.0 io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.perfmark perfmark-api 0.26.0 Apache 2.0 org.codehaus.mojo animal-sniffer-annotations 1.23 MIT license org.codehaus.mojo animal-sniffer-annotations 1.23 MIT license io.perfmark perfmark-api 0.26.0 Apache 2.0 io.grpc grpc-protobuf 1.63.2 Apache 2.0 com.google.api.grpc proto-google-common-protos 2.29.0 Apache-2.0 com.google.protobuf protobuf-java 3.25.5 BSD-3-Clause com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License com.google.protobuf protobuf-java 3.25.5 BSD-3-Clause io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-protobuf-lite 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 com.lightbend.akka akka-projection-core_2.13 1.6.5 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.lightbend.akka akka-projection-eventsourced_2.13 1.6.5 com.lightbend.akka akka-projection-core_2.13 1.6.5 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.thesamet.scalapb scalapb-runtime_2.13 0.11.17 Apache 2 com.google.protobuf protobuf-java 3.25.5 BSD-3-Clause com.thesamet.scalapb lenses_2.13 0.11.17 Apache 2 org.scala-lang.modules scala-collection-compat_2.13 2.12.0 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang.modules scala-collection-compat_2.13 2.12.0 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-remote_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-pki_2.13 2.10.0 BUSL-1.1 com.hierynomus asn-one 0.6.0 The Apache License, Version 2.0 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.agrona agrona 1.22.0 The Apache License, Version 2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 io.grpc grpc-stub 1.63.2 Apache 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License io.grpc grpc-api 1.63.2 Apache 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava guava 32.1.3-android Apache License, Version 2.0 com.google.code.findbugs jsr305 3.0.2 The Apache Software License, Version 2.0 com.google.errorprone error_prone_annotations 2.23.0 Apache 2.0 com.google.guava failureaccess 1.0.1 The Apache Software License, Version 2.0 com.google.guava listenablefuture 9999.0-empty-to-avoid-conflict-with-guava The Apache Software License, Version 2.0 com.google.j2objc j2objc-annotations 2.8 Apache License, Version 2.0 org.checkerframework checker-qual 3.37.0 The MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-persistence-query_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-persistence_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-remote_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-pki_2.13 2.10.0 BUSL-1.1 com.hierynomus asn-one 0.6.0 The Apache License, Version 2.0 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.agrona agrona 1.22.0 The Apache License, Version 2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-stream-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor-typed_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-slf4j_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License org.scala-lang scala-library 2.13.15 Apache-2.0 org.slf4j slf4j-api 2.0.16 MIT License com.typesafe.akka akka-stream_2.13 2.10.0 BUSL-1.1 com.typesafe.akka akka-actor_2.13 2.10.0 BUSL-1.1 com.typesafe config 1.4.3 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 com.typesafe.akka akka-protobuf-v3_2.13 2.10.0 BUSL-1.1 org.reactivestreams reactive-streams 1.0.4 MIT-0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0 org.scala-lang scala-library 2.13.15 Apache-2.0
Schema
The akka_projection_offset_store
, akka_projection_timestamp_offset_store
and akka_projection_management
tables need to be created in the configured database:
The SQL Server dialect is marked experimental
and not yet production ready until various issues with the integration of the r2dbc-mssql
plugin have been resolved.
- PostgreSQL
-
source
CREATE TABLE IF NOT EXISTS event_journal( slice INT NOT NULL, entity_type VARCHAR(255) NOT NULL, persistence_id VARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, db_timestamp timestamp with time zone NOT NULL, event_ser_id INTEGER NOT NULL, event_ser_manifest VARCHAR(255) NOT NULL, event_payload BYTEA NOT NULL, deleted BOOLEAN DEFAULT FALSE NOT NULL, writer VARCHAR(255) NOT NULL, adapter_manifest VARCHAR(255), tags TEXT ARRAY, meta_ser_id INTEGER, meta_ser_manifest VARCHAR(255), meta_payload BYTEA, PRIMARY KEY(persistence_id, seq_nr) ); -- `event_journal_slice_idx` is only needed if the slice based queries are used CREATE INDEX IF NOT EXISTS event_journal_slice_idx ON event_journal(slice, entity_type, db_timestamp, seq_nr); CREATE TABLE IF NOT EXISTS snapshot( slice INT NOT NULL, entity_type VARCHAR(255) NOT NULL, persistence_id VARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, db_timestamp timestamp with time zone, write_timestamp BIGINT NOT NULL, ser_id INTEGER NOT NULL, ser_manifest VARCHAR(255) NOT NULL, snapshot BYTEA NOT NULL, tags TEXT ARRAY, meta_ser_id INTEGER, meta_ser_manifest VARCHAR(255), meta_payload BYTEA, PRIMARY KEY(persistence_id) ); -- `snapshot_slice_idx` is only needed if the slice based queries are used together with snapshot as starting point CREATE INDEX IF NOT EXISTS snapshot_slice_idx ON snapshot(slice, entity_type, db_timestamp); CREATE TABLE IF NOT EXISTS durable_state ( slice INT NOT NULL, entity_type VARCHAR(255) NOT NULL, persistence_id VARCHAR(255) NOT NULL, revision BIGINT NOT NULL, db_timestamp timestamp with time zone NOT NULL, state_ser_id INTEGER NOT NULL, state_ser_manifest VARCHAR(255), state_payload BYTEA NOT NULL, tags TEXT ARRAY, PRIMARY KEY(persistence_id) ); -- `durable_state_slice_idx` is only needed if the slice based queries are used CREATE INDEX IF NOT EXISTS durable_state_slice_idx ON durable_state(slice, entity_type, db_timestamp); -- Primitive offset types are stored in this table. -- If only timestamp based offsets are used this table is optional. -- Configure akka.projection.r2dbc.offset-store.offset-table="" if the table is not created. CREATE TABLE IF NOT EXISTS akka_projection_offset_store ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, current_offset VARCHAR(255) NOT NULL, manifest VARCHAR(32) NOT NULL, mergeable BOOLEAN NOT NULL, last_updated BIGINT NOT NULL, PRIMARY KEY(projection_name, projection_key) ); -- Timestamp based offsets are stored in this table. CREATE TABLE IF NOT EXISTS akka_projection_timestamp_offset_store ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, slice INT NOT NULL, persistence_id VARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, -- timestamp_offset is the db_timestamp of the original event timestamp_offset timestamp with time zone NOT NULL, -- timestamp_consumed is when the offset was stored -- the consumer lag is timestamp_consumed - timestamp_offset timestamp_consumed timestamp with time zone NOT NULL, PRIMARY KEY(slice, projection_name, timestamp_offset, persistence_id, seq_nr) ); CREATE TABLE IF NOT EXISTS akka_projection_management ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, paused BOOLEAN NOT NULL, last_updated BIGINT NOT NULL, PRIMARY KEY(projection_name, projection_key) );
- YugaByte
-
source
CREATE TABLE IF NOT EXISTS event_journal( slice INT NOT NULL, entity_type VARCHAR(255) NOT NULL, persistence_id VARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, db_timestamp timestamp with time zone NOT NULL, event_ser_id INTEGER NOT NULL, event_ser_manifest VARCHAR(255) NOT NULL, event_payload BYTEA NOT NULL, deleted BOOLEAN DEFAULT FALSE NOT NULL, writer VARCHAR(255) NOT NULL, adapter_manifest VARCHAR(255), tags TEXT ARRAY, meta_ser_id INTEGER, meta_ser_manifest VARCHAR(255), meta_payload BYTEA, PRIMARY KEY(persistence_id HASH, seq_nr ASC) ); -- `event_journal_slice_idx` is only needed if the slice based queries are used CREATE INDEX IF NOT EXISTS event_journal_slice_idx ON event_journal(slice ASC, entity_type ASC, db_timestamp ASC, seq_nr ASC, persistence_id, deleted) SPLIT AT VALUES ((127), (255), (383), (511), (639), (767), (895)); CREATE TABLE IF NOT EXISTS snapshot( slice INT NOT NULL, entity_type VARCHAR(255) NOT NULL, persistence_id VARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, db_timestamp timestamp with time zone, write_timestamp BIGINT NOT NULL, ser_id INTEGER NOT NULL, ser_manifest VARCHAR(255) NOT NULL, snapshot BYTEA NOT NULL, tags TEXT ARRAY, meta_ser_id INTEGER, meta_ser_manifest VARCHAR(255), meta_payload BYTEA, PRIMARY KEY(persistence_id HASH) ); -- `snapshot_slice_idx` is only needed if the slice based queries are used together with snapshot as starting point CREATE INDEX IF NOT EXISTS snapshot_slice_idx ON snapshot(slice ASC, entity_type ASC, db_timestamp ASC, persistence_id) SPLIT AT VALUES ((127), (255), (383), (511), (639), (767), (895)); CREATE TABLE IF NOT EXISTS durable_state ( slice INT NOT NULL, entity_type VARCHAR(255) NOT NULL, persistence_id VARCHAR(255) NOT NULL, revision BIGINT NOT NULL, db_timestamp timestamp with time zone NOT NULL, state_ser_id INTEGER NOT NULL, state_ser_manifest VARCHAR(255), state_payload BYTEA NOT NULL, tags TEXT ARRAY, PRIMARY KEY(persistence_id HASH) ); -- `durable_state_slice_idx` is only needed if the slice based queries are used CREATE INDEX IF NOT EXISTS durable_state_slice_idx ON durable_state(slice ASC, entity_type ASC, db_timestamp ASC, persistence_id) SPLIT AT VALUES ((127), (255), (383), (511), (639), (767), (895)); -- Primitive offset types are stored in this table. -- If only timestamp based offsets are used this table is optional. -- Configure akka.projection.r2dbc.offset-store.offset-table="" if the table is not created. CREATE TABLE IF NOT EXISTS akka_projection_offset_store ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, current_offset VARCHAR(255) NOT NULL, manifest VARCHAR(32) NOT NULL, mergeable BOOLEAN NOT NULL, last_updated BIGINT NOT NULL, PRIMARY KEY(projection_name, projection_key) ); -- Timestamp based offsets are stored in this table. CREATE TABLE IF NOT EXISTS akka_projection_timestamp_offset_store ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, slice INT NOT NULL, persistence_id VARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, -- timestamp_offset is the db_timestamp of the original event timestamp_offset timestamp with time zone NOT NULL, -- timestamp_consumed is when the offset was stored -- the consumer lag is timestamp_consumed - timestamp_offset timestamp_consumed timestamp with time zone NOT NULL, PRIMARY KEY(slice ASC, projection_name ASC, timestamp_offset ASC, persistence_id ASC, seq_nr ASC) ) SPLIT AT VALUES ((127), (255), (383), (511), (639), (767), (895)); CREATE TABLE IF NOT EXISTS akka_projection_management ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, paused BOOLEAN NOT NULL, last_updated BIGINT NOT NULL, PRIMARY KEY(projection_name, projection_key) );
- H2
-
source
akka.persistence.r2dbc.connection-factory { additional-init = """ CREATE TABLE IF NOT EXISTS akka_projection_offset_store ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, current_offset VARCHAR(255) NOT NULL, manifest VARCHAR(32) NOT NULL, mergeable BOOLEAN NOT NULL, last_updated BIGINT NOT NULL, PRIMARY KEY(projection_name, projection_key) ); CREATE TABLE IF NOT EXISTS akka_projection_timestamp_offset_store ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, slice INT NOT NULL, persistence_id VARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, timestamp_offset timestamp with time zone NOT NULL, timestamp_consumed timestamp with time zone NOT NULL, PRIMARY KEY(slice, projection_name, timestamp_offset, persistence_id, seq_nr) ); CREATE TABLE IF NOT EXISTS akka_projection_management ( projection_name VARCHAR(255) NOT NULL, projection_key VARCHAR(255) NOT NULL, paused BOOLEAN NOT NULL, last_updated BIGINT NOT NULL, PRIMARY KEY(projection_name, projection_key) ); """ }
- SQLServer
-
source
IF object_id('event_journal') is null CREATE TABLE event_journal( slice INT NOT NULL, entity_type NVARCHAR(255) NOT NULL, persistence_id NVARCHAR(255) NOT NULL, seq_nr NUMERIC(10,0) NOT NULL, db_timestamp datetime2(6) NOT NULL, event_ser_id INTEGER NOT NULL, event_ser_manifest NVARCHAR(255) NOT NULL, event_payload VARBINARY(MAX) NOT NULL, deleted BIT DEFAULT 0 NOT NULL, writer NVARCHAR(255) NOT NULL, adapter_manifest NVARCHAR(255) NOT NULL, tags NVARCHAR(255), meta_ser_id INTEGER, meta_ser_manifest NVARCHAR(255), meta_payload VARBINARY(MAX), PRIMARY KEY(persistence_id, seq_nr) ); IF NOT EXISTS(SELECT * FROM sys.indexes WHERE name = 'event_journal_slice_idx' AND object_id = OBJECT_ID('event_journal')) BEGIN CREATE INDEX event_journal_slice_idx ON event_journal (slice, entity_type, db_timestamp, seq_nr); END; IF object_id('snapshot') is null CREATE TABLE snapshot( slice INT NOT NULL, entity_type NVARCHAR(255) NOT NULL, persistence_id NVARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, db_timestamp datetime2(6), write_timestamp BIGINT NOT NULL, ser_id INTEGER NOT NULL, ser_manifest NVARCHAR(255) NOT NULL, snapshot VARBINARY(MAX) NOT NULL, tags NVARCHAR(255), meta_ser_id INTEGER, meta_ser_manifest NVARCHAR(255), meta_payload VARBINARY(MAX), PRIMARY KEY(persistence_id) ); -- `snapshot_slice_idx` is only needed if the slice based queries are used together with snapshot as starting point IF NOT EXISTS(SELECT * FROM sys.indexes WHERE name = 'snapshot_slice_idx' AND object_id = OBJECT_ID('snapshot')) BEGIN CREATE INDEX snapshot_slice_idx ON snapshot(slice, entity_type, db_timestamp); END; IF object_id('durable_state') is null CREATE TABLE durable_state ( slice INT NOT NULL, entity_type NVARCHAR(255) NOT NULL, persistence_id NVARCHAR(255) NOT NULL, revision BIGINT NOT NULL, db_timestamp datetime2(6) NOT NULL, state_ser_id INTEGER NOT NULL, state_ser_manifest NVARCHAR(255), state_payload VARBINARY(MAX) NOT NULL, tags NVARCHAR(255), PRIMARY KEY(persistence_id, revision) ); -- `durable_state_slice_idx` is only needed if the slice based queries are used IF NOT EXISTS(SELECT * FROM sys.indexes WHERE name = 'durable_state_slice_idx' AND object_id = OBJECT_ID('durable_state')) BEGIN CREATE INDEX durable_state_slice_idx ON durable_state(slice, entity_type, db_timestamp, revision); END; -- during creation of all tables below, the following warning is logged: -- ################################################################################### -- # Warning! The maximum key length for a clustered index is 900 bytes. # -- # The index '[some name]' has maximum length of [some number] bytes. # -- # For some combination of large values, the insert/update operation will fail. # -- ################################################################################### -- Primitive offset types are stored in this table. -- If only timestamp based offsets are used this table is optional. -- Configure akka.projection.r2dbc.offset-store.offset-table="" if the table is not created. IF object_id('akka_projection_offset_store') is null CREATE TABLE akka_projection_offset_store ( projection_name NVARCHAR(255) NOT NULL, projection_key NVARCHAR(255) NOT NULL, current_offset NVARCHAR(255) NOT NULL, manifest NVARCHAR(32) NOT NULL, mergeable BIT DEFAULT 0 NOT NULL, last_updated BIGINT NOT NULL, PRIMARY KEY(projection_name, projection_key) ); IF object_id('akka_projection_timestamp_offset_store') is null CREATE TABLE akka_projection_timestamp_offset_store ( projection_name NVARCHAR(255) NOT NULL, projection_key NVARCHAR(255) NOT NULL, slice INT NOT NULL, persistence_id NVARCHAR(255) NOT NULL, seq_nr BIGINT NOT NULL, -- timestamp_offset is the db_timestamp of the original event timestamp_offset datetime2(6) NOT NULL, -- timestamp_consumed is when the offset was stored -- the consumer lag is timestamp_consumed - timestamp_offset timestamp_consumed datetime2(6) NOT NULL, PRIMARY KEY(slice, projection_name, timestamp_offset, persistence_id, seq_nr) ); IF object_id('akka_projection_management') is null CREATE TABLE akka_projection_management ( projection_name NVARCHAR(255) NOT NULL, projection_key NVARCHAR(255) NOT NULL, paused BIT NOT NULL, last_updated BIGINT NOT NULL, PRIMARY KEY(projection_name, projection_key) );
For H2 the schema need to be defined as the additional-init
setting in your config. This means it is created on first connection instead of up front (needed as there is no way to connect to the database from outside the JVM process):
When using default table names a pre-packaged schema for H2 can be used through config:
sourceinclude "h2-default-projection-schema.conf"
akka.persistence.r2dbc.connection-factory = ${akka.persistence.r2dbc.h2}
akka.persistence.r2dbc.connection-factory {
additional-init = ${akka.projection.r2dbc.default-h2-schema}
}
Configuration
By default, akka-projection-r2dbc
uses the same connection pool and dialect
as akka-persistence-r2dbc
, see Connection configuration.
Reference configuration
The following can be overridden in your application.conf
for the Projection specific settings:
sourceakka.projection.r2dbc {
offset-store {
# set this to your database schema if applicable, empty by default
schema = ""
# the database table name for the offset store,
# can be set to "" if only timestamp offsets are used and table is not created
offset-table = "akka_projection_offset_store"
# the database table name for the offset store
timestamp-offset-table = "akka_projection_timestamp_offset_store"
# the database table name for the projection manangement data
management-table = "akka_projection_management"
# The offset store will keep track of persistence ids and sequence numbers
# within this time window from latest offset.
time-window = 5 minutes
# Backtracking window of the source (query). Should be equal to
# the akka.persistence.r2dbc.query.backtracking.window that is used for the
# SourceProvider.
# It should not be larger than the akka.projection.r2dbc.offset-store.time-window.
backtracking-window = ${akka.persistence.r2dbc.query.backtracking.window}
# Keep this number of entries. Don't evict old entries until this threshold
# has been reached.
keep-number-of-entries = 10000
# Remove old entries outside the time-window from the offset store memory
# with this frequency.
evict-interval = 10 seconds
# Remove old entries outside the time-window from the offset store database
# with this frequency. Can be disabled with `off`.
delete-interval = 1 minute
# Adopt latest-by-slice entries from other projection keys with this frequency.
# Can be disabled with `off`.
adopt-interval = 1 minute
# Trying to batch insert offsets in batches of this size.
offset-batch-size = 20
}
# By default it shares connection-factory with akka-persistence-r2dbc (write side),
# i.e. same connection pool. To use a separate pool for projections this can be
# set to another config path that defines the config based on one of the supported
# akka-persistence-r2dbc dialects, for example:
# ```
# my-connection-factory = ${akka.persistence.r2dbc.postgres}
# my-connection-factory {
# host = "myhost.example.com"
# }
# akka.projection.r2dbc.use-connection-factory = "my-connection-factory"
#```
use-connection-factory = "akka.persistence.r2dbc.connection-factory"
# Logs database calls that take longer than this duration at INFO level.
# Set to "off" to disable this logging.
# Set to 0 to log all calls.
log-db-calls-exceeding = 300 ms
# Filtered events are not actually filtered but passed through the handling flow
# for atLeastOnceFlow, in some applications this is fine, set to false to disable
# the info logged when seeing such filtered events
warn-about-filtered-events-in-flow = true
}
Running with Sharded Daemon Process
The Sharded Daemon Process can be used to distribute n
instances of a given Projection across the cluster. Therefore, it’s important that each Projection instance consumes a subset of the stream of envelopes.
When using eventsBySlices
the initialization code looks like this:
- Scala
-
source
import akka.persistence.query.typed.EventEnvelope import akka.persistence.r2dbc.query.scaladsl.R2dbcReadJournal import akka.projection.Projection import akka.projection.ProjectionBehavior import akka.projection.ProjectionId import akka.projection.eventsourced.scaladsl.EventSourcedProvider import akka.projection.r2dbc.scaladsl.R2dbcProjection import akka.projection.scaladsl.SourceProvider def initProjections(): Unit = { def sourceProvider(sliceRange: Range): SourceProvider[Offset, EventEnvelope[ShoppingCart.Event]] = EventSourcedProvider .eventsBySlices[ShoppingCart.Event]( system, readJournalPluginId = R2dbcReadJournal.Identifier, entityType, sliceRange.min, sliceRange.max) def projection(sliceRange: Range): Projection[EventEnvelope[ShoppingCart.Event]] = { val minSlice = sliceRange.min val maxSlice = sliceRange.max val projectionId = ProjectionId("ShoppingCarts", s"carts-$minSlice-$maxSlice") R2dbcProjection .exactlyOnce( projectionId, settings = None, sourceProvider(sliceRange), handler = () => new ShoppingCartHandler) } ShardedDaemonProcess(system).initWithContext( name = "ShoppingCartProjection", initialNumberOfInstances = 4, behaviorFactory = { daemonContext => val sliceRanges = EventSourcedProvider.sliceRanges(system, R2dbcReadJournal.Identifier, daemonContext.totalProcesses) val sliceRange = sliceRanges(daemonContext.processNumber) ProjectionBehavior(projection(sliceRange)) }, ShardedDaemonProcessSettings(system), stopMessage = ProjectionBehavior.Stop) } - Java
-
source
import akka.cluster.sharding.typed.javadsl.ShardedDaemonProcess; import akka.projection.ProjectionBehavior; import akka.persistence.query.typed.EventEnvelope; import akka.projection.Projection; import akka.projection.ProjectionId; import akka.projection.r2dbc.R2dbcProjectionSettings; import akka.projection.r2dbc.javadsl.R2dbcProjection; void initProjections() { ShardedDaemonProcess.get(system) .initWithContext( ProjectionBehavior.Command.class, "ShoppingCartProjection", 4, daemonContext -> { List<Pair<Integer, Integer>> sliceRanges = EventSourcedProvider.sliceRanges( system, R2dbcReadJournal.Identifier(), daemonContext.totalProcesses()); Pair<Integer, Integer> sliceRange = sliceRanges.get(daemonContext.processNumber()); return ProjectionBehavior.create(createProjection(sliceRange)); }, ShardedDaemonProcessSettings.create(system), Optional.of(ProjectionBehavior.stopMessage())); } Projection<EventEnvelope<ShoppingCart.Event>> createProjection( Pair<Integer, Integer> sliceRange) { int minSlice = sliceRange.first(); int maxSlice = sliceRange.second(); String entityType = ShoppingCart.ENTITY_TYPE_KEY.name(); SourceProvider<Offset, EventEnvelope<ShoppingCart.Event>> sourceProvider = EventSourcedProvider.eventsBySlices( system, R2dbcReadJournal.Identifier(), entityType, minSlice, maxSlice); ProjectionId projectionId = ProjectionId.of("ShoppingCarts", "carts-" + minSlice + "-" + maxSlice); Optional<R2dbcProjectionSettings> settings = Optional.empty(); return R2dbcProjection.exactlyOnce( projectionId, settings, sourceProvider, ShoppingCartHandler::new, system); }
The ShoppingCartHandler
is shown below.
It is possible to dynamically scale the number of Projection instances as described in Sharded Daemon Process documentation.
There are alternative ways of running the ProjectionBehavior
as described in Running a Projection, but note that when using the R2DBC plugin as SourceProvider
it is recommended to use eventsBySlices
and not eventsByTag
.
Slices
The SourceProvider
for Event Sourced actors has historically been using eventsByTag
but the R2DBC plugin is instead providing eventsBySlices
as an improved solution.
The usage of eventsByTag
for Projections has the drawback that the number of tags must be decided up-front and can’t easily be changed afterwards. Starting with too many tags means much overhead since many projection instances would be running on each node in a small Akka Cluster. Each projection instance polling the database periodically. Starting with too few tags means that it can’t be scaled later to more Akka nodes.
With eventsBySlices
more Projection instances can be added when needed and still reuse the offsets for the previous slice distributions.
A slice is deterministically defined based on the persistence id. The purpose is to evenly distribute all persistence ids over the slices. The eventsBySlices
query is for a range of the slices. For example if using 1024 slices and running 4 Projection instances the slice ranges would be 0-255, 256-511, 512-767, 768-1023. Changing to 8 slice ranges means that the ranges would be 0-127, 128-255, 256-383, …, 768-895, 896-1023.
However, when changing the number of slices the projections with the old slice distribution must be stopped before starting new projections. That can be done at runtime when Running with Sharded Daemon Process.
When using R2dbcProjection
together with the EventSourcedProvider.eventsBySlices
the events will be delivered in sequence number order without duplicates.
When using R2dbcProjection
together with DurableStateSourceProvider.changesBySlices
the changes will be delivered in revision number order without duplicates.
exactly-once
The offset is stored in the same transaction used for the user defined handler
, which means exactly-once processing semantics if the projection is restarted from previously stored offset.
- Scala
-
source
import akka.projection.ProjectionId import akka.projection.r2dbc.scaladsl.R2dbcProjection val projectionId = ProjectionId("ShoppingCarts", s"carts-$minSlice-$maxSlice") val projection = R2dbcProjection .exactlyOnce(projectionId, settings = None, sourceProvider, handler = () => new ShoppingCartHandler) - Java
-
source
import akka.projection.ProjectionId; import akka.projection.r2dbc.R2dbcProjectionSettings; import akka.projection.r2dbc.javadsl.R2dbcProjection; ProjectionId projectionId = ProjectionId.of("ShoppingCarts", "carts-" + minSlice + "-" + maxSlice); Optional<R2dbcProjectionSettings> settings = Optional.empty(); Projection<EventEnvelope<ShoppingCart.Event>> projection = R2dbcProjection.exactlyOnce( projectionId, settings, sourceProvider, ShoppingCartHandler::new, system);
The ShoppingCartHandler
is shown below.
at-least-once
The offset is stored after the envelope has been processed and giving at-least-once processing semantics. This means that if the projection is restarted from a previously stored offset some elements may be processed more than once. Therefore, the Handler code must be idempotent.
- Scala
-
source
import akka.projection.ProjectionId import akka.projection.r2dbc.scaladsl.R2dbcProjection val projectionId = ProjectionId("ShoppingCarts", s"carts-$minSlice-$maxSlice") val projection = R2dbcProjection .atLeastOnce(projectionId, settings = None, sourceProvider, handler = () => new ShoppingCartHandler) .withSaveOffset(afterEnvelopes = 100, afterDuration = 500.millis) - Java
-
source
import akka.projection.ProjectionId; import akka.projection.r2dbc.R2dbcProjectionSettings; import akka.projection.r2dbc.javadsl.R2dbcProjection; ProjectionId projectionId = ProjectionId.of("ShoppingCarts", "carts-" + minSlice + "-" + maxSlice); Optional<R2dbcProjectionSettings> settings = Optional.empty(); int saveOffsetAfterEnvelopes = 100; Duration saveOffsetAfterDuration = Duration.ofMillis(500); Projection<EventEnvelope<ShoppingCart.Event>> projection = R2dbcProjection.atLeastOnce( projectionId, settings, sourceProvider, ShoppingCartHandler::new, system) .withSaveOffset(saveOffsetAfterEnvelopes, saveOffsetAfterDuration);
The offset is stored after a time window, or limited by a number of envelopes, whatever happens first. This window can be defined with withSaveOffset
of the returned AtLeastOnceProjection
. The default settings for the window is defined in configuration section akka.projection.at-least-once
. There is a performance benefit of not storing the offset too often, but the drawback is that there can be more duplicates when the projection that will be processed again when the projection is restarted.
The ShoppingCartHandler
is shown below.
groupedWithin
The envelopes can be grouped before processing, which can be useful for batch updates.
- Scala
-
source
import akka.projection.ProjectionId import akka.projection.r2dbc.scaladsl.R2dbcProjection val projectionId = ProjectionId("ShoppingCarts", s"carts-$minSlice-$maxSlice") val projection = R2dbcProjection .groupedWithin(projectionId, settings = None, sourceProvider, handler = () => new GroupedShoppingCartHandler) .withGroup(groupAfterEnvelopes = 20, groupAfterDuration = 500.millis) - Java
-
source
import akka.projection.ProjectionId; import akka.projection.r2dbc.R2dbcProjectionSettings; import akka.projection.r2dbc.javadsl.R2dbcProjection; ProjectionId projectionId = ProjectionId.of("ShoppingCarts", "carts-" + minSlice + "-" + maxSlice); Optional<R2dbcProjectionSettings> settings = Optional.empty(); int saveOffsetAfterEnvelopes = 100; Duration saveOffsetAfterDuration = Duration.ofMillis(500); Projection<EventEnvelope<ShoppingCart.Event>> projection = R2dbcProjection.groupedWithin( projectionId, settings, sourceProvider, GroupedShoppingCartHandler::new, system) .withGroup(saveOffsetAfterEnvelopes, saveOffsetAfterDuration);
The envelopes are grouped within a time window, or limited by a number of envelopes, whatever happens first. This window can be defined with withGroup
of the returned GroupedProjection
. The default settings for the window is defined in configuration section akka.projection.grouped
.
When using groupedWithin
the handler is a R2dbcHandler[immutable.Seq[EventEnvelope[ShoppingCart.Event]]]
R2dbcHandler<List<EventEnvelope<ShoppingCart.Event>>>
. The GroupedShoppingCartHandler
is shown below.
The offset is stored in the same transaction used for the user defined handler
, which means exactly-once processing semantics if the projection is restarted from previously stored offset.
Handler
It’s in the R2dbcHandler
R2dbcHandler
that you implement the processing of each envelope. It’s essentially a consumer function from (R2dbcSession, Envelope)
to Future[Done]
CompletionStage<Done>
.
A handler that is consuming ShoppingCart.Event
from eventsBySlices
can look like this:
- Scala
-
source
import akka.persistence.query.typed.EventEnvelope import akka.projection.r2dbc.scaladsl.R2dbcHandler import akka.projection.r2dbc.scaladsl.R2dbcSession class ShoppingCartHandler()(implicit ec: ExecutionContext) extends R2dbcHandler[EventEnvelope[ShoppingCart.Event]] { private val logger = LoggerFactory.getLogger(getClass) override def process(session: R2dbcSession, envelope: EventEnvelope[ShoppingCart.Event]): Future[Done] = { envelope.event match { case ShoppingCart.CheckedOut(cartId, time) => logger.info(s"Shopping cart $cartId was checked out at $time") val stmt = session .createStatement("INSERT into order (id, time) VALUES ($1, $2)") .bind(0, cartId) .bind(1, time) session .updateOne(stmt) .map(_ => Done) case otherEvent => logger.debug(s"Shopping cart ${otherEvent.cartId} changed by $otherEvent") Future.successful(Done) } } }
- Java
-
source
import akka.projection.r2dbc.javadsl.R2dbcHandler; import akka.projection.r2dbc.javadsl.R2dbcSession; import io.r2dbc.spi.Statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; public class ShoppingCartHandler extends R2dbcHandler<EventEnvelope<ShoppingCart.Event>> { private final Logger logger = LoggerFactory.getLogger(getClass()); @Override public CompletionStage<Done> process( R2dbcSession session, EventEnvelope<ShoppingCart.Event> envelope) { ShoppingCart.Event event = envelope.event(); if (event instanceof ShoppingCart.CheckedOut) { ShoppingCart.CheckedOut checkedOut = (ShoppingCart.CheckedOut) event; logger.info( "Shopping cart {} was checked out at {}", checkedOut.cartId, checkedOut.eventTime); Statement stmt = session .createStatement("INSERT into order (id, time) VALUES ($1, $2)") .bind(0, checkedOut.cartId) .bind(1, checkedOut.eventTime); return session.updateOne(stmt).thenApply(rowsUpdated -> Done.getInstance()); } else { logger.debug("Shopping cart {} changed by {}", event.getCartId(), event); return CompletableFuture.completedFuture(Done.getInstance()); } } }
Such simple handlers can also be defined as plain functions via the helper R2dbcHandler.apply
R2dbcHandler.fromFunction
factory method.
Grouped handler
When using R2dbcProjection.groupedWithin
the handler is processing a Seq
List
of envelopes.
- Scala
-
source
import akka.persistence.query.typed.EventEnvelope import akka.projection.r2dbc.scaladsl.R2dbcHandler import akka.projection.r2dbc.scaladsl.R2dbcSession import scala.collection.immutable class GroupedShoppingCartHandler()(implicit ec: ExecutionContext) extends R2dbcHandler[immutable.Seq[EventEnvelope[ShoppingCart.Event]]] { private val logger = LoggerFactory.getLogger(getClass) override def process( session: R2dbcSession, envelopes: immutable.Seq[EventEnvelope[ShoppingCart.Event]]): Future[Done] = { // save all events in DB val stmts = envelopes .map(_.event) .collect { case ShoppingCart.CheckedOut(cartId, time) => logger.info(s"Shopping cart $cartId was checked out at $time") session .createStatement("INSERT into order (id, time) VALUES ($1, $2)") .bind(0, cartId) .bind(1, time) } .toVector session.update(stmts).map(_ => Done) } }
- Java
-
source
import akka.projection.r2dbc.javadsl.R2dbcHandler; import akka.projection.r2dbc.javadsl.R2dbcSession; import io.r2dbc.spi.Statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; public class GroupedShoppingCartHandler extends R2dbcHandler<List<EventEnvelope<ShoppingCart.Event>>> { private final Logger logger = LoggerFactory.getLogger(getClass()); @Override public CompletionStage<Done> process( R2dbcSession session, List<EventEnvelope<ShoppingCart.Event>> envelopes) { List<Statement> stmts = new ArrayList<>(); for (EventEnvelope<ShoppingCart.Event> envelope : envelopes) { ShoppingCart.Event event = envelope.event(); if (event instanceof ShoppingCart.CheckedOut) { ShoppingCart.CheckedOut checkedOut = (ShoppingCart.CheckedOut) event; logger.info( "Shopping cart {} was checked out at {}", checkedOut.cartId, checkedOut.eventTime); Statement stmt = session .createStatement("INSERT into order (id, time) VALUES ($1, $2)") .bind(0, checkedOut.cartId) .bind(1, checkedOut.eventTime); stmts.add(stmt); } else { logger.debug("Shopping cart {} changed by {}", event.getCartId(), event); } } return session.update(stmts).thenApply(rowsUpdated -> Done.getInstance()); } }
Stateful handler
The R2dbcHandler
R2dbcHandler
can be stateful, with variables and mutable data structures. It is invoked by the Projection
machinery one envelope at a time and visibility guarantees between the invocations are handled automatically, i.e. no volatile or other concurrency primitives are needed for managing the state as long as it’s not accessed by other threads than the one that called process
.
It is important that the Handler
instance is not shared between several Projection
instances, because then it would be invoked concurrently, which is not how it is intended to be used. Each Projection
instance should use a new Handler
instance.
Async handler
The Handler
Handler
can be used with R2dbcProjection.atLeastOnceAsync
and R2dbcProjection.groupedWithinAsync
if the handler is not storing the projection result in the database. The handler could send to a Kafka topic or integrate with something else.
There are several examples of such Handler
in the documentation for Cassandra Projections. Same type of handlers can be used with R2dbcProjection
instead of CassandraProjection
.
Actor handler
A good alternative for advanced state management is to implement the handler as an actor which is described in Processing with Actor.
Flow handler
An Akka Streams FlowWithContext
can be used instead of a handler for processing the envelopes, which is described in Processing with Akka Streams.
In addition to the caveats described there a R2dbcProjection.atLeastOnceFlow
must not filter out envelopes. Always emit a Done
element for each completed envelope, even if application processing was skipped for the envelope.
Handler lifecycle
You can override the start
and stop
methods of the R2dbcHandler
to implement initialization before first envelope is processed and resource cleanup when the projection is stopped. Those methods are also called when the Projection
is restarted after failure.
See also error handling.
Offset types
The supported offset types of the R2dbcProjection
are:
TimestampOffset
TimestampOffset
that is used for SourceProvider for eventsBySlices and SourceProvider for changesBySlices- other
Offset
Offset
types MergeableOffset
MergeableOffset
that is used for messages from KafkaString
Int
Long
- Any other type that has a configured Akka Serializer is stored with base64 encoding of the serialized bytes.
Publish events for lower latency
See eventsBySlices documentation.
Multiple plugins
Just like how multiple plugins can be configured as described for the R2DBC persistence plugin multiple projection configurations are possible.
For Projection offset store you need another config section:
sourcesecond-projection-r2dbc = ${akka.projection.r2dbc}
second-projection-r2dbc {
offset-store {
# specific projection offset store properties here
}
use-connection-factory = "second-r2dbc.connection-factory"
}
Note that the use-connection-factory
property references the same connection settings as is used for the second-r2dbc
plugins, but it could also have been a separate connection pool configured as:
sourcesecond-projection-r2dbc = ${akka.projection.r2dbc}
second-projection-r2dbc {
connection-factory = ${akka.persistence.r2dbc.connection-factory}
connection-factory {
# specific connection properties for offset store and projection handler here
}
offset-store {
# specific projection offset store properties here
}
use-connection-factory = "second-projection-r2dbc.connection-factory"
}
In that way you can use the default plugins for the write side and Projection SourceProvider
, but use a separate database for the Projection handlers and offset storage.
You start the Projections with the ProjectionSettings
loaded from "second-projection-r2dbc"
.
- Scala
-
source
import akka.projection.ProjectionId import akka.projection.r2dbc.scaladsl.R2dbcProjection val projectionId = ProjectionId("ShoppingCarts", s"carts-$minSlice-$maxSlice") val settings = Some(R2dbcProjectionSettings(system.settings.config.getConfig("second-projection-r2dbc"))) val projection = R2dbcProjection .atLeastOnce(projectionId, settings = None, sourceProvider, handler = () => new ShoppingCartHandler) - Java
-
source
ProjectionId projectionId = ProjectionId.of("ShoppingCarts", "carts-" + minSlice + "-" + maxSlice); Optional<R2dbcProjectionSettings> settings = Optional.of( R2dbcProjectionSettings.create(system.settings().config().getConfig("second-projection-r2dbc"))); Projection<EventEnvelope<ShoppingCart.Event>> projection = R2dbcProjection.atLeastOnce( projectionId, settings, sourceProvider, ShoppingCartHandler::new, system);
Custom Connection Factory
You can use a custom connection factory by passing it into the projection as part of the ProjectionSettings
.
When providing a custom connection factory, the existing connection configurations are ignored.
- Scala
-
source
import akka.projection.ProjectionId import akka.projection.r2dbc.scaladsl.R2dbcProjection val connectionFactory: ConnectionFactory = ??? val projectionId = ProjectionId("ShoppingCarts", s"carts-$minSlice-$maxSlice") val settings = Some(R2dbcProjectionSettings(system).withCustomConnectionFactory(connectionFactory)) val projection = R2dbcProjection .atLeastOnce(projectionId, settings = None, sourceProvider, handler = () => new ShoppingCartHandler) - Java
-
source
import io.r2dbc.pool.ConnectionPool; import io.r2dbc.pool.ConnectionPoolConfiguration; import io.r2dbc.spi.ConnectionFactory; ProjectionId projectionId = ProjectionId.of("ShoppingCarts", "carts-" + minSlice + "-" + maxSlice); ConnectionFactory connectionFactory = new ConnectionPool(config); Optional<R2dbcProjectionSettings> settings = Optional.of( R2dbcProjectionSettings.create(system).withCustomConnectionFactory(connectionFactory)); Projection<EventEnvelope<ShoppingCart.Event>> projection = R2dbcProjection.atLeastOnce( projectionId, settings, sourceProvider, ShoppingCartHandler::new, system);