Improved thread error handling. 73/20673/1
authorSteven Pisarski <s.pisarski@cablelabs.com>
Mon, 18 May 2015 21:29:17 +0000 (15:29 -0600)
committerSteven Pisarski <s.pisarski@cablelabs.com>
Mon, 18 May 2015 21:29:17 +0000 (15:29 -0600)
Change-Id: I5bcde1b086d3abbcbc13740e6979515e17b8781b
Signed-off-by: Steven Pisarski <s.pisarski@cablelabs.com>
packetcable-driver/src/main/java/org/umu/cops/prpep/COPSPepConnection.java

index 66455eb27b025a60b7a2c177230a5ddc4c9fb36a..af9645e65b47ef05617c8e0a789e283fb7460dd4 100644 (file)
@@ -60,57 +60,63 @@ public class COPSPepConnection extends COPSConnection {
         Date lastSendKa = new Date();
         Date lastSendAcc = new Date();
         Date lastRecKa = new Date();
-        try {
             while (!_sock.isClosed()) {
-                if (_sock.getInputStream().available() != 0) {
-                    processMessage(_sock);
-                    lastRecKa = new Date();
-                }
-
-                // Keep Alive
-                if (_kaTimer > 0) {
-                    // Timeout at PDP
-                    int _startTime = (int) (lastRecKa.getTime());
-                    int cTime = (int) (new Date().getTime());
-
-                    if ((cTime - _startTime) > _kaTimer*1000) {
-                        _sock.close();
-                        // Notify all Request State Managers
-                        notifyNoKAAllReqStateMan();
+                try {
+                    if (_sock.getInputStream().available() != 0) {
+                        processMessage(_sock);
+                        lastRecKa = new Date();
                     }
 
-                    // Send to PEP
-                    _startTime = (int) (lastSendKa.getTime());
-                    cTime = (int) (new Date().getTime());
-
-                    if ((cTime - _startTime) > ((_kaTimer*3/4) * 1000)) {
-                        final COPSKAMsg msg = new COPSKAMsg(null);
-                        COPSTransceiver.sendMsg(msg, _sock);
-                        lastSendKa = new Date();
+                    // Keep Alive
+                    if (_kaTimer > 0) {
+                        // Timeout at PDP
+                        int _startTime = (int) (lastRecKa.getTime());
+                        int cTime = (int) (new Date().getTime());
+
+                        if ((cTime - _startTime) > _kaTimer*1000) {
+                            _sock.close();
+                            // Notify all Request State Managers
+                            notifyNoKAAllReqStateMan();
+                        }
+
+                        // Send to PEP
+                        _startTime = (int) (lastSendKa.getTime());
+                        cTime = (int) (new Date().getTime());
+
+                        if ((cTime - _startTime) > ((_kaTimer*3/4) * 1000)) {
+                            final COPSKAMsg msg = new COPSKAMsg(null);
+                            COPSTransceiver.sendMsg(msg, _sock);
+                            lastSendKa = new Date();
+                        }
                     }
-                }
 
-                // Accounting
-                if (_acctTimer > 0) {
-                    int _startTime = (int) (lastSendAcc.getTime());
-                    int cTime = (int) (new Date().getTime());
+                    // Accounting
+                    if (_acctTimer > 0) {
+                        int _startTime = (int) (lastSendAcc.getTime());
+                        int cTime = (int) (new Date().getTime());
 
-                    if ((cTime - _startTime) > ((_acctTimer*3/4)*1000)) {
-                        // Notify all Request State Managers
-                        notifyAcctAllReqStateMan();
-                        lastSendAcc = new Date();
+                        if ((cTime - _startTime) > ((_acctTimer*3/4)*1000)) {
+                            // Notify all Request State Managers
+                            notifyAcctAllReqStateMan();
+                            lastSendAcc = new Date();
+                        }
                     }
-                }
 
-                try {
-                    Thread.sleep(500);
+                    try {
+                        Thread.sleep(500);
+                    } catch (InterruptedException e) {
+                        logger.error("Closing connection");
+                        break;
+                    } catch (Exception e) {
+                        logger.error("Unexpected exception while sleeping. Continue processing messages", e);
+                    }
                 } catch (Exception e) {
-                    logger.error("Exception thrown while sleeping", e);
+                    logger.error("Unexpected error while processing socket messages. Continue processing", e);
+                } catch (Throwable e) {
+                    logger.error("Unexpected fatal error while processing COPS messages. Stopping thread", e);
+                    break;
                 }
             }
-        } catch (Exception e) {
-            logger.error("Error while processing socket messages", e);
-        }
 
         // connection closed by server
         // COPSDebug.out(getClass().getName(),"Connection closed by server");