Должен ли каждый IMessageConsumer или IMessageProducer иметь свою собственную ISession? - PullRequest
0 голосов
/ 07 июня 2018

Для установления соединения необходимы следующие объекты:

IConnection
ISession
IDestination
IMessageConsumer // receiving messages
IMessageProducer // sending messages

В моем случае мне нужно подключиться к 5 очередям как Consumer и к 5 очередям как Producer.Прочитав много, я пришел к выводу, что IConnection должен быть объектом одного экземпляра.Но где я начинаю задавать вопросы;Нужно ли создавать новые ISession объекты для каждого соединения очереди?Или это тоже может быть один экземпляр?

Цитата из Документация IBM

Сеанс - это однопоточный контекст для отправки и получения сообщений.

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

Итак, можем ли мы сделать вывод, что для каждого соединения очереди должен быть сеанс?Другими словами, это означает, что мне нужно создать 10 ISession, 10 IDestination, 5 IMessageConsumer и 5 IMessageProducer объектов.Я прав?Что такое лучший метод здесь?

Я также где-то читал, что новое создание ISession создаст новое TCP-соединение в зависимости от значения SHARECNV (если 1, каждый сеанс является новым TCP-соединением).Так какой смысл использовать один экземпляр IConnection тогда?

PSEUDO CODE

Создать соединение

var factory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
var cf = factory.CreateConnectionFactory();
cf.SetStringProperty(XMSC.WMQ_HOST_NAME, host);
cf.SetIntProperty(XMSC.WMQ_PORT, port);
cf.SetStringProperty(XMSC.WMQ_CHANNEL, channel);
cf.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, qm);
cf.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT);
connection = cf.CreateConnection();

Сделайте это 5 раз для всех входящих сообщений

ISession session = connection.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
IDestination destination = session.CreateQueue(queuename);
IMessageConsumer consumer = session.CreateConsumer(destination);
consumer.MessageListener = listener;

Сделайте это 5 раз для всех исходящих сообщений

ISession session = connection.CreateSession(false, AcknowledgeMode.AutoAcknowledge);
IDestination destination = session.CreateQueue(queuename);
IMessageProducer producer = session.CreateProducer(destination);

Начать соединение

connection.Start();

Удалить соединение

producer?.Close(); //all producers
consumer?.Close(); //all consumers
destination?.Dispose(); //all destinations
session?.Dispose(); //all sessions
connection?.Close();
...