最近在研究SNMP协议.也下载了SNMP4J源码看了一遍.对SNMP4J的基本操作包括GET/SET/GETNEST等有了较为熟悉的运用.
但是对SNMP4J提供的异步操作,我始终不明白.
按照JAVA DOC上提供的代码,要异步发送SNMP消息,就需要实现ResponseListener监听器.该监听器意味着当有response返回的时候,就会执行onResponse()方法:
ResponseListener listener = new ResponseListener(){
public void onResponse(ResponseEvent event){
( (Snmp)event.getSource()).cancel(event.getRequest(),this);
System.out.println("response: "+event.getResponse());
}
};
接着发送GETNEXT命令:
snmp.getNext(pdu, target, null, listener);
snmp.close();
但是结果是null.我使用抓包工具Wireshark抓包的时候却显示有response返回!
那为什么onResponse()打印不出来呢?
后来我参考了org.snmp4j.tools.console下的SnmpRequest.java中的table()方法.
在上面的代码外包一层synchronized,如:
synchronized(this){
ResponseListener listener = new ResponseListener(){
public void onResponse(ResponseEvent event){
( (Snmp)event.getSource()).cancel(
event.getRequest(),this);
System.out.println("response: "+event.getResponse());
}
};
snmp.getNext(pdu, target, null, listener);
this.wait(5);
}
snmp.close();
之后再运行,可以抓到包,ResponseEvent也接收到了数据.
加了synchronized之后,代码就表明了每次发送request之后,我就需要等待一段时间;才能发送下一条request.这样的异步和我直接使用同步即"
发送request--等待respose"模式有什么差异呢?为什么还要等待?
渴望高人指点,欢迎各同仁讨论.非常感谢!