我有一些SNMP4J的特殊行为,我无法解释。这很可能是由于我对snmp基础知识的误解。
我处理接收snmp陷阱的服务器。一切都很顺利。现在我需要更改陷阱来通知。 问题是我的服务器试图处理收到的消息两次。我发现了重复的INFORM消息。
试图解释......我已经将记录器启用到DEBUG级别。 当INFORM到达时,我在日志文件中看到来自 org.snmp4j.transport.DefaultUdpTransportMapping.ListenThread 类的两个相同记录,其中包含 run()方法中的以下代码:
if (logger.isDebugEnabled()) {
logger.debug("Received message from "+packet.getAddress()+"/"+
packet.getPort()+
" with length "+packet.getLength()+": "+
new OctetString(packet.getData(), 0,
packet.getLength()).toHexString());
}
此外,我还有一个实现接口 org.snmp4j.CommandResponder 的类。他的方法 void processPdu(CommandResponderEvent event)被调用两次以获取通知,一次调用一个陷阱。
@Override
public void processPdu(final CommandResponderEvent evt) {
final Address address = getAgentAddress(evt);
final PDU command = evt.getPDU();
boolean isInform = command.getType() == PDU.INFORM // this is true for both invocations of this method while receiving INFORM
}
有关版本的详细信息: snmp v2,snmp4j version 2.3.0
帮助我意识到:这里存在一些错误我应该通过command.getRequestID()来过滤 processPdu 方法的第二次调用,例如?
答案 0 :(得分:3)
接收方必须确认INFORM。
我认为问题在于,由于某种原因,发件人尚未收到此 INFORM REQUEST 的 RESPONSE PDU 。因此它会根据重试次数再次发送。确保将 RESPONSE PDU 发送给发件人以确认您已收到请求PDU(INFORM)。 API应该为您执行此操作。因此,请确保调用默认处理程序。