10

Is keeping JMS connections / sessions / consumer always open a bad practice?

Code draft example:

// app startup code

ConnectionFactory cf = (ConnectionFactory)jndiContext.lookup(CF_JNDI_NAME);
Connection connection = cf.createConnection(user,pass);
Session session = connection.createSession(true,Session.TRANSACTIONAL);
MessageConsumer consumer = session.createConsumer(new Queue(queueName));
consumer.setMessageListener(new MyListener()); 
connection.start();
connection.setExceptionListener(new MyExceptionHandler()); // handle connection error


// ... Message are processed on MyListener asynchronously ...


// app shutdown code

consumer.close();
session.close();
connection.close();

Any suggestions to improve this pattern of JMS usage?

Chin
  • 19,717
  • 37
  • 107
  • 164
João
  • 2,296
  • 5
  • 20
  • 30

5 Answers5

9

Agreed. Here are some good tips on how to use JMS efficiently which includes keeping around connections/sessions/producers/consumers.

You might also want to check the recommendation on using transactions too if you are interested in maximising performance.

James Strachan
  • 9,168
  • 34
  • 31
6

That is a very common and acceptable practice when dealing with long lived connections. For many JMS servers it is in fact preferable to creating a new connection each time it is needed.

John Meagher
  • 22,808
  • 14
  • 54
  • 57
5

The choice of keeping connection/session/producer/consumer open for long or not should be based on the frequency at which producer/consumer sends/receives messages.

If a producer sends or a consumer receives messages frequently then the connections/sessions/producer/consumer should be kept open. On the other hand if messages send/receive is infrequent then it is not good keeping these JMS objects open will consume system resources like sockets.

Shashi
  • 14,980
  • 2
  • 33
  • 52
4

In our app, we will have connections/sessions/consumers/producers open for months at a time. We've had to work with our vendor (BEA) to make that work reliably. But any troubles with that is a bug the vendor needs to fix.

John M
  • 13,053
  • 3
  • 27
  • 26
2

FYI, there is no need to close the sessions, producers, and consumers of a closed connection( javax.jms.Connection ). The code below should be enough to release the resources:

try { 
        this.connection.close();
    } catch (JMSException e) {
        //
    }
eparvan
  • 1,639
  • 1
  • 15
  • 26