[SNMP4J] Does GETBULK for TableUtils.getTable() actually work?

Edgar Tavares Crespo edgar.crespo at gmail.com
Thu Jun 7 00:02:47 CEST 2007


Hi All:

I am attempting to use the snmp4j in a multi thread environment.
when I try to use the same Snmp class instance
to request a simple snmp value (like a scalar integer) and
in a another thread I try to use the tableUtils.getTable(...) function the
last getTable fails(timeout) and
from that moment on any other getTable that I perform using the
tableUtils.getTable(...)  function
I receive a timeout response.

I am using  1.7.1 version and I have already tried change to version
1.8.2and I observed the same behavior.

I am using a spring context to instantiate the Snmp class inside of my
SnmpStrategy.

That the code I am using.

public class SnmpStrategy implements IDataAcquirementStrategy {

    private Snmp snmp;

public void init() throws MibException {
        this.snmp = createSnmp();
    }

//Get Table Function
public Object[][] aquireTableData(AddressableEquipment equipment, String[]
tableOids) throws MibException {

        if ((tableOids == null) || (tableOids.length == 0)) {
            throw new IllegalArgumentException("The method aquireTableData
must receive at least one valid tableOid");
        }

        Target target = createTarget(equipment);
        OID[] snmpOids = new OID[tableOids.length];
        for (int i = 0; i < snmpOids.length; i++) {
            OID oid = new OID(tableOids[i]);
            snmpOids[i] = oid;
        }

        TableUtils tableUtils = new TableUtils(snmp, new
DefaultPDUFactory());

        List list = tableUtils.getTable(target, snmpOids, null, null);

        Object[][] result = new Object[list.size()][snmpOids.length + 1];

        int index = 0;
        for (Iterator iter = list.iterator(); iter.hasNext();) {
            TableEvent tableEvent = (TableEvent) iter.next();

            if (tableEvent != null && tableEvent.getStatus() ==
TableEvent.STATUS_OK) {

                result[index][0] = tableEvent.getIndex().toString();
                result[index][1] = new Object[tableOids.length];

                for (int i = 0; i < snmpOids.length; i++) {
                    VariableBinding var = tableEvent.getColumns()[i];
                    if (var != null)
                        ((Object[]) result[index][1])[i] = var.getVariable
();
                    else
                        ((Object[]) result[index][1])[i] = null;
                }

                index++;

            } else if (tableEvent.getStatus() == TableEvent.STATUS_TIMEOUT)
{
                throw new MibException("Timeout while executing snmp
aquireTableData for table oid=" + tableOids
                        + " and address=" + equipment.getAddress());
            }
        }

        return result;
}

//scalar get function
private PDU executeGet(AddressableEquipment equipment, String oid, int
protocolFlags) throws MibException {

        Target target = createTarget(equipment);

        // creating PDU
        PDU pdu = new PDU();
        pdu.add(new VariableBinding(new OID(oid)));

        if ((protocolFlags & SNMP_GET_NEXT) != 0) {
            pdu.setType(PDU.GETNEXT);
        } else {
            pdu.setType(PDU.GET);
        }

        // send the PDU
        ResponseEvent response = null;
        try {
            response = snmp.send(pdu, target);
        } catch (IOException e) {
            throw new MibException("Error executing snmp getData for oid=" +
oid + " and address=" + equipment.getAddress());
        }

        // extract the response PDU (could be null if timed out)
        PDU responsePDU = response.getResponse();

        if (responsePDU == null) {
            throw new MibException("Timeout while executing snmp getData for
oid=" + oid + " and address="
                    + equipment.getAddress());
        }

        return responsePDU;

    }


private Snmp createSnmp() throws MibException {

        Snmp snmp = null;

        try {

            TransportMapping transport = new DefaultUdpTransportMapping();
            snmp = new Snmp(transport);
            USM usm = new USM(SecurityProtocols.getInstance(), new
OctetString(MPv3.createLocalEngineID()), 0);
            SecurityModels.getInstance().addSecurityModel(usm);
            snmp.listen();

        } catch (IOException e) {
            throw new MibException("Snmp core service creation failed", e);
        }

        return snmp;
    }

Sameone having an ideia

Tanks in advance,

Edgar Crespo



More information about the SNMP4J mailing list