Java ResponseListener如何在snmp4j中工作

Java ResponseListener如何在snmp4j中工作,java,multithreading,asynchronous,snmp,snmp4j,Java,Multithreading,Asynchronous,Snmp,Snmp4j,我编写了一个简单的程序来了解snmp4j异步请求/响应的工作原理: TransportMapping transport = new DefaultUdpTransportMapping(); Snmp snmp = new Snmp(transport); transport.listen(); Address targetAddress = GenericAddress.parse("udp:192.168.1.116/161"); CommunityTarget target = new

我编写了一个简单的程序来了解snmp4j异步请求/响应的工作原理:

TransportMapping transport = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(transport);
transport.listen();

Address targetAddress = GenericAddress.parse("udp:192.168.1.116/161");
CommunityTarget target = new CommunityTarget();
target.setAddress(targetAddress);
target.setCommunity(new OctetString("nid"));
target.setRetries(0);
target.setTimeout(30000);
target.setVersion(SnmpConstants.version2c);

ResponseListener listener = new ResponseListener() {
    @Override
    public void onResponse(ResponseEvent event) {
        ((Snmp) event.getSource()).cancel(event.getRequest(), this);
        System.out.println("Received response PDU is: " + event.getResponse());
        System.out.println("response listener thread id: " + Thread.currentThread().getId());
        System.out.println("**********************************");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
};

System.out.println("main thread id: " + Thread.currentThread().getId());
for (int i = 0; i < 10; i++) {
    PDU pdu1 = new PDU();
    pdu1.add(new VariableBinding(new OID("1.3.6.1.4.1.22420.2.5.3.1.1.1")));
    pdu1.add(new VariableBinding(new OID("1.3.6.1.4.1.22420.2.5.3.1.1.2")));
    pdu1.setType(PDU.GET);
    snmp.send(pdu1, target, null, listener);
}

Thread.sleep(100000); 

输出显示多个线程ID。这意味着响应数据包是并行处理的。我说得对吗?两个线程id为9的响应返回
null
。有什么原因吗?在使用同步模型时,我不明白这一点。这是因为
Thread.sleep
内部
ResponseListener
。因此,如果我不能在
ResponseListener
内部执行阻塞工作,并且我想并行处理响应,那么我需要添加
ExecuterService

SNMP4j在内部使用线程池来处理消息。
ResponseListener
s的
onResponse()
是从那些线程调用的,您可以看到这些线程的线程ID。与同步模式不同,它是在您自己的线程中执行的

null
返回值表示超时完成。是的,我猜这是因为你在
应答器
中睡了5秒钟,这会阻塞一个消息接收线程

至于
ExecutorService
,最好将处理负载从SNMP4j消息线程转移到您自己的代码中,您可以在其中控制队列等。或者,您可以使用同步
列表
和计数
信号量
,以唤醒线程来处理接收到的消息

main thread id: 1
Received response PDU is: RESPONSE[requestID=205585942, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.22420.2.5.3.1.1.1 = 1; 1.3.6.1.4.1.22420.2.5.3.1.1.2 = 2]]
response listener thread id: 8
**********************************
Received response PDU is: RESPONSE[requestID=205585943, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.22420.2.5.3.1.1.1 = 1; 1.3.6.1.4.1.22420.2.5.3.1.1.2 = 2]]
response listener thread id: 8
**********************************
Received response PDU is: RESPONSE[requestID=205585944, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.22420.2.5.3.1.1.1 = 1; 1.3.6.1.4.1.22420.2.5.3.1.1.2 = 2]]
response listener thread id: 8
**********************************
Received response PDU is: RESPONSE[requestID=205585945, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.22420.2.5.3.1.1.1 = 1; 1.3.6.1.4.1.22420.2.5.3.1.1.2 = 2]]
response listener thread id: 8
**********************************
Received response PDU is: RESPONSE[requestID=205585946, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.22420.2.5.3.1.1.1 = 1; 1.3.6.1.4.1.22420.2.5.3.1.1.2 = 2]]
response listener thread id: 8
**********************************
Received response PDU is: RESPONSE[requestID=205585947, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.22420.2.5.3.1.1.1 = 1; 1.3.6.1.4.1.22420.2.5.3.1.1.2 = 2]]
response listener thread id: 8
**********************************
Received response PDU is: null
response listener thread id: 9
**********************************
Received response PDU is: RESPONSE[requestID=205585948, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.22420.2.5.3.1.1.1 = 1; 1.3.6.1.4.1.22420.2.5.3.1.1.2 = 2]]
response listener thread id: 8
**********************************
Received response PDU is: null
response listener thread id: 9
**********************************
Received response PDU is: RESPONSE[requestID=205585950, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.22420.2.5.3.1.1.1 = 1; 1.3.6.1.4.1.22420.2.5.3.1.1.2 = 2]]
response listener thread id: 8
**********************************