Ссылки 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(...);
Сеанс и продюсер всегда должны использоваться в потоке. Как сеанс представляет использование потока. (Вы можете использовать его в нескольких потоках, если он синхронизирован)