- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发的应用程序是使用 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/
我目前正在开发的应用程序是使用 scala-cats 以函数式编程风格编写的' IOApp . 现在的问题是我需要在 OSGi 上下文中部署此应用程序,这似乎并不适合我的功能方法。 我的主要方法是这样
我最近将我的应用程序转换为继承猫的 IOApp,如 here 所述.我在该文档中读到: the Timer[IO] dependency is already provided by IOApp, s
我最近将我的应用程序转换为继承猫的 IOApp,如 here 所述.我在该文档中读到: the Timer[IO] dependency is already provided by IOApp, s
我有一个简单的 IO 操作序列,暂停 5 秒。 implicit val timer = IO.timer(ExecutionContext.global) def doSth(str: St
我是一名优秀的程序员,十分优秀!