Waldemar Szostak created CXF-6454:
-------------------------------------
Summary: 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 registered in 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)