如果类具有对象作为参数,如何创建scala verticle对象?

时间:2018-08-07 16:24:25

标签: scala vert.x

如果要部署一个顶点,我们不能使用对象引用(仅当它是一个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()
      })
  }
} 

0 个答案:

没有答案