gpt4 book ai didi

OSGi 上下文中的 Scala-cat 的 IOApp

转载 作者:行者123 更新时间:2023-12-05 07:25:16 25 4
gpt4 key购买 nike

我目前正在开发的应用程序是使用 scala-cats 以函数式编程风格编写的' IOApp .

现在的问题是我需要在 OSGi 上下文中部署此应用程序,这似乎并不适合我的功能方法。

我的主要方法是这样的:

object Main extends IOApp {
override def run(args: List[String]): IO[ExitCode] = for {
_ <- IO(println("Starting with args: " + args.mkString(",")))
myProgram = new MyProgram(/*...*/)
_ <- myProgram.run() // def run(): IO[RunResult]
// ...
_ <- myProgram.exit() // def exit(): IO[Unit]
} yield ExitCode.Success
}

现在要将其部署到 OSGi,我必须编写 BundleActivator :

import org.osgi.framework.{BundleActivator, BundleContext}

class Activator extends BundleActivator {

private var myProgram: Option[myProgram] = None

override def start(context: BundleContext): Unit = {
myProgram = Some(new MyProgram(/*...*/))
myProgram.foreach{ _.run().unsafeRunSync() }
}

override def stop(context: BundleContext): Unit = {
myProgram.foreach{ _.exit().unsafeRunSync() }
}
}

如您所见,我想出的这个 Activator 远未以函数式方式编写。有什么办法至少可以摆脱 var myProgram(具体来说是可变的 var)?我似乎无法弄清楚这怎么可能。

编辑:激活器需要在 list 中定义,所以这是我的 build.sbt 的一部分:

packageOptions := Seq(ManifestAttributes(
("Bundle-Activator", "my.package.Activator"),
...))

最佳答案

这里无法避免一些讨厌的 Java 式代码,这就是 OSGi 的工作方式。但是您可以做的是将肮脏的东西隐藏在可重用的类中,这样您只需要做对一次就再也不会看它了。我的建议是一个通用的 Activator,它将在启动时获取 cats Resource 并在您关闭它时将其处理掉。

class ResourceActivator(resource: BundleContext => Resource[IO, Unit])
extends BundleActivator {

private var cleanup: IO[Unit] = null

override def start(context: BundleContext): Unit =
cleanup = resource(context).allocate.unsafeRunSync()._2

override def stop(context: BundleContext): Unit =
cleanup.unsafeRunSync()
}

有效的 OSGi 实现永远不会在不先调用 start 的情况下调用 stop,因此可以将 cleanup 初始化为 null.

请注意,上面的类很容易让你 e. G。在 start 方法中启动一些异步计算,并在 stop 方法中关闭它:

class MyActivator extends ResourceActivator(ctx =>
for {
res1 <- someResource
res2 <- anotherResource
_ <- Resource.make(doSomeStuff.start)(_.cancel)
} yield ()
)

关于OSGi 上下文中的 Scala-cat 的 IOApp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54947467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com