Я использую snmp4j, чтобы попытаться выполнить функции SNMP для удаленного агента. Из-за ряда ограничений, на которые мы не можем повлиять, мне нужно выполнить GETBULK
, чтобы получить большую таблицу за короткий промежуток времени.
Моя текущая реализация:
public Map<String, String> doGetBulk(@NotNull VariableBinding... vbs)
throws IOException {
Map<String, String> result = new HashMap<>();
Snmp snmp = null;
try {
// Create TransportMapping and Listen
TransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
PDU pdu = new PDU();
pdu.setType(PDU.GETBULK);
pdu.setMaxRepetitions(200);
pdu.setNonRepeaters(0);
pdu.addAll(vbs);
ResponseEvent responseEvent = snmp.send(pdu, this.target);
PDU response = responseEvent.getResponse();
// Process Agent Response
if (response != null) {
for(VariableBinding vb : response.getVariableBindings()) {
result.put("." + vb.getOid().toString(), vb.getVariable().toString());
}
} else {
LOG.error("Error: Agent Timeout... ");
}
} catch (NullPointerException ignore) {
// The variable table is null
} finally {
if (snmp != null) snmp.close();
}
return result;
}
Однако это всегда возвращает 100 результатов, когда я знаю, что их 5000+. Я знаю, что не могу превысить размер PDU, поэтому у меня проблема с усечением ответа на блоки по 100, но я не могу понять, как я могу получить дескриптор каскадного запроса для получения следующих 100 записей.