diff --git a/obp-api/pom.xml b/obp-api/pom.xml index c11d235330..234c4da59b 100644 --- a/obp-api/pom.xml +++ b/obp-api/pom.xml @@ -83,7 +83,8 @@ com.tesobe obp-commons - + + com.github.everit-org.json-schema @@ -288,21 +290,21 @@ signpost-commonshttp4 1.2.1.2 - + - com.typesafe.akka - akka-http-core_${scala.version} - 10.1.6 + org.apache.pekko + pekko-http-core_${scala.version} + 1.1.0 - com.typesafe.akka - akka-actor_${scala.version} - ${akka.version} + org.apache.pekko + pekko-actor_${scala.version} + ${pekko.version} - com.typesafe.akka - akka-remote_${scala.version} - ${akka.version} + org.apache.pekko + pekko-remote_${scala.version} + ${pekko.version} com.sksamuel.avro4s @@ -316,8 +318,8 @@ com.twitter - chill-akka_${scala.version} - 0.9.1 + chill_${scala.version} + 0.9.3 com.twitter @@ -337,9 +339,9 @@ 0.9.3 - com.typesafe.akka - akka-slf4j_${scala.version} - ${akka.version} + org.apache.pekko + pekko-slf4j_${scala.version} + ${pekko.version} diff --git a/obp-api/src/main/scala/code/actorsystem/ObpActorConfig.scala b/obp-api/src/main/scala/code/actorsystem/ObpActorConfig.scala index 23bdeee853..d2717984dd 100644 --- a/obp-api/src/main/scala/code/actorsystem/ObpActorConfig.scala +++ b/obp-api/src/main/scala/code/actorsystem/ObpActorConfig.scala @@ -13,12 +13,12 @@ object ObpActorConfig { val commonConf = """ - akka { - loggers = ["akka.event.slf4j.Slf4jLogger"] + pekko { + loggers = ["org.apache.pekko.event.slf4j.Slf4jLogger"] loglevel = """ + akka_loglevel + """ actor { - provider = "akka.remote.RemoteActorRefProvider" - allow-java-serialization = off + provider = "org.apache.pekko.remote.RemoteActorRefProvider" + allow-java-serialization = on kryo { type = "graph" idstrategy = "default" @@ -40,31 +40,31 @@ object ObpActorConfig { resolve-subclasses = true } serializers { - kryo = "com.twitter.chill.akka.AkkaSerializer" + java = "org.apache.pekko.serialization.JavaSerializer" } serialization-bindings { - "net.liftweb.common.Full" = kryo, - "net.liftweb.common.Empty" = kryo, - "net.liftweb.common.Box" = kryo, - "net.liftweb.common.ParamFailure" = kryo, - "code.api.APIFailure" = kryo, - "com.openbankproject.commons.model.BankAccount" = kryo, - "com.openbankproject.commons.model.View" = kryo, - "com.openbankproject.commons.model.User" = kryo, - "com.openbankproject.commons.model.ViewId" = kryo, - "com.openbankproject.commons.model.BankIdAccountIdViewId" = kryo, - "com.openbankproject.commons.model.Permission" = kryo, - "scala.Unit" = kryo, - "scala.Boolean" = kryo, - "java.io.Serializable" = kryo, - "scala.collection.immutable.List" = kryo, - "akka.actor.ActorSelectionMessage" = kryo, - "code.model.Consumer" = kryo, - "code.model.AppType" = kryo + "net.liftweb.common.Full" = java, + "net.liftweb.common.Empty" = java, + "net.liftweb.common.Box" = java, + "net.liftweb.common.ParamFailure" = java, + "code.api.APIFailure" = java, + "com.openbankproject.commons.model.BankAccount" = java, + "com.openbankproject.commons.model.View" = java, + "com.openbankproject.commons.model.User" = java, + "com.openbankproject.commons.model.ViewId" = java, + "com.openbankproject.commons.model.BankIdAccountIdViewId" = java, + "com.openbankproject.commons.model.Permission" = java, + "scala.Unit" = java, + "scala.Boolean" = java, + "java.io.Serializable" = java, + "scala.collection.immutable.List" = java, + "org.apache.pekko.actor.ActorSelectionMessage" = java, + "code.model.Consumer" = java, + "code.model.AppType" = java } } remote { - enabled-transports = ["akka.remote.netty.tcp"] + enabled-transports = ["org.apache.pekko.remote.netty.tcp"] netty { tcp { send-buffer-size = 50000000 @@ -79,7 +79,7 @@ object ObpActorConfig { val lookupConf = s""" ${commonConf} - akka { + pekko { remote.netty.tcp.hostname = ${localHostname} remote.netty.tcp.port = 0 } @@ -88,7 +88,7 @@ object ObpActorConfig { val localConf = s""" ${commonConf} - akka { + pekko { remote.netty.tcp.hostname = ${localHostname} remote.netty.tcp.port = ${localPort} } diff --git a/obp-api/src/main/scala/code/actorsystem/ObpActorSystem.scala b/obp-api/src/main/scala/code/actorsystem/ObpActorSystem.scala index 6995e0af29..9189bd9408 100644 --- a/obp-api/src/main/scala/code/actorsystem/ObpActorSystem.scala +++ b/obp-api/src/main/scala/code/actorsystem/ObpActorSystem.scala @@ -1,6 +1,6 @@ package code.actorsystem -import akka.actor.ActorSystem +import org.apache.pekko.actor.ActorSystem import code.bankconnectors.akka.actor.AkkaConnectorActorConfig import code.util.Helper import code.util.Helper.MdcLoggable diff --git a/obp-api/src/main/scala/code/actorsystem/ObpLookupSystem.scala b/obp-api/src/main/scala/code/actorsystem/ObpLookupSystem.scala index a847b4f898..d9c9aeb832 100644 --- a/obp-api/src/main/scala/code/actorsystem/ObpLookupSystem.scala +++ b/obp-api/src/main/scala/code/actorsystem/ObpLookupSystem.scala @@ -1,12 +1,12 @@ package code.actorsystem -import akka.actor.{ActorSystem} +import org.apache.pekko.actor.{ActorSystem} import code.api.util.APIUtil import code.bankconnectors.LocalMappedOutInBoundTransfer import code.bankconnectors.akka.actor.{AkkaConnectorActorConfig, AkkaConnectorHelperActor} import code.util.Helper import code.util.Helper.MdcLoggable -import com.openbankproject.adapter.akka.commons.config.AkkaConfig +// import com.openbankproject.adapter.pekko.commons.config.PekkoConfig // TODO: Re-enable when Pekko adapter is available import com.typesafe.config.ConfigFactory import net.liftweb.common.Full @@ -38,7 +38,7 @@ trait ObpLookupSystem extends MdcLoggable { if (port == 0) { logger.error("Failed to connect to local Remotedata actor, the port is 0, can not find a proper port in current machine.") } - s"akka.tcp://ObpActorSystem_${props_hostname}@${hostname}:${port}/user/${actorName}" + s"pekko.tcp://ObpActorSystem_${props_hostname}@${hostname}:${port}/user/${actorName}" } this.obpLookupSystem.actorSelection(actorPath) @@ -55,7 +55,7 @@ trait ObpLookupSystem extends MdcLoggable { val hostname = h val port = p val akka_connector_hostname = Helper.getAkkaConnectorHostname - s"akka.tcp://SouthSideAkkaConnector_${akka_connector_hostname}@${hostname}:${port}/user/${actorName}" + s"pekko.tcp://SouthSideAkkaConnector_${akka_connector_hostname}@${hostname}:${port}/user/${actorName}" case _ => val hostname = AkkaConnectorActorConfig.localHostname @@ -66,12 +66,12 @@ trait ObpLookupSystem extends MdcLoggable { } if(embeddedAdapter) { - AkkaConfig(LocalMappedOutInBoundTransfer, Some(ObpActorSystem.northSideAkkaConnectorActorSystem)) + // AkkaConfig(LocalMappedOutInBoundTransfer, Some(ObpActorSystem.northSideAkkaConnectorActorSystem)) // TODO: Re-enable when Pekko adapter is available } else { AkkaConnectorHelperActor.startAkkaConnectorHelperActors(ObpActorSystem.northSideAkkaConnectorActorSystem) } - s"akka.tcp://SouthSideAkkaConnector_${props_hostname}@${hostname}:${port}/user/${actorName}" + s"pekko.tcp://SouthSideAkkaConnector_${props_hostname}@${hostname}:${port}/user/${actorName}" } this.obpLookupSystem.actorSelection(actorPath) } diff --git a/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEndpointHelper.scala b/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEndpointHelper.scala index 80f3b07d6e..757ea0465a 100644 --- a/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEndpointHelper.scala +++ b/obp-api/src/main/scala/code/api/dynamic/endpoint/helper/DynamicEndpointHelper.scala @@ -1,6 +1,6 @@ package code.api.dynamic.endpoint.helper -import akka.http.scaladsl.model.{HttpMethods, HttpMethod => AkkaHttpMethod} +import org.apache.pekko.http.scaladsl.model.{HttpMethods, HttpMethod => PekkoHttpMethod} import code.DynamicData.{DynamicDataProvider, DynamicDataT} import code.DynamicEndpoint.{DynamicEndpointProvider, DynamicEndpointT} import code.api.util.APIUtil.{BigDecimalBody, BigIntBody, BooleanBody, DoubleBody, EmptyBody, FloatBody, IntBody, JArrayBody, LongBody, PrimaryDataBody, ResourceDoc, StringBody} @@ -171,7 +171,7 @@ object DynamicEndpointHelper extends RestHelper { * @param r HttpRequest * @return (adapterUrl, requestBodyJson, httpMethod, requestParams, pathParams, role, operationId, mockResponseCode->mockResponseBody) */ - def unapply(r: Req): Option[(String, JValue, AkkaHttpMethod, Map[String, List[String]], Map[String, String], ApiRole, String, Option[(Int, JValue)], Option[String])] = { + def unapply(r: Req): Option[(String, JValue, PekkoHttpMethod, Map[String, List[String]], Map[String, String], ApiRole, String, Option[(Int, JValue)], Option[String])] = { val requestUri = r.request.uri //eg: `/obp/dynamic-endpoint/fashion-brand-list/BRAND_ID` val partPath = r.path.partPath //eg: List("fashion-brand-list","BRAND_ID"), the dynamic is from OBP URL, not in the partPath now. @@ -179,7 +179,7 @@ object DynamicEndpointHelper extends RestHelper { if (!testResponse_?(r) || !requestUri.startsWith(s"/${ApiStandards.obp.toString}/${ApiShortVersions.`dynamic-endpoint`.toString}"+urlPrefix))//if check the Content-Type contains json or not, and check the if it is the `dynamic_endpoints_url_prefix` None //if do not match `URL and Content-Type`, then can not find this endpoint. return None. else { - val akkaHttpMethod = HttpMethods.getForKeyCaseInsensitive(r.requestType.method).get + val pekkoHttpMethod = HttpMethods.getForKeyCaseInsensitive(r.requestType.method).get val httpMethod = HttpMethod.valueOf(r.requestType.method) val urlQueryParameters = r.params // url that match original swagger endpoint. @@ -230,7 +230,7 @@ object DynamicEndpointHelper extends RestHelper { val Some(role::_) = doc.roles val requestBodyJValue = body(r).getOrElse(JNothing) - Full(s"""$serverUrl$url""", requestBodyJValue, akkaHttpMethod, urlQueryParameters, pathParams, role, doc.operationId, mockResponse, bankId) + Full(s"""$serverUrl$url""", requestBodyJValue, pekkoHttpMethod, urlQueryParameters, pathParams, role, doc.operationId, mockResponse, bankId) } } diff --git a/obp-api/src/main/scala/code/api/util/DynamicUtil.scala b/obp-api/src/main/scala/code/api/util/DynamicUtil.scala index dbe790ebb7..df232a0762 100644 --- a/obp-api/src/main/scala/code/api/util/DynamicUtil.scala +++ b/obp-api/src/main/scala/code/api/util/DynamicUtil.scala @@ -242,10 +242,10 @@ object DynamicUtil extends MdcLoggable{ |import java.util.Date |import java.util.UUID.randomUUID | - |import _root_.akka.stream.StreamTcpException - |import akka.http.scaladsl.model.headers.RawHeader - |import akka.http.scaladsl.model.{HttpProtocol, _} - |import akka.util.ByteString + |import _root_.org.apache.pekko.stream.StreamTcpException + |import org.apache.pekko.http.scaladsl.model.headers.RawHeader + |import org.apache.pekko.http.scaladsl.model.{HttpProtocol, _} + |import org.apache.pekko.util.ByteString |import code.api.APIFailureNewStyle |import code.api.ResourceDocs1_4_0.MessageDocsSwaggerDefinitions |import code.api.cache.Caching diff --git a/obp-api/src/main/scala/code/api/util/NewStyle.scala b/obp-api/src/main/scala/code/api/util/NewStyle.scala index 2a538550d9..80394c0c5f 100644 --- a/obp-api/src/main/scala/code/api/util/NewStyle.scala +++ b/obp-api/src/main/scala/code/api/util/NewStyle.scala @@ -1,7 +1,7 @@ package code.api.util -import akka.http.scaladsl.model.HttpMethod +import org.apache.pekko.http.scaladsl.model.HttpMethod import code.DynamicEndpoint.{DynamicEndpointProvider, DynamicEndpointT} import code.api.Constant.{SYSTEM_READ_ACCOUNTS_BERLIN_GROUP_VIEW_ID, SYSTEM_READ_BALANCES_BERLIN_GROUP_VIEW_ID} import code.api.builder.PaymentInitiationServicePISApi.APIMethods_PaymentInitiationServicePISApi.checkPaymentServerTypeError diff --git a/obp-api/src/main/scala/code/bankconnectors/Connector.scala b/obp-api/src/main/scala/code/bankconnectors/Connector.scala index cadaa87cb2..4fe2e3b84f 100644 --- a/obp-api/src/main/scala/code/bankconnectors/Connector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/Connector.scala @@ -1,6 +1,6 @@ package code.bankconnectors -import _root_.akka.http.scaladsl.model.HttpMethod +import org.apache.pekko.http.scaladsl.model.HttpMethod import code.api.attributedefinition.AttributeDefinition import code.api.util.APIUtil.{OBPReturnType, _} import code.api.util.ErrorMessages._ diff --git a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala index ba9d2db896..e92c6bdf59 100644 --- a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala @@ -1,6 +1,6 @@ package code.bankconnectors -import _root_.akka.http.scaladsl.model.HttpMethod +import _root_.org.apache.pekko.http.scaladsl.model.HttpMethod import code.DynamicData.DynamicDataProvider import code.accountapplication.AccountApplicationX import code.accountattribute.AccountAttributeX diff --git a/obp-api/src/main/scala/code/bankconnectors/akka/AkkaConnector_vDec2018.scala b/obp-api/src/main/scala/code/bankconnectors/akka/AkkaConnector_vDec2018.scala index 61baf2bc31..0a182dc499 100644 --- a/obp-api/src/main/scala/code/bankconnectors/akka/AkkaConnector_vDec2018.scala +++ b/obp-api/src/main/scala/code/bankconnectors/akka/AkkaConnector_vDec2018.scala @@ -1,7 +1,7 @@ package code.bankconnectors.akka import java.util.Date -import akka.pattern.ask +import org.apache.pekko.pattern.ask import code.actorsystem.ObpLookupSystem import code.api.ResourceDocs1_4_0.MessageDocsSwaggerDefinitions import code.api.ResourceDocs1_4_0.MessageDocsSwaggerDefinitions.{bankAccountCommons, bankCommons, transaction, _} diff --git a/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorActorConfig.scala b/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorActorConfig.scala index 9edda3e85f..84ac050178 100644 --- a/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorActorConfig.scala +++ b/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorActorConfig.scala @@ -16,12 +16,12 @@ object AkkaConnectorActorConfig { val commonConf = """ - akka { - loggers = ["akka.event.slf4j.Slf4jLogger"] + pekko { + loggers = ["org.apache.pekko.event.slf4j.Slf4jLogger"] loglevel = """ + akka_loglevel + """ actor { - provider = "akka.remote.RemoteActorRefProvider" - allow-java-serialization = off + provider = "org.apache.pekko.remote.RemoteActorRefProvider" + allow-java-serialization = on kryo { type = "graph" idstrategy = "default" @@ -43,31 +43,31 @@ object AkkaConnectorActorConfig { resolve-subclasses = true } serializers { - kryo = "com.twitter.chill.akka.AkkaSerializer" + java = "org.apache.pekko.serialization.JavaSerializer" } serialization-bindings { - "net.liftweb.common.Full" = kryo, - "net.liftweb.common.Empty" = kryo, - "net.liftweb.common.Box" = kryo, - "net.liftweb.common.ParamFailure" = kryo, - "code.api.APIFailure" = kryo, - "com.openbankproject.commons.model.BankAccount" = kryo, - "com.openbankproject.commons.model.View" = kryo, - "com.openbankproject.commons.model.User" = kryo, - "com.openbankproject.commons.model.ViewId" = kryo, - "com.openbankproject.commons.model.BankIdAccountIdViewId" = kryo, - "com.openbankproject.commons.model.Permission" = kryo, - "scala.Unit" = kryo, - "scala.Boolean" = kryo, - "java.io.Serializable" = kryo, - "scala.collection.immutable.List" = kryo, - "akka.actor.ActorSelectionMessage" = kryo, - "code.model.Consumer" = kryo, - "code.model.AppType" = kryo + "net.liftweb.common.Full" = java, + "net.liftweb.common.Empty" = java, + "net.liftweb.common.Box" = java, + "net.liftweb.common.ParamFailure" = java, + "code.api.APIFailure" = java, + "com.openbankproject.commons.model.BankAccount" = java, + "com.openbankproject.commons.model.View" = java, + "com.openbankproject.commons.model.User" = java, + "com.openbankproject.commons.model.ViewId" = java, + "com.openbankproject.commons.model.BankIdAccountIdViewId" = java, + "com.openbankproject.commons.model.Permission" = java, + "scala.Unit" = java, + "scala.Boolean" = java, + "java.io.Serializable" = java, + "scala.collection.immutable.List" = java, + "org.apache.pekko.actor.ActorSelectionMessage" = java, + "code.model.Consumer" = java, + "code.model.AppType" = java } } remote { - enabled-transports = ["akka.remote.netty.tcp"] + enabled-transports = ["org.apache.pekko.remote.netty.tcp"] netty { tcp { send-buffer-size = 50000000 @@ -82,7 +82,7 @@ object AkkaConnectorActorConfig { val lookupConf = s""" ${commonConf} - akka { + pekko { remote.netty.tcp.hostname = ${localHostname} remote.netty.tcp.port = 0 } @@ -91,7 +91,7 @@ object AkkaConnectorActorConfig { val localConf = s""" ${commonConf} - akka { + pekko { remote.netty.tcp.hostname = ${localHostname} remote.netty.tcp.port = ${localPort} } @@ -100,7 +100,7 @@ object AkkaConnectorActorConfig { val remoteConf = s""" ${commonConf} - akka { + pekko { remote.netty.tcp.hostname = ${remoteHostname} remote.netty.tcp.port = ${remotePort} } diff --git a/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorActorInit.scala b/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorActorInit.scala index 0b8bc09acf..2170bf6225 100644 --- a/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorActorInit.scala +++ b/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorActorInit.scala @@ -1,6 +1,6 @@ package code.bankconnectors.akka.actor -import akka.util.Timeout +import org.apache.pekko.util.Timeout import code.api.util.APIUtil import code.util.Helper.MdcLoggable diff --git a/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorHelperActor.scala b/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorHelperActor.scala index b5c115bf3f..f55d3e0303 100644 --- a/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorHelperActor.scala +++ b/obp-api/src/main/scala/code/bankconnectors/akka/actor/AkkaConnectorHelperActor.scala @@ -1,6 +1,6 @@ package code.bankconnectors.akka.actor -import akka.actor.{ActorSystem, Props} +import org.apache.pekko.actor.{ActorSystem, Props} import code.api.util.APIUtil import code.util.Helper.MdcLoggable diff --git a/obp-api/src/main/scala/code/bankconnectors/akka/actor/SouthSideActorOfAkkaConnector.scala b/obp-api/src/main/scala/code/bankconnectors/akka/actor/SouthSideActorOfAkkaConnector.scala index b9b9966d47..d06a3b3751 100644 --- a/obp-api/src/main/scala/code/bankconnectors/akka/actor/SouthSideActorOfAkkaConnector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/akka/actor/SouthSideActorOfAkkaConnector.scala @@ -1,6 +1,6 @@ package code.bankconnectors.akka.actor -import akka.actor.{Actor, ActorLogging} +import org.apache.pekko.actor.{Actor, ActorLogging} import code.api.util.APIUtil.DateWithMsFormat import code.api.util.ErrorMessages.attemptedToOpenAnEmptyBox import code.api.util.{APIUtil, OBPFromDate, OBPLimit, OBPToDate} diff --git a/obp-api/src/main/scala/code/bankconnectors/cardano/CardanoConnector_vJun2025.scala b/obp-api/src/main/scala/code/bankconnectors/cardano/CardanoConnector_vJun2025.scala index 01dbcc2620..3247a16e56 100644 --- a/obp-api/src/main/scala/code/bankconnectors/cardano/CardanoConnector_vJun2025.scala +++ b/obp-api/src/main/scala/code/bankconnectors/cardano/CardanoConnector_vJun2025.scala @@ -83,7 +83,7 @@ trait CardanoConnector_vJun2025 extends Connector with MdcLoggable { | $metadataJson |}""".stripMargin - request = prepareHttpRequest(paramUrl, _root_.akka.http.scaladsl.model.HttpMethods.POST, _root_.akka.http.scaladsl.model.HttpProtocol("HTTP/1.1"), jsonToSend) + request = prepareHttpRequest(paramUrl, _root_.org.apache.pekko.http.scaladsl.model.HttpMethods.POST, _root_.org.apache.pekko.http.scaladsl.model.HttpProtocol("HTTP/1.1"), jsonToSend) _ = logger.debug(s"CardanoConnector_vJun2025.makePaymentv210 request is : $request") response <- NewStyle.function.tryons(s"${ErrorMessages.UnknownError} Failed to make HTTP request to Cardano API", 500, callContext) { @@ -91,7 +91,7 @@ trait CardanoConnector_vJun2025 extends Connector with MdcLoggable { }.flatten responseBody <- NewStyle.function.tryons(s"${ErrorMessages.UnknownError} Failed to extract response body", 500, callContext) { - response.entity.dataBytes.runFold(_root_.akka.util.ByteString(""))(_ ++ _).map(_.utf8String) + response.entity.dataBytes.runFold(_root_.org.apache.pekko.util.ByteString(""))(_ ++ _).map(_.utf8String) }.flatten _ <- Helper.booleanToFuture(s"${ErrorMessages.UnknownError} Cardano API returned error: ${response.status.value}", 500, callContext) { diff --git a/obp-api/src/main/scala/code/bankconnectors/ethereum/EthereumConnector_vSept2025.scala b/obp-api/src/main/scala/code/bankconnectors/ethereum/EthereumConnector_vSept2025.scala index 91fd4ee05f..e8d819e252 100644 --- a/obp-api/src/main/scala/code/bankconnectors/ethereum/EthereumConnector_vSept2025.scala +++ b/obp-api/src/main/scala/code/bankconnectors/ethereum/EthereumConnector_vSept2025.scala @@ -87,7 +87,7 @@ trait EthereumConnector_vSept2025 extends Connector with MdcLoggable { } for { - request <- NewStyle.function.tryons(ErrorMessages.UnknownError + " Failed to build HTTP request", 500, callContext) {prepareHttpRequest(rpcUrl, _root_.akka.http.scaladsl.model.HttpMethods.POST, _root_.akka.http.scaladsl.model.HttpProtocol("HTTP/1.1"), payload) + request <- NewStyle.function.tryons(ErrorMessages.UnknownError + " Failed to build HTTP request", 500, callContext) {prepareHttpRequest(rpcUrl, _root_.org.apache.pekko.http.scaladsl.model.HttpMethods.POST, _root_.org.apache.pekko.http.scaladsl.model.HttpProtocol("HTTP/1.1"), payload) } response <- NewStyle.function.tryons(ErrorMessages.UnknownError + " Failed to call Ethereum RPC", 500, callContext) { @@ -95,7 +95,7 @@ trait EthereumConnector_vSept2025 extends Connector with MdcLoggable { }.flatten body <- NewStyle.function.tryons(ErrorMessages.UnknownError + " Failed to read Ethereum RPC response", 500, callContext) { - response.entity.dataBytes.runFold(_root_.akka.util.ByteString(""))(_ ++ _).map(_.utf8String) + response.entity.dataBytes.runFold(_root_.org.apache.pekko.util.ByteString(""))(_ ++ _).map(_.utf8String) }.flatten _ <- Helper.booleanToFuture(ErrorMessages.UnknownError + s" Ethereum RPC returned error: ${response.status.value}", 500, callContext) { diff --git a/obp-api/src/main/scala/code/bankconnectors/package.scala b/obp-api/src/main/scala/code/bankconnectors/package.scala index 78eed0f2f5..e85f19c3fd 100644 --- a/obp-api/src/main/scala/code/bankconnectors/package.scala +++ b/obp-api/src/main/scala/code/bankconnectors/package.scala @@ -3,7 +3,7 @@ package code import java.lang.reflect.Method import java.util.regex.Pattern -import akka.http.scaladsl.model.HttpMethod +import org.apache.pekko.http.scaladsl.model.HttpMethod import code.api.{APIFailureNewStyle, ApiVersionHolder} import code.api.util.{CallContext, FutureUtil, NewStyle} import code.methodrouting.{MethodRouting, MethodRoutingT} diff --git a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala index 53a3b72004..26304d01fa 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala @@ -23,10 +23,10 @@ Osloerstrasse 16/17 Berlin 13359, Germany */ -import _root_.akka.stream.StreamTcpException -import akka.http.scaladsl.model._ -import akka.http.scaladsl.model.headers.RawHeader -import akka.util.ByteString +import _root_.org.apache.pekko.stream.StreamTcpException +import org.apache.pekko.http.scaladsl.model._ +import org.apache.pekko.http.scaladsl.model.headers.RawHeader +import org.apache.pekko.util.ByteString import code.api.APIFailureNewStyle import code.api.ResourceDocs1_4_0.MessageDocsSwaggerDefinitions import code.api.dynamic.endpoint.helper.MockResponseHolder diff --git a/obp-api/src/main/scala/code/customer/CustomerProvider.scala b/obp-api/src/main/scala/code/customer/CustomerProvider.scala index 7c4bd205de..2f7952b1a9 100644 --- a/obp-api/src/main/scala/code/customer/CustomerProvider.scala +++ b/obp-api/src/main/scala/code/customer/CustomerProvider.scala @@ -6,7 +6,7 @@ import code.api.util.{APIUtil, OBPQueryParam} import com.openbankproject.commons.model.{User, _} import net.liftweb.common.Box import net.liftweb.util.SimpleInjector -import akka.pattern.pipe +import org.apache.pekko.pattern.pipe import scala.collection.immutable.List import scala.concurrent.Future diff --git a/obp-api/src/main/scala/code/scheduler/DataBaseCleanerScheduler.scala b/obp-api/src/main/scala/code/scheduler/DataBaseCleanerScheduler.scala index d2398e3174..c72b08be85 100644 --- a/obp-api/src/main/scala/code/scheduler/DataBaseCleanerScheduler.scala +++ b/obp-api/src/main/scala/code/scheduler/DataBaseCleanerScheduler.scala @@ -1,6 +1,6 @@ package code.scheduler -import code.actorsystem.ObpLookupSystem +import code.actorsystem.ObpActorSystem import code.api.Constant import code.api.util.APIUtil.generateUUID import code.api.util.APIUtil @@ -17,7 +17,7 @@ import code.token.Tokens object DataBaseCleanerScheduler extends MdcLoggable { - private lazy val actorSystem = ObpLookupSystem.obpLookupSystem + private lazy val actorSystem = ObpActorSystem.localActorSystem implicit lazy val executor = actorSystem.dispatcher private lazy val scheduler = actorSystem.scheduler private val oneDayInMillis: Long = 86400000 diff --git a/obp-api/src/main/scala/code/scheduler/DatabaseDriverScheduler.scala b/obp-api/src/main/scala/code/scheduler/DatabaseDriverScheduler.scala index c31fe50868..1b9eeba61c 100644 --- a/obp-api/src/main/scala/code/scheduler/DatabaseDriverScheduler.scala +++ b/obp-api/src/main/scala/code/scheduler/DatabaseDriverScheduler.scala @@ -3,7 +3,7 @@ package code.scheduler import java.sql.SQLException import java.util.concurrent.TimeUnit -import code.actorsystem.ObpLookupSystem +import code.actorsystem.ObpActorSystem import code.util.Helper.MdcLoggable import net.liftweb.db.{DB, SuperConnection} @@ -12,7 +12,7 @@ import scala.concurrent.duration._ object DatabaseDriverScheduler extends MdcLoggable { - private lazy val actorSystem = ObpLookupSystem.obpLookupSystem + private lazy val actorSystem = ObpActorSystem.localActorSystem implicit lazy val executor = actorSystem.dispatcher private lazy val scheduler = actorSystem.scheduler diff --git a/obp-api/src/main/scala/code/scheduler/MetricsArchiveScheduler.scala b/obp-api/src/main/scala/code/scheduler/MetricsArchiveScheduler.scala index 6c0eebb676..123397a0b0 100644 --- a/obp-api/src/main/scala/code/scheduler/MetricsArchiveScheduler.scala +++ b/obp-api/src/main/scala/code/scheduler/MetricsArchiveScheduler.scala @@ -2,7 +2,7 @@ package code.scheduler import java.util.concurrent.TimeUnit import java.util.{Calendar, Date} -import code.actorsystem.ObpLookupSystem +import code.actorsystem.ObpActorSystem import code.api.Constant import code.api.util.APIUtil.generateUUID import code.api.util.{APIUtil, OBPLimit, OBPToDate} @@ -16,7 +16,7 @@ import scala.concurrent.duration._ object MetricsArchiveScheduler extends MdcLoggable { - private lazy val actorSystem = ObpLookupSystem.obpLookupSystem + private lazy val actorSystem = ObpActorSystem.localActorSystem implicit lazy val executor = actorSystem.dispatcher private lazy val scheduler = actorSystem.scheduler private val oneDayInMillis: Long = 86400000 diff --git a/obp-api/src/main/scala/code/scheduler/SchedulerUtil.scala b/obp-api/src/main/scala/code/scheduler/SchedulerUtil.scala index 63fce1e1fb..34772ab221 100644 --- a/obp-api/src/main/scala/code/scheduler/SchedulerUtil.scala +++ b/obp-api/src/main/scala/code/scheduler/SchedulerUtil.scala @@ -1,14 +1,14 @@ package code.scheduler -import code.actorsystem.ObpLookupSystem +import code.actorsystem.ObpActorSystem import java.util.concurrent.TimeUnit import java.util.{Calendar, Date} import scala.concurrent.duration._ object SchedulerUtil { - private lazy val actorSystem = ObpLookupSystem.obpLookupSystem + private lazy val actorSystem = ObpActorSystem.localActorSystem implicit lazy val executor = actorSystem.dispatcher private lazy val scheduler = actorSystem.scheduler diff --git a/obp-api/src/main/scala/code/transactionstatus/TransactionRequestStatusScheduler.scala b/obp-api/src/main/scala/code/transactionstatus/TransactionRequestStatusScheduler.scala index e3c7075dbe..3d8ed3b673 100644 --- a/obp-api/src/main/scala/code/transactionstatus/TransactionRequestStatusScheduler.scala +++ b/obp-api/src/main/scala/code/transactionstatus/TransactionRequestStatusScheduler.scala @@ -2,7 +2,7 @@ package code.transactionStatusScheduler import java.util.concurrent.TimeUnit -import code.actorsystem.ObpLookupSystem +import code.actorsystem.ObpActorSystem import code.transactionrequests.TransactionRequests import code.util.Helper.MdcLoggable @@ -11,7 +11,7 @@ import scala.concurrent.duration._ object TransactionRequestStatusScheduler extends MdcLoggable { - private lazy val actorSystem = ObpLookupSystem.obpLookupSystem + private lazy val actorSystem = ObpActorSystem.localActorSystem implicit lazy val executor = actorSystem.dispatcher private lazy val scheduler = actorSystem.scheduler diff --git a/obp-api/src/main/scala/code/util/AkkaHttpClient.scala b/obp-api/src/main/scala/code/util/AkkaHttpClient.scala index 1438cd4710..946c1a92bb 100644 --- a/obp-api/src/main/scala/code/util/AkkaHttpClient.scala +++ b/obp-api/src/main/scala/code/util/AkkaHttpClient.scala @@ -1,10 +1,10 @@ package code.util -import akka.http.scaladsl.Http -import akka.http.scaladsl.model._ -import akka.http.scaladsl.settings.ConnectionPoolSettings -import akka.stream.ActorMaterializer +import org.apache.pekko.http.scaladsl.Http +import org.apache.pekko.http.scaladsl.model._ +import org.apache.pekko.http.scaladsl.settings.ConnectionPoolSettings +import org.apache.pekko.stream.ActorMaterializer import code.actorsystem.ObpLookupSystem import code.api.util.{APIUtil, CustomJsonFormats} import code.util.Helper.MdcLoggable diff --git a/pom.xml b/pom.xml index da476faed2..1da0298ab2 100644 --- a/pom.xml +++ b/pom.xml @@ -12,11 +12,11 @@ 2.12 2.12.20 - 2.5.32 + 1.1.2 1.8.2 3.5.0 0.23.30 - 9.4.50.v20221201 + 9.4.50.v20250814 2016.11-RC6-SNAPSHOT UTF-8 diff --git a/release_notes.md b/release_notes.md index e12e9de0af..f33efd0d4b 100644 --- a/release_notes.md +++ b/release_notes.md @@ -3,6 +3,27 @@ ### Most recent changes at top of file ``` Date Commit Action +11/12/2025 3c2df942 BREAKING CHANGE: Migration from Akka to Apache Pekko™ 1.1.2 + Replaced Akka 2.5.32 with Apache Pekko™ 1.1.2 to address Akka licensing changes. + Updated all imports from com.typesafe.akka to org.apache.pekko. + Updated Jetty from 9.4.50 to 9.4.58 for improved Java 17 compatibility. + + Migrated all actor systems to Apache Pekko™ and fixed critical scheduler + actor system initialization conflicts. + Consolidated all schedulers to use shared ObpActorSystem.localActorSystem. + Prevented multiple actor system creation during application boot. + + Fixed actor system references in all schedulers: + - DataBaseCleanerScheduler + - DatabaseDriverScheduler + - MetricsArchiveScheduler + - SchedulerUtil + - TransactionRequestStatusScheduler + + Resolved 'Address already in use' port binding errors. + Eliminated ExceptionInInitializerError during startup. + Fixed race conditions in actor system initialization. + All scheduler functionality preserved with improved stability. TBD TBD Performance Improvement: Added caching to getProviders endpoint Added configurable caching with memoization to GET /obp/v6.0.0/providers endpoint. - Default cache TTL: 3600 seconds (1 hour)