如何在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
}
}
}
}
答案 0 :(得分:0)
也许使用snmp4j的包装器会有所帮助,看看这是否是一个选项:https://github.com/joescii/snmp4s
我的拙见是scala中的所有同步代码都不是解决问题的方法
答案 1 :(得分:0)
看看这两种方法:
数字1阻塞线程,而2阻止线程。这和我完成一项任务并告诉你在我完成任务时一样,我告诉你,当我完成你必须继续检查自己,或者我可以只要告诉你我什么时候完成,你就可以继续关注你所拥有的任何其他业务。
但无论如何你不应该告诉听众等待,这将阻止正在收听事件的线程。但更好的是,由于我上面提到的原因,完全不这样做。而且我认为你应该小心,不要认为每个听众都是一个线程。这不是真的!因为代替侦听器检查事件,事件会像我所解释的那样通知侦听器。