2015-07-21 41 views
0

如何在斯卡拉等待。如果发生任何事件,我有一位正在收听的听众。 Listener将处理事件并需要监听,直到应用程序关闭。斯卡拉无尽的等待

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

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

但是,当我做同样的斯卡拉(创建一个线程,并把它在等待),该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 
     } 
    } 
    } 
} 
+1

您需要添加最少的代码示例,以显示您的问题,但没有很难知道为什么会出现此问题。 – Jackson

+0

'val o = new Object synchronized( o.wait() )''会工作相同。你需要显示更多的代码。 – Jatin

+0

我已经在java的listen方法中使用this.wait(),正在工作,如果发生任何事件,处理也。 但在斯卡拉同样没有回应 – kin

回答

0

也许使用的包装为SNMP4J会有所帮助,看看这将是一种选择:https://github.com/joescii/snmp4s

我的愚见是,Scala中所有的同步代码不是的方式去它

+0

是同步是坏的。我想继续听,直到应用程序shutdown.How在scala中实现这个? 我已经尝试过与未来和诺言。但机器人工作:( – kin

+0

我想尝试一下这个包装,看看它是否能够让你获得未来并使用回调,如果是的话,你会避免重新发明轮子的痛苦再一次 –

0

看看这2种方法:

  1. 重复检查任务是否完成,然后在完成后继续执行下一个任务(阻塞某个线程)。
  2. 一号任务完成触发该通知的下一个任务来完成(无粘连)

编号为1的阻塞线程,而2到事件之后不是。这与我完成一项任务并告诉你在完成任务时完成任务完全相同,当我完成时,我不会让你知道你必须不断检查自己,或者当我完成时我可以告诉你所以你可以继续进行其他业务。

但无论如何,你不应该告诉听众等待,这将停止正在监听事件的线程。但是,比这更好的是,根据我上面提到的理由,完全不这样做。我认为你应该小心,不要认为每个听众也是一个线索。这不是真的!因为不是侦听器检查事件,而是我按照我的解释通知侦听器。