[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