Я запрашиваю SNMP и хочу выполнить обратный вызов после завершения извлечения данных. Для этого я использую следующий код:
def treeWalk(rootOid: String)(callback: (Seq[Tuple2[OID, Variable]]) => Unit) {//{{{
val transport = new DefaultUdpTransportMapping
val snmp = new Snmp(transport)
transport.listen
val target = new CommunityTarget
target.setCommunity(new OctetString(community))
target.setAddress(GenericAddress.parse("udp:" + address + "/161"))
target.setRetries(retries)
target.setTimeout(timeout)
target.setVersion(SnmpConstants.version2c)
val treeUtil = new TreeUtils(snmp, new DefaultPDUFactory)
var variables: Seq[VariableBinding] = List()
var _isFinished = false
val listener = new TreeListener {
def next(event: TreeEvent) = {
println("NEXT")
val vars = event.getVariableBindings
if(vars != null)
variables ++= vars
true
}
def isFinished() = _isFinished
def finished(event: TreeEvent) {
val vars = event.getVariableBindings
println("DONE")
if(vars != null)
variables ++= vars
_isFinished = true
snmp.close
callback(variables.map(v => (v.getOid, v.getVariable)))
}
}
treeUtil.walk(target, Array(new OID(rootOid)), null, listener)
}
Я не получаю ошибок или исключений, однако я никогда не вижу строк печати в next () и finished (), а также обратный вызов не выполняется. Что я делаю не так, как мне подключить к нему прослушиватель событий?
PS: Однострочная синхронная версия просто отлично возвращает данные ...
Я использую Scala 2.11.6 и SNMP4J 2.3