[SNMP4J] How to detect timeout when visit tabular object

YiShi liysh at exavio.com.cn
Wed Sep 20 08:05:08 CEST 2006


Hello Frank

I am trying to detect timeout while visiting table by the following
code.
"check" method is invoked in "next(TableEvent event)" method.
I make the link down manually before it visit tablur object.But
TableEvent.getStatus() still return STATUS_OK but not STATUS_TIMEOUT. If
there is other methods for tablur visiting timeout check?

Thanks,
Leo

    /**
     * Check table operation result
     * @param event
     * @param task
     * @return
     */
    public boolean check(TableEvent event,ETask task){
        if (event.getStatus() != TableEvent.STATUS_OK){
        	String desc = "";
        	int ret = 0;
        	switch(event.getStatus()){
        	case TableEvent.STATUS_EXCEPTION:
        		desc = "An exception occured during table operation.";
        		ret = ETask.RET_TABLE_STATUS_EXCEPTION;
        		break;
        	case TableEvent.STATUS_WRONG_ORDER:
        		desc = "The agent failed to return the objects in
lexicographic order.";
        		ret = ETask.RET_TABLE_STATUS_WRONG_ORDER;
        		break;
        	case TableEvent.STATUS_TIMEOUT:
        		desc = "A request to the agent timed out.";
        		ret = ETask.RET_REQUEST_TIMEOUT;
        		break;
        	case TableEvent.STATUS_REPORT:
        		desc = "A report has been received from the agent.";
        		ret = ETask.RET_TABLE_STATUS_REPORT;
        		break;
        	}        	
        	task.setErrorDesc(desc);
        	task.setReturnCode(ret);
        	task.setResult(false);        	
        }else{
        	task.setResult(true);
        }
        return task.isResult();
    }

	//Deal with tablur object
	public int deal(TableListener listener) {
		int result = 0;
		TransportMapping transport = null;
		if (reference.getAddress() instanceof TcpAddress) {
			try {
				transport = new DefaultTcpTransportMapping();
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				result = ETask.RET_EXCEPTION;
				e.printStackTrace();				
			}
		} else {
			try {
				transport = new DefaultUdpTransportMapping();
			} catch (IOException e) {
				result = ETask.RET_EXCEPTION;
				e.printStackTrace();
			}
		} 
		Snmp snmp = new Snmp(transport);
		CommunityTarget communityTarget = new CommunityTarget();
		communityTarget.setCommunity(reference.getCommunity());
		communityTarget.setVersion(reference.getVersion());
		communityTarget.setAddress(reference.getAddress());
		communityTarget.setRetries(reference.getRetries());
		communityTarget.setTimeout(reference.getTimeout());
		this.target = communityTarget;
		try {
			snmp.listen();
		} catch (IOException e) {
			result = ETask.RET_EXCEPTION;
			e.printStackTrace();
		}
		TableUtils tableUtils = new TableUtils(snmp, this);
		Counter32 counter = new Counter32();
		OID[] columns = new OID[reference.getVbs().size()];
		for (int i = 0; i < columns.length; i++) {
			columns[i] = ((VariableBinding) reference.getVbs().get(i)).getOid();
		}

		synchronized (counter) {
			tableUtils.getTable(target,columns,listener,counter,reference
					.getLowerBoundIndex(),reference.getUpperBoundIndex());
try{
					counter.wait(reference.getTimeout());
			
				} catch (InterruptedException ex) {
					result = ETask.RET_EXCEPTION;
					ex.printStackTrace(); 
				}

		}
		try {
			snmp.close();
		} catch (IOException e1) {
			result = ETask.RET_EXCEPTION;
			e1.printStackTrace();
		}
		
		return result;
	}

// Class to visit table
public class DeviceTravel extends Message implements TableListener {
    private final static int NumberOfFields = 11;

    private InitTask task = null;

    private TableReference reference;

    private Table table;

    public DeviceTravel(InitTask task) {
        if (InitTask.GETALLMD == task.getDeviceType()) {
            this.task = task;
        }
    }

    public int parseMessage() {
        //common fields configuration
        reference = new TableReference();
        ReferenceConfigue.getInstance().getReference(reference, task,
                PDU.GETNEXT, SnmpConstants.version2c,
Message.VISITRETRIEDTIME,
                30000, null, null);
        ArrayList vbs;
        // 3, get necessary informations
        vbs = this.makeNecessaryVBs();
        reference.setVbs(vbs);
        table = new Table(reference);        
        return table.deal(this);
    }


    private ArrayList makeNecessaryVBs() {
        String entryOid = AppResource.getString("snmp.msg", new
Integer(task
                .getDeviceType()).toString());
        if (null == entryOid) {
            return null;
        }
        ArrayList vbs = new ArrayList();
        OID oid = new OID(entryOid);
        VariableBinding vb;
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".1"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".6"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".5"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".7"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".8"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".9"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".11"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".12"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".13"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".14"));
        vbs.add(vb);
        vb = new VariableBinding();
        vb.setOid(new OID(oid + ".15"));
        vbs.add(vb);
        return vbs;
    }

    public boolean next(TableEvent event) {
        if (check(event,task) == false){//Here is the check for
exception
        	return false;
        }
        Integer result;
        String sResult;
        int i = 0;
        ArrayList temp = new ArrayList();
        try {
            //0
            result = Util.toInteger(event.getColumns()[i++]);
            temp.add(result);
            //1
            result = Util.toInteger(event.getColumns()[i++]);
            temp.add(result);
            //System.out.println(result);
            //2
            result = Util.toInteger(event.getColumns()[i++]);
            temp.add(result);
            //System.out.println(result);
            //3
            sResult = Util.toStr(event.getColumns()[i++]);
            temp.add(sResult);
            //System.out.println(result);
            //4
            result = Util.toInteger(event.getColumns()[i++]);
            temp.add(result);
            //System.out.println(result);
            //5
            result = Util.toInteger(event.getColumns()[i++]);
            temp.add(result);
            //System.out.println(result);
            //6
            result = Util.toInteger(event.getColumns()[i++]);
            temp.add(result);
            //7
            result = Util.toInteger(event.getColumns()[i++]);
            temp.add(result);
            //8
            result = Util.counter2Integer(event.getColumns()[i++]);
            temp.add(result);
            //9

temp.add(Util.translateTextToOctArray(Util.toStr(event.getColumns()[i
++]), ";"));
            //10

temp.add(Util.translateTextToOctArray(Util.toStr(event.getColumns()[i
++]), ";"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        ((Counter32) event.getUserObject()).increment();
        task.getDeviceList().add(temp);
        return true;
    }

    public void finished(TableEvent event) {
        synchronized (event.getUserObject()) {
            event.getUserObject().notify();
        }
    }

}




More information about the SNMP4J mailing list