如果要部署一个顶点,我们不能使用对象引用(仅当它是一个Java对象而不是Scala对象时才有效),我们必须传递一个类名和可能的某些部署选项,但这不能传递一个在verticle构造函数中使用的对象引用。 我们可以创建一个没有对象引用的verticle构造函数,然后通过一条消息传递它,但是它也很复杂:“异常或错误导致运行中止:类型:class的消息编解码器没有。”
如何解决?
理想的情况是:
val depOptions: DeploymentOptions = DeploymentOptions().setWorker(true)
val oc: OtherClass = new OtherClass(...)
val mv1: MyVerticle1 = new MyVerticle1(oc)
vertx.deployVerticle(mv1, depOptions)
eventBus.publish("callMessage", "")
...
class MyVerticle1(obj: OtherClass) extends ScalaVerticle {
override def start(): Unit = {
val eb = vertx.eventBus()
eb.consumer("callMessage",
(message: io.vertx.scala.core.eventbus.Message[String]) => {
obj.func()
})
}
但是,如果我尝试:
val depOptions: DeploymentOptions = DeploymentOptions().setWorker(true)
val oc: OtherClass = new OtherClass(...)
vertx.deployVerticle(s"scala:${classOf[MyVerticle2].getName}")
eventBus.publish("constructor.parameter", oc)
eventBus.publish("callMessage2", "")
我得到:异常或错误导致运行中止:类型:类没有消息编解码器
class MyVerticle2() extends ScalaVerticle {
var obj: OtherClass
override def start(): Unit = {
val eb = vertx.eventBus()
eb.consumer("constructor.parameter",
(message: io.vertx.scala.core.eventbus.Message[OtherClass]) => {
obj = message.body()
})
eb.consumer("callMessage2",
(message: io.vertx.scala.core.eventbus.Message[String]) => {
obj.func()
})
}
}