我有一些无法解释的 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());
}
我还有实现接口(interface) 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 版本 2.3.0
帮助我意识到:这里是否存在一些错误,例如我应该通过 command.getRequestID() 过滤 processPdu 方法的第二次调用?
最佳答案
INFORM 必须由接收方确认。
我认为问题是发件人出于某种原因没有收到此INFORM REQUEST 的RESPONSE PDU。所以它根据重试次数重新发送一次。请务必向发件人发送 RESPONSE PDU 以确认您已收到 REQUEST PDU (INFORM)。 API 应该会为您完成。因此,请务必调用默认处理程序。
关于java - 接收器正确处理 snmp INFORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29773389/