[SNMP4J] SNMP.close() not working for UdpTransport

Frank Fock fock at agentpp.com
Wed Aug 15 20:17:24 CEST 2007


Hi Adam,

You need to extend DefaultUDPTransportMapping to
set the socket option "setReuseAddress(true);"
before calling Snmp.listen(). Alternatively,
you can (should) change your design to avoid
repetitive socket creation.

Best regards,
Frank

Adam Brons wrote:
> I'm wondering if anyone has had a problem with releasing UPD resources 
> when calling a Snmp.close().
> 
> I'm attempting to listen to both UDP and TCP port 162 on IP 0.0.0.0.  When 
> I call Snmp.close() the TCP resources are immediately returned, however 
> even after 65 seconds the UDP resources are still held.  Once the 
> application exists and the JVM stops, the resources are released. 
> Unfortunately, I need to be able to "restart" the listening on the TCP and 
> UDP ports via user intervention.  Also it should be noted that I'm created 
> a new Snmp object for each start.  I'm using version 1.8.1 of the SNMP4J 
> API.
> 
> Here are some code snippets:
> 
> Constructor: 
>         protected SNMPListener(SnmpConduitVariables variables, String 
> conduitType) throws UnknownHostException { 
>                 this.variables = variables;
>                 this.conduitType = conduitType;
>  
>                 if (variables != null && variables.getUsers() != null) {
>                         configSnmpUsers(variables.getUsers());
>                 }
>  
>                 // Create a thread pool to handle inbound SNMP events
>                 threadPool = ThreadPool.create("SNMPConduit", 
> DISPATHER_THREAD_NUMBER);
>                 mtDispatcher = 
>                         new MultiThreadedMessageDispatcher(threadPool, new 
> MessageDispatcherImpl());
>  
>                 // Add the SNMP versions we wish to monitor for
>                 mtDispatcher.addMessageProcessingModel(new MPv1());
>                 mtDispatcher.addMessageProcessingModel(new MPv2c());
>                 mtDispatcher.addMessageProcessingModel(new MPv3());
>  
>                 // Setup Authentication and Encryption protocols for 
> SNMPv3
>                 SecurityProtocols.getInstance().addDefaultProtocols();
>  
>                 /*
>                  * Builds the User Based Security Model up containing all 
> supported security
>                  * protocols, and setting a default engineID.
>                  * 
>                  * MPv3.createLocalEngineID might be something we allow 
> the user to specify as part of the 
>                  * Sensor or Conduit configuration.
>                  */
>             usm = new USM(SecurityProtocols.getInstance(),
>               new OctetString(MPv3.createLocalEngineID()), 0);
>             SecurityModels.getInstance().addSecurityModel(usm);
> 
> 
> Listen Method:
>         public synchronized void listen() throws IOException, 
> UnknownHostException {
>                 if (variables == null) {
>                         logger.error("No bind address or bind port were 
> specificed");
>                         throw new 
> UnknownHostException("SnmpConduitVariables is null therefore no bind 
> address and port can be determined");
>                 }
>  
>                 // Create Snmp4j Processor using our supplied 
> MessageProcessingModel
>                 snmp = new Snmp(mtDispatcher);
>  
>                 // Make a tcp and udp based address for listening
>                 UdpAddress udpAddr = new 
> UdpAddress(variables.getBindAddress() + "/" + variables.getBindPort());
>                 TcpAddress tcpAddr = new 
> TcpAddress(variables.getBindAddress() + "/" + variables.getBindPort());
>                 SNMPEventDispatcher dispatcher = new 
> SNMPEventDispatcher(variables, conduitType);
>  
>                 // Add transport mapping and command handler to Snmp 
> Engine
>                 if (snmp.addNotificationListener(udpAddr, dispatcher) &&
>                         snmp.addNotificationListener(tcpAddr, dispatcher)) 
> {
>  
>                         // Start listening
>                         snmp.listen();
>                         logger.info("SNMP Conduit Listening on 
> UDP:"+udpAddr.toString()+"...");
>                         logger.info("SNMP Conduit Listening on 
> TCP:"+tcpAddr.toString()+"...");
>  
>                         // Just wait for something to happen.
>                         try { 
>                                 synchronized (mutex) {
>                                         if (logger.isDebugEnabled()) 
> logger.debug("SnmpListener '"+variables.getBindAddress()+"' Waiting...");
>                                         mutex.wait();
>                                 }
>                         }
>                     catch (InterruptedException ex) {
>                         if (logger.isDebugEnabled()) {
>                                 logger.debug("SNMPConduit Caught 
> Interrupted Exception: ", ex);
>                         }
>                     } 
>                 } else {
>                         logger.error("Unable to bind using 
> address("+udpAddr.toString()+")");
>                         throw new IOException("Unable to bind using 
> address("+udpAddr.toString()+")");
>                 }
>         }
> 
> Close Method:
>         protected void close() {
>                 synchronized (mutex) {
>                         if (logger.isDebugEnabled()) 
> logger.debug("SnmpListener '"+variables.getBindAddress()+"' stopping...");
>                         mutex.notify();
>                         try {
>                                 snmp.close();
>                                 mutex.wait(65000);
>                                 if (logger.isDebugEnabled()) 
> logger.debug("SnmpListener: '"+variables.getBindAddress()+"' has closed");
>                         }
>                         catch(IOException ioe) {}
>                         catch(InterruptedException ie) {}
>                 }
>         }
> 
> Adam Brons
> TSOM Software Engineer
> IBM Tivoli Software
> (404) 591-8246 office
> _______________________________________________
> SNMP4J mailing list
> SNMP4J at agentpp.org
> http://lists.agentpp.org/mailman/listinfo/snmp4j

-- 
AGENT++
http://www.agentpp.com
http://www.mibexplorer.com
http://www.mibdesigner.com




More information about the SNMP4J mailing list