You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (JIRA)" <ji...@apache.org> on 2015/07/31 13:03:04 UTC

[jira] [Updated] (CAMEL-9035) unbind smpp connection bug

     [ https://issues.apache.org/jira/browse/CAMEL-9035?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Claus Ibsen updated CAMEL-9035:
-------------------------------
    Description: 
Suppose SMSC allowed one connection to client and due to any reason if session.unbindAndClose failed it will set session to null and dont retry to unbind. 

Connection/Session will remain open on SMSC till its TransactionTimeOut, mostly SMSc Admin set it to 5 to 10 mins. 

Following are snippet of org.apache.camel.component.smpp.SmppProducer and details are like 

1- if for any reason Camel try to unbind connection and it got failed below code print log and set session=null in both success/fail cases. 
2- After sending unbind it will try to reconnect. 
3- As SMSc allowed 1 connection which was not unbinded successfull it will not allowed second connection so reconnect will get failed. 
4- Camel call closesession on reconnection failure and will verify if session != null, as session is already null so this code will not send unbind again and apache camel will not able to get connection from SMSc until timeout happen on SMSc and this will results in 10 mins outage. 

If we change closeSession() like below 

current: 
{code}
private void  closeSession() { 
        if (session != null) { 
            session.removeSessionStateListener(this.internalSessionStateListener); 
            try { 
                Thread.sleep(1000); 
                session.unbindAndClose(); 
            } catch (Exception e) { 
              LOG.warn("Could not close session " + session); 
            } 

            session = null; 

        } 

    } 
{code}

Suggested: 
{code}
private void  closeSession() { 
        if (session != null) { 
            session.removeSessionStateListener(this.internalSessionStateListener); 
            try { 
                Thread.sleep(1000); 
                session.unbindAndClose(); 
                session = null; // if we put here then it will retry for unbind 
            } catch (Exception e) { 
              LOG.warn("Could not close session " + session); 
            } 
             session = null; // remove his line 
        } 
    } 
{code}

  was:
Suppose SMSC allowed one connection to client and due to any reason if session.unbindAndClose failed it will set session to null and dont retry to unbind. 

Connection/Session will remain open on SMSC till its TransactionTimeOut, mostly SMSc Admin set it to 5 to 10 mins. 

Following are snippet of org.apache.camel.component.smpp.SmppProducer and details are like 

1- if for any reason Camel try to unbind connection and it got failed below code print log and set session=null in both success/fail cases. 
2- After sending unbind it will try to reconnect. 
3- As SMSc allowed 1 connection which was not unbinded successfull it will not allowed second connection so reconnect will get failed. 
4- Camel call closesession on reconnection failure and will verify if session != null, as session is already null so this code will not send unbind again and apache camel will not able to get connection from SMSc until timeout happen on SMSc and this will results in 10 mins outage. 

If we change closeSession() like below 

current: 
private void  closeSession() { 
        if (session != null) { 
            session.removeSessionStateListener(this.internalSessionStateListener); 
            try { 
                Thread.sleep(1000); 
                session.unbindAndClose(); 
            } catch (Exception e) { 
              LOG.warn("Could not close session " + session); 
            } 

            session = null; 

        } 

    } 

Suggested: 

private void  closeSession() { 
        if (session != null) { 
            session.removeSessionStateListener(this.internalSessionStateListener); 
            try { 
                Thread.sleep(1000); 
                session.unbindAndClose(); 
                session = null; // if we put here then it will retry for unbind 
            } catch (Exception e) { 
              LOG.warn("Could not close session " + session); 
            } 
             session = null; // remove his line 
        } 
    } 


> unbind smpp connection bug 
> ---------------------------
>
>                 Key: CAMEL-9035
>                 URL: https://issues.apache.org/jira/browse/CAMEL-9035
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-smpp
>    Affects Versions: 2.14.0, 2.15.2
>            Reporter: imran raza khan
>              Labels: patch
>             Fix For: 2.15.2
>
>
> Suppose SMSC allowed one connection to client and due to any reason if session.unbindAndClose failed it will set session to null and dont retry to unbind. 
> Connection/Session will remain open on SMSC till its TransactionTimeOut, mostly SMSc Admin set it to 5 to 10 mins. 
> Following are snippet of org.apache.camel.component.smpp.SmppProducer and details are like 
> 1- if for any reason Camel try to unbind connection and it got failed below code print log and set session=null in both success/fail cases. 
> 2- After sending unbind it will try to reconnect. 
> 3- As SMSc allowed 1 connection which was not unbinded successfull it will not allowed second connection so reconnect will get failed. 
> 4- Camel call closesession on reconnection failure and will verify if session != null, as session is already null so this code will not send unbind again and apache camel will not able to get connection from SMSc until timeout happen on SMSc and this will results in 10 mins outage. 
> If we change closeSession() like below 
> current: 
> {code}
> private void  closeSession() { 
>         if (session != null) { 
>             session.removeSessionStateListener(this.internalSessionStateListener); 
>             try { 
>                 Thread.sleep(1000); 
>                 session.unbindAndClose(); 
>             } catch (Exception e) { 
>               LOG.warn("Could not close session " + session); 
>             } 
>             session = null; 
>         } 
>     } 
> {code}
> Suggested: 
> {code}
> private void  closeSession() { 
>         if (session != null) { 
>             session.removeSessionStateListener(this.internalSessionStateListener); 
>             try { 
>                 Thread.sleep(1000); 
>                 session.unbindAndClose(); 
>                 session = null; // if we put here then it will retry for unbind 
>             } catch (Exception e) { 
>               LOG.warn("Could not close session " + session); 
>             } 
>              session = null; // remove his line 
>         } 
>     } 
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)