import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.PDUv1;
+import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
if (event == null) {
return;
}
+
+ if (event.getSource() instanceof Snmp) {
+ // Always cancel async request when response has been received
+ // otherwise a memory leak is created! Not canceling a request
+ // immediately can be useful when sending a request to a broadcast
+ // address (Comment is taken from the snmp4j API doc).
+ ((Snmp) event.getSource()).cancel(event.getRequest(), this);
+ }
+
PDU response = event.getResponse();
if (response == null) {
Exception e = event.getError();
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.StringType;
import org.snmp4j.PDU;
+import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.smi.Counter64;
import org.snmp4j.smi.Integer32;
thingHandler.onResponse(event);
verify(thingHandlerCallback, atLeast(1)).stateUpdated(eq(CHANNEL_UID), eq(new DecimalType("12.4")));
}
+
+ @Test
+ public void testCancelingAsyncRequest() {
+ setup(SnmpBindingConstants.CHANNEL_TYPE_UID_NUMBER, SnmpChannelMode.READ, SnmpDatatype.FLOAT);
+ PDU responsePDU = new PDU(PDU.RESPONSE,
+ Collections.singletonList(new VariableBinding(new OID(TEST_OID), new OctetString("12.4"))));
+
+ SnmpMock source = new SnmpMock();
+
+ ResponseEvent event = new ResponseEvent(source, null, null, responsePDU, null);
+
+ thingHandler.onResponse(event);
+ assertEquals(1, source.cancelCallCounter);
+ }
+
+ class SnmpMock extends Snmp {
+ public int cancelCallCounter = 0;
+
+ @Override
+ public void cancel(PDU request, org.snmp4j.event.ResponseListener listener) {
+ ++cancelCallCounter;
+ }
+ }
}