Для установления соединения необходимы следующие объекты:
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();