斯卡拉的无尽等待

时间:2015-07-21 08:55:19

标签: java multithreading scala akka

如何在Scala中等待。如果发生任何事件,我有一个持续监听的监听器。 Listener将处理事件并需要监听,直到应用程序关闭。

在Java中,我通过实例化一个新线程,启动监听器并将其置于“等待”状态来实现这一点。

Object o = new Object();
synchronized(o) { o.wait(); }

但是当我在Scala中做同样的事情(创建一个线程并让它等待)时,Listener不接收并且不处理事件。

我们如何在Scala中实现这一目标?

我正在使用snmp4j来监听并处理陷阱给管理员。

代码段:

def listen() {
  synchronized {
    val address = new UdpAddress("127.0.0.1/2221")
    val transport: DefaultUdpTransportMapping = new efaultUdpTransportMapping()
    val msDispatcher: MessageDispatcher = new MessageDispatcherImpl
  msDispatcher.addMessageProcessingModel(new MPv2c)

    SecurityProtocols.getInstance.addDefaultProtocols()
    SecurityProtocols.getInstance.addPrivacyProtocol(new Priv3DES)

    val target = new CommunityTarget()
    target.setCommunity(new OctetString("public"))

    val snmp: Snmp = new Snmp(msDispatcher, transport)
    snmp.addCommandResponder(this)
    println(" listening on ..." + snmpDevice.host)
    transport.listen()
    this.wait(1000 * 60)
  }
}

override def processPdu(cmdRespEvent: CommandResponderEvent): Unit = {
  synchronized {
    println("inside process pdu")
    val pdu: PDU = cmdRespEvent.getPDU()
    if (pdu != null) {
      println(" Trap Type = " + pdu.getType())
      println(" Variable Bindings = " + pdu.getVariableBindings())
      // int pduType = pdu.getType()
      if (pdu != null && pdu.getType() == PDU.INFORM) {
        // procees the event
      }
    }
  }
}

2 个答案:

答案 0 :(得分:0)

也许使用snmp4j的包装器会有所帮助,看看这是否是一个选项:https://github.com/joescii/snmp4s

我的拙见是scala中的所有同步代码都不是解决问题的方法

答案 1 :(得分:0)

看看这两种方法:

  1. 重复检查一项任务,看看它是否已完成,然后在完成后继续执行下一个任务(阻止一些线程)。
  2. 第一个任务完成后触发一个事件,通知下一个任务完成(无阻塞)
  3. 数字1阻塞线程,而2阻止线程。这和我完成一项任务并告诉你在我完成任务时一样,我告诉你,当我完成你必须继续检查自己,或者我可以只要告诉你我什么时候完成,你就可以继续关注你所拥有的任何其他业务。

    但无论如何你不应该告诉听众等待,这将阻止正在收听事件的线程。但更好的是,由于我上面提到的原因,完全不这样做。而且我认为你应该小心,不要认为每个听众都是一个线程。这不是真的!因为代替侦听器检查事件,事件会像我所解释的那样通知侦听器。