[ https://issues.apache.org/jira/browse/CXF-6454?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15251582#comment-15251582 ]
Christian Schneider commented on CXF-6454: ------------------------------------------ Why is the endless loop a problem? The case why I created this was to support reconnects if the jms server is down. Imagine that for some reason the jms servers are down for some hours. If you set max reconnect attempts then you application will fail permanently after these attempts. I agree though that we must detect the case of a clientId that is already taken and that we must avoid having active connections hanging around. So I think the first approach is good. Additionally I think it makes sense to be able to set the reconnect delay. For example to avoid spamming the server or your own log. > Orphaned JMS connections created in endless loop > ------------------------------------------------ > > Key: CXF-6454 > URL: https://issues.apache.org/jira/browse/CXF-6454 > Project: CXF > Issue Type: Bug > Components: JMS, Transports > Affects Versions: 3.0.5 > Reporter: Waldemar Szostak > Priority: Critical > > h3. Problem description > In JMSFactory.createConnection(JMSConfiguration): > {code}public static Connection createConnection(JMSConfiguration jmsConfig) > throws JMSException { > String username = jmsConfig.getUserName(); > ConnectionFactory cf = jmsConfig.getConnectionFactory(); > Connection connection = username != null > ? cf.createConnection(username, jmsConfig.getPassword()) > : cf.createConnection(); > if (jmsConfig.getDurableSubscriptionClientId() != null) { > > connection.setClientID(jmsConfig.getDurableSubscriptionClientId()); > } > return connection; > }{code} > there is no exception handling if the clientID fails to be set. Such an > exception would exit this method without passing the reference to the > just-opened JMS connection to exception handling code > (JMSDestination.createTargetDestinationListener()). > Moreover, JMSDestination.restartConnection() keeps on starting new > connections (there is no max attempt restriction!) until it creates one > without an exception thrown in the process. > Now, if the clientID is already connected to the ESB, this creation of new > connection will last until server resources are no longer available to the > JVM. > h3. Possible solution > # Close the connection if it's not possible to set the specified clientID at > the time: > {code}public static Connection createConnection(JMSConfiguration jmsConfig) > throws JMSException { > String username = jmsConfig.getUserName(); > ConnectionFactory cf = jmsConfig.getConnectionFactory(); > Connection connection = username != null > ? cf.createConnection(username, > jmsConfig.getPassword()) > : cf.createConnection(); > if (jmsConfig.getDurableSubscriptionClientId() != null) { > try { > connection.setClientID(jmsConfig.getDurableSubscriptionClientId()); > } catch (InvalidClientIDException e) { > connection.close(); > throw e; > } > } > return connection; > }{code} > # Add a setting to restrict the maximum attempts to restart the connection in > JMSDestination.restartConnection() A configurable value would be best, but > even a hardcoded.. anything but the practically endless loop ;-) -- This message was sent by Atlassian JIRA (v6.3.4#6332)