Запитвам 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