[SNMP4J] [bug report & qestion]Q:how toDelete a row using SET PDU
wei tong
thinkinrelativity at gmail.com
Thu Jul 2 03:41:48 CEST 2009
hi all,
first is one newbie question
and second a BUG report;
First a Question is how to delete a tabular data using a SET PDU?
it is googled that useing SET PDU to change the value to "invalid" will
effect,but i cant find what the "invalid" is.
Second i found something in DefaultUdpTransportMapping;
i wrote a testManager,here is some simple code about getting a scalar blow:
public String getSnmpScalar(String oid) {
this.listen();
PDU response = null;
try {
response = sendScopedPDU(setGetPDU(oid, "GET"));
if (response != null) {
if (response.size() > 0) {
VariableBinding vb = response.get(0);
System.out.println(vb.getVariable().toString());
this.close();
return vb.getVariable().toString();
} else {
System.out.println("no response");
}
}
} catch (IOException e) {
e.printStackTrace();
}
this.close();
return null;
}
public void listen() {
try {
System.out.println(Thread.currentThread().getName()+"manager listen is
starting....");
snmp.listen();
} catch (IOException e) {
e.printStackTrace();
}
}
public void close() {
try {
System.out.println(Thread.currentThread().getName()+"manager listen is
closeing....");
snmp.close();
System.out.println("-------------------------------------------------------");
} catch (IOException e) {
e.printStackTrace();
}
}
in the main
public static void main{
TestManager testManager = new TestManager();
testManager.init();
for (int i=0;i<100;i++){
testManager.getSnmpScalar(SnmpNC.snmpBaseDefaultID);
}
}
the console raised
-------------------------------------------------------
mainmanager listen is starting....
mainSend Message begin 1246496258471 millis
mainReceived response after 31 millis
11.36.221.1
mainmanager listen is closeing....
-------------------------------------------------------
mainmanager listen is starting....
mainSend Message begin 1246496258502 millis
Exception in thread "DefaultUDPTransportMapping_172.17.27.30/0"
java.lang.RuntimeException: java.net.SocketException: Socket is closed
at org.snmp4j.transport.DefaultUdpTransportMapping.setSocketTimeout(Unknown
Source)
at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(Unknown
Source)
at java.lang.Thread.run(Unknown Source)
at org.snmp4j.util.DefaultThreadFactory$WorkerThread.run(Unknown Source)
Caused by: java.net.SocketException: Socket is closed
~~~~~~~~~~~~~~~~~~~~~
at java.net.DatagramSocket.setSoTimeout(Unknown Source)
... 4 more
org.snmp4j.MessageException: Socket is closed
at org.snmp4j.MessageDispatcherImpl.sendPdu(Unknown Source)
at org.snmp4j.Snmp.sendMessage(Unknown Source)
at org.snmp4j.Snmp.send(Unknown Source)
at org.snmp4j.Snmp.send(Unknown Source)
at org.snmp4j.Snmp.send(Unknown Source)mainmanager listen is closeing....
at org.hfanms.snmp.TestManager.sendScopedPDU(TestManager.java:229)
at org.hfanms.snmp.TestManager.getSnmpScalar(TestManager.java:254)
at org.hfanms.snmp.TestManager.main(TestManager.java:736)
-------------------------------------------------------
mainmanager listen is starting....
mainSend Message begin 1246496258517 millis
mainmanager listen is closeing....
-------------------------------------------------------
mainmanager listen is starting....
org.snmp4j.MessageException: Socket is closed
at org.snmp4j.MessageDispatcherImpl.sendPdu(Unknown Source)
at org.snmp4j.Snmp.sendMessage(Unknown Source)
at org.snmp4j.Snmp.send(Unknown Source)
at org.snmp4j.Snmp.send(Unknown Source)
at org.snmp4j.Snmp.send(Unknown Source)
at org.hfanms.snmp.TestManager.sendScopedPDU(TestManager.java:229)
at org.hfanms.snmp.TestManager.getSnmpScalar(TestManager.java:254)
at org.hfanms.snmp.TestManager.main(TestManager.java:738)
Exception in thread "DefaultUDPTransportMapping_172.17.27.30/0"
java.lang.NullPointerException
at org.snmp4j.transport.DefaultUdpTransportMapping$ListenThread.run(Unknown
Source)
at java.lang.Thread.run(Unknown Source)
at org.snmp4j.util.DefaultThreadFactory$WorkerThread.run(Unknown Source)
-------------------------------------------------------
i think the problem is caused by DefaultUdpTransportMapping thread and the
"listen" tread ;
in DefaultUdpTransportMapping.java
public synchronized void listen() throws IOException {
if (listener != null) {
throw new SocketException("Port already listening");
}
ensureSocket();
listenerThread = new ListenThread();
listener = SNMP4JSettings.getThreadFactory().createWorkerThread(
"DefaultUDPTransportMapping_"+getAddress(), listenerThread, true);
listener.run();
}
in the "listen" thread
run()
synchronized (DefaultUdpTransportMapping.this) {
listener = null;
stop = true;
if (socket != null) {
socket.close();
}
}
i think it runs like blow:
TransportMapping.listen;
TransportMapping.listen;
listen1.run;
TransportMapping.close;
in the close section:
if (socketTimeout > 0) {
try {
l.join();
}
catch (InterruptedException ex) {
interrupted = true;
logger.warn(ex);
}
}
(socket closed here)
ERRORS shout here;
listen2.run;
listen1.stillrun;
TransportMapping1.close;
-------------------------------------------------------
heres 2 ways to avoid this:
1. use thread.yield();
for (int i=0;i<100;i++){
testManager.getSnmpScalar(SnmpNC.snmpBaseDefaultID);
thread.yield;
}
2. set a SocketTimeout when init a TransportMapping;
DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
//the defalut timeout is 0,i suggest to modify the value ?;
transport.setSocketTimeout(1000);
snmp = new Snmp(transport);
------------------------------------------------------
but i think it is real a bug,is it?
yours
More information about the SNMP4J
mailing list