Ссылки JMS Connection / ConnectionFactory с HornetQ - PullRequest
1 голос
/ 10 ноября 2011

Я работаю над более старым приложением и модернизирую его систему JMS с JBoss Messaging на HornetQ. В процессе я столкнулся с несколькими ошибками, которые, похоже, связаны с тем, как это приложение использует и управляет соединениями JMS. Это мое первое крупномасштабное знакомство с JMS (помимо простого использования игрушек), поэтому мне интересно, является ли текущая идиома ... правильной, глупой или совершенно неправильной?

Вот как работает текущая система.

static QueueConnection connection;
static boolean isConnected;

static void sendSomeMessage(Object sendMe) {
   if(!isConnected) connect();

}

static void connect() {
    // jndi lookup for connection factory
    connection = factory.createQueueConnection();

    // lambdas in java pseudo code, woot!
    connection.onException => disconnect();
    connection.start();
    isConnected = true;
}

static void disconnect() {
    connection.close()
    isConnected = false;
}

Суть этого заключается в том, что соединение используется снова и снова для каждого отдельного сообщения, которое отправляется до тех пор, пока не произойдет ошибка, и при возникновении ошибки соединение, наконец, закрывается и воссоздается.

Каждый пример, который я видел, всегда создает новую фабрику соединений и новое соединение для каждого сообщения, но эти примеры не являются крупными системными примерами, они являются примерами с практическими рекомендациями.

Является ли сохранение одной управляемой ссылки на JMS-соединение приемлемой идиомой, следует ли кэшировать фабрику соединений? Должны ли они быть воссозданы для каждого нового сообщения?

Имеет ли смысл повторно использовать фабрику соединений, но каждый раз использовать новое соединение?

1 Ответ

1 голос
/ 11 ноября 2011

Системы сообщений должны быть асинхронными ...

Итак, вы должны держать соединение открытым в течение всего срока службы вашего приложения.

JMS в настоящее время немного многословен для объектов, которые вы должны создать, поэтому вам нужно создать соединение и сеанс.

Итак, вы должны сделать это:

connection = cf.createConnection (...);

session = connection.createSession (...);

production = session.createProducer (...);

Сессия и продюсер всегда должны использоваться в потоке. Как сеанс представляет использование потока. (Вы можете повторно использовать его в нескольких потоках, если он синхронизирован)

...