7.3. .NET客户端编程模型

结构图略:和JMS编程模型的结构图类似

由于.NET环境并不能参与JNDI的上下文:

采用直接实例化的方式:

ConnectionFactory factory = ConnectionFactory.NewInstance(host, port);

也可以为当前生成的连接工厂起一个名字:

ConnectionFactory factory = ConnectionFactory.NewInstance(host, port, name);

为客户端和消息服务器建立的一个连接,他可以创建Session,并且可以创建多个Session(稍后介绍)。

获取方法:

使用匿名

Connection connection = factory.CreateConnection();

给出消息服务器的用户密码:

Connection connection = factory.CreateConnection(username, password);

当使用完连接的时候,你需要关闭连接,否则该连接会一直保持。关闭连接的时候它同时会关闭该连接产生的 Session 。

connection.close();

连接创建好后,一般先调用 start() 方法。

Sessions是单线程的,用来创建消息发送者和消息接受者的上下文。Sessions 同时还可以注册Message Listeners

获取方法:

Session session=connection.CreateSession(false,AcknowledgeMode.AutoAcknowledge);
Session session=connection.CreateSession(false,AcknowledgeMode.ClientAcknowledge);
Session session=connection.CreateSession(false,AcknowledgeMode.DupsOKAcknowledge);

三种应答模式的差别,请参照 AMQ 相关概念中的“应答模式”部分。

Destinations是指消息发送客户端的消息目标和消息接收客户端的消息来源,它是预先在jms.xml定义好的。

获取方式:

Destination dest = session.CreateQueue("testQueue");
Destination dest = session.CreateTopic("testTopic");
或者:
//通过下面这种方式创建出来的Queue,代表一个远程 AMQ 服务器上的队列,@符号之前
//是队列的名称,@符号之后是服务器路由名。发送消息到该队列时,会将消息路由到@符号之后
//指定的服务器,并将消息放进@符号之前指定的队列。
Destination dest = session.CreateQueue("testQueue@ServerRouterName");

message producer是由Session创建的一个对象,它是用来向 Destinations 发送信息的。

MessageProducer sender = session.CreateProducer(dest);

注意:

在.NET客户端中,必须在创建MessageProducer时指定Destinations ,不能在发送时再指定。

创建好后,可以继续创建消息,然后调用发送方法发送消息。

TextMessage message = session.CreateTextMessage(“test message”);
sender.send(message);

message consumer是指从 destination 接收消息的对象

MessageConsumer receiver = session.CreateConsumer(dest);

你还能使用 Session.CreateDurableSubscriber 创建一个持久的Topic注册对象。

它和普通的Topic注册对象的区别是不管当前是否在线,均能收到对应destination的全部信息。

String subName = "MySub";
MessageConsumer topicSubscriber = session.CreateDurableSubscriber(dest, subName); 

停止持久的Topic注册对象使用以下方法。

topicSubscriber.Close();

使用Consumer前应该先调用 connection.start() 方法。

connection.Start();
Message m = consumer.Receive(); 
//或者
connection.Start();
Message m = consumer.Receive(3000); // 3秒后超时

这是为异步调用设计的一种方式。

它是把消息监听器注册到consumer中。

receiver.MessageListener = new MessageListener(OnMessage);

private void OnMessage(Apusic.MQ.Message msg) {
    if (msg is TextMessage) {
        ctlReceivedMsg.AppendText(((TextMessage)msg).Text);
        ctlReceivedMsg.AppendText(" " + msg.GetStringProperty("JMSXRoutingTrack"));
        ctlReceivedMsg.AppendText("\r\n");
        msg.Acknowledge();
    }
}