📄 snmpsession.java
字号:
public void run() { myThread = Thread.currentThread(); myThread.setPriority(Thread.NORM_PRIORITY); SnmpInformRequest reqc = null; while (myThread != null) { try { reqc = nextResponse(); if (reqc != null) { processResponse(reqc); } } catch (ThreadDeath d) { myThread = null; if (isDebugOn()) { debug("run", "Session thread unexpectedly shutting down"); } throw d ; } } if (isTraceOn()) { trace("run", "Session thread shutting down"); } myThread = null ; } private void processResponse(SnmpInformRequest reqc) { while (reqc != null && myThread != null) { try { if (reqc != null) { if (isTraceOn()) { trace("processResponse", "Processing response to req = " + reqc.getRequestId()); } reqc.processResponse() ; // Handles out of memory. reqc = null ; // finished processing. } } catch (Exception e) { if (isDebugOn()) { debug("processResponse", e); } reqc = null ; } catch (OutOfMemoryError ome) { if (isDebugOn()) { debug("processResponse", "Out of memory error in session thread"); debug("processResponse", ome); } Thread.currentThread().yield(); continue ; // re-process the request. } } } // HANDLING INFORM REQUESTS LIST AND INFORM RESPONSES LIST //-------------------------------------------------------- /** * Adds an inform request. * @param snmpreq The inform request to add. * @exception SnmpStatusException SNMP adaptor is not ONLINE or session is dead. */ synchronized void addInformRequest(SnmpInformRequest snmpreq) throws SnmpStatusException { // If the adaptor is not ONLINE, stop adding requests. // if (!isSessionActive()) { throw new SnmpStatusException("SNMP adaptor is not ONLINE or session is dead...") ; } informRequestList.put(snmpreq, snmpreq); } /** * Deletes an inform request. * @param snmpreq The inform request to delete. */ synchronized void removeInformRequest(SnmpInformRequest snmpreq) { // deleteRequest can be called from destroySnmpSession. //In such a case remove is done in cancelAllRequest method. if(!isBeingCancelled) informRequestList.remove(snmpreq) ; if (syncInformReq != null && syncInformReq == snmpreq) { resetSyncMode() ; } } /** * Cancels all pending inform requests in this session. */ private void cancelAllRequests() { final SnmpInformRequest[] list; synchronized(this) { if (informRequestList.isEmpty()) { return ; } isBeingCancelled = true; list = new SnmpInformRequest[informRequestList.size()]; java.util.Iterator it = informRequestList.values().iterator(); int i = 0; while(it.hasNext()) { SnmpInformRequest req = (SnmpInformRequest)it.next(); list[i++] = req; it.remove(); } informRequestList.clear(); } for(int i = 0; i < list.length; i++) list[i].cancelRequest(); } /** * Adds the inform request object which received a response to an inform request * generated by the session. This is added to a private store, which * will be eventually picked up by the dispatcher for processing. * @param reqc The inform request that received the response from the manager. */ void addResponse(SnmpInformRequest reqc) { SnmpInformRequest snmpreq = (SnmpInformRequest) reqc ; if (isSessionActive()) { synchronized(this) { informRespq.push(reqc) ; this.notifyAll() ; } } else { if (isDebugOn()) { debug("addResponse", "Adaptor not ONLINE or session thread dead. So inform response is dropped..." + reqc.getRequestId()); } } return ; } private synchronized SnmpInformRequest nextResponse() { if (informRespq.isEmpty()) { try { if (isTraceOn()) { trace("nextResponse", "Blocking for response"); } this.wait(); } catch(InterruptedException e) { } } if (informRespq.isEmpty()) return null; SnmpInformRequest reqc = (SnmpInformRequest) informRespq.firstElement(); informRespq.removeElementAt(0) ; return reqc ; } private synchronized void cancelAllResponses() { if (informRespq != null) { syncInformReq = null ; informRespq.removeAllElements() ; this.notifyAll() ; } } /** * Destroys any pending inform requests and then stops the session. * The session will not be usable after this method returns. */ final void destroySession() { cancelAllRequests() ; cancelAllResponses() ; synchronized(this) { informSocket.close() ; informSocket = null ; } snmpQman.stopQThreads() ; snmpQman = null ; killSessionThread() ; } /** * Make sure you are killing the thread when it is active. Instead * prepare for a graceful exit. */ private synchronized void killSessionThread() { if ((myThread != null) && (myThread.isAlive())) { if (isTraceOn()) { trace("killSessionThread", "Destroying session"); } if (!thisSessionContext()) { myThread = null ; this.notifyAll() ; } else myThread = null ; } } /** * Finalizer of the <CODE>SnmpSession</CODE> objects. * This method is called by the garbage collector on an object * when garbage collection determines that there are no more references to the object. * <P>Removes all the requests for this SNMP session, closes the socket and * sets all the references to the <CODE>SnmpSession</CODE> object to <CODE>null</CODE>. */ public void finalize() { if (informRespq != null) informRespq.removeAllElements() ; informRespq = null ; if (informSocket != null) informSocket.close() ; informSocket = null ; if (isTraceOn()) { trace("finalize", "Shutting all servers"); } snmpQman = null ; } // TRACES & DEBUG //--------------- boolean isTraceOn() { return Trace.isSelected(Trace.LEVEL_TRACE, Trace.INFO_ADAPTOR_SNMP); } void trace(String clz, String func, String info) { Trace.send(Trace.LEVEL_TRACE, Trace.INFO_ADAPTOR_SNMP, clz, func, info); } void trace(String func, String info) { trace(dbgTag, func, info); } boolean isDebugOn() { return Trace.isSelected(Trace.LEVEL_DEBUG, Trace.INFO_ADAPTOR_SNMP); } void debug(String clz, String func, String info) { Trace.send(Trace.LEVEL_DEBUG, Trace.INFO_ADAPTOR_SNMP, clz, func, info); } void debug(String clz, String func, Throwable exception) { Trace.send(Trace.LEVEL_DEBUG, Trace.INFO_ADAPTOR_SNMP, clz, func, exception); } void debug(String func, String info) { debug(dbgTag, func, info); } void debug(String func, Throwable exception) { debug(dbgTag, func, exception); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -