每个IMessageConsumer或IMessageProducer都应该有自己的ISession吗?

时间:2018-06-07 14:19:02

标签: c# jms ibm-mq xms

要建立连接,需要以下对象:

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

我的情况是我必须连接到5个队列Consumer和5个队列Producer。经过大量阅读后,我得出结论IConnection应该是单实例对象。但是我开始提问的地方是;我是否必须为每个队列连接创建新的ISession个对象?或者这也可以是单个实例吗?

来自IBM Documentation

  

会话是用于发送和接收的单线程上下文   消息。

     

如果应用程序必须同时处理多个消息   线程,应用程序必须在每个线程上创建一个会话,然后   将该会话用于该线程内的任何发送或接收操作。

那么我们可以得出结论,每个队列连接必须有一个会话吗?换句话说,这意味着我必须创建10个ISession,10个IDestination,5个IMessageConsumer和5个IMessageProducer个对象。我对吗?这里的最佳做法是什么?

我还在某处读过新的ISession创建将根据SHARECNV值建立新的TCP连接(如果为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();

0 个答案:

没有答案