要建立连接,需要以下对象:
IConnection
ISession
IDestination
IMessageConsumer // receiving messages
IMessageProducer // sending messages
我的情况是我必须连接到5个队列Consumer
和5个队列Producer
。经过大量阅读后,我得出结论IConnection
应该是单实例对象。但是我开始提问的地方是;我是否必须为每个队列连接创建新的ISession
个对象?或者这也可以是单个实例吗?
会话是用于发送和接收的单线程上下文 消息。
如果应用程序必须同时处理多个消息 线程,应用程序必须在每个线程上创建一个会话,然后 将该会话用于该线程内的任何发送或接收操作。
那么我们可以得出结论,每个队列连接必须有一个会话吗?换句话说,这意味着我必须创建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();