Ссылки JMS Connection/ConnectionFactory с HornetQ

Я работаю над старым приложением и модернизирую его систему 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 ответ

Решение

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

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

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

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

connection = cf.createConnection (...);

session = connection.createSession (...);

продюсер = session.createProducer(...);

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

Другие вопросы по тегам