- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我编写了一个简单的程序来了解 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);
示例输出是这样的:
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
**********************************
输出显示多个线程 ID。这意味着响应数据包是并行处理的。我对吗?线程 ID 为 9 的两个响应返回 null
。有什么理由吗?使用同步模型时我不明白。这是因为 Thread.sleep
在 ResponseListener
里面吗。因此,如果我不能在 ResponseListener
中进行阻塞工作,并且我想并行处理响应,我需要添加 ExecuterService
?
最佳答案
SNMP4j 在内部使用线程池来处理消息。 ResponseListener
的 onResponse()
是从您看到的那些线程调用的。与同步模式不同,它是在您自己的线程中执行的。
null
返回值表示它已超时完成。是的,我猜这是因为您在 ResponseListener
中 hibernate 了 5 秒钟,这会阻塞消息接收线程之一。
对于 ExecutorService
,最好将处理负载从 SNMP4j 消息线程移到您自己的代码中,您可以在其中控制队列等。或者您可以使用同步的 List
和一个计数 Semaphore
,它将唤醒一个线程来处理接收到的消息。
关于java - ResponseListener 在 snmp4j 中的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26274031/
所以,我正在尝试在 androidstudio 中构建和应用程序,我想从 mysql 数据库中检索一些数据并在应用程序中使用它。我在线使用 php 脚本和 responselistener 来检索数据
我正在开发一个应用程序,它将在 MySQL 数据库中存储和读取数据。目前,我能够成功获取 1 行,但是当我尝试获取多行时,它不起作用。为了与我的db通信,我使用volley库。 这是迄今为止我的代码:
在我的开发环境中添加响应监听器后,我的 css 文件的内容类型从 text/css 切换为 text/html。我的目标只是为我的 symfony 应用程序的所有响应添加一些缓存 header 。 服
我想从 JSON 获取数据并在 asyncTask 中执行此操作。问题是 onPostExecute 在 doInBackground 之前执行。 这是我调用执行的 fragment : public
我编写了一个简单的程序来了解 snmp4j 异步请求/响应的工作原理: TransportMapping transport = new DefaultUdpTransportMapping(); S
我正在开发一个应用程序,它将存储到 MySQL 数据库并从中读取数据。目前,我能够成功获取 1 行,但是当我尝试获取 多行 时,它不起作用。当我尝试在 ResponseListener 中初始化 JS
我正在尝试使用我的 android 应用登录,但我对 php 和 mySQL 非常不熟悉,需要一些帮助。 我已经创建了寄存器,它成功地将我的用户数据上传到数据库中。尽管当我尝试调用 LoginRequ
我是 volley 和 android 的新手,我已经用 gradle 安装了 volley 并做了与官方教程相同的操作。但是没有响应,这意味着 Errorlistener 和 Responselis
我在 Mac 上的 MAMP PRO 设置上运行 Symfony 应用程序。在我的 symfony 应用程序中,我使用了一个包含以下函数的 ResponseListener: /** * Handl
我是一名优秀的程序员,十分优秀!