Sessioni JMS di lunga durata. Mantenere connessioni JMS / sessioni JMS è sempre una cattiva pratica?

StackOverflow https://stackoverflow.com/questions/274051

  •  07-07-2019
  •  | 
  •  

Domanda

Mantenere le connessioni / sessioni / consumer JMS sempre aperte è una cattiva pratica?

Esempio di bozza di codice:

// 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();

Qualche suggerimento per migliorare questo modello di utilizzo di JMS?

È stato utile?

Soluzione

Questa è una pratica molto comune e accettabile quando si tratta di connessioni di lunga durata. Per molti server JMS è infatti preferibile creare una nuova connessione ogni volta che è necessario.

Altri suggerimenti

D'accordo. Ecco alcuni buoni consigli su come utilizzare JMS in modo efficiente che include mantenere connessioni / sessioni / produttori / consumatori.

Potresti anche voler controllare la anche consigli sull'uso delle transazioni se sei interessato a massimizzare le prestazioni.

La scelta di mantenere la connessione / sessione / produttore / consumatore aperta a lungo o meno dovrebbe essere basata sulla frequenza con cui il produttore / consumatore invia / riceve messaggi.

Se un produttore invia o un consumatore riceve messaggi frequentemente, le connessioni / sessioni / produttore / consumatore dovrebbero essere mantenute aperte. D'altra parte se i messaggi di invio / ricezione sono poco frequenti, non è bene mantenere aperti questi oggetti JMS che consumeranno risorse di sistema come socket.

Nella nostra app, avremo connessioni / sessioni / consumatori / produttori aperti per mesi alla volta. Abbiamo dovuto collaborare con il nostro fornitore (BEA) per farlo funzionare in modo affidabile. Ma qualsiasi problema con questo è un bug che il fornitore deve risolvere.

Cordiali saluti, non è necessario chiudere le sessioni, i produttori e i consumatori di una connessione chiusa ( javax.jms.Connection ). Il codice seguente dovrebbe essere sufficiente per liberare le risorse:

try { 
        this.connection.close();
    } catch (JMSException e) {
        //
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top