消息中间件ActiveMQ(3)--P2P实验

博学,切问,近思--詹子知 (https://jameszhan.github.io)


点对点方式是最为传统和常见的通讯方式,它支持一对一、一对多、多对多、多对一等多种配置方式,支持树状、网状等多种拓扑结构。 

按照JMS规范,发送消息的步骤如下:

1.从连接工厂中拿出Connecion对象。

2.和服务器建立连接(Connection.start())。

3.创建会话(Session)对象。

4.通过Session,在指定的Queue创建消息生产者(MessageProducer)。

5.使用Session创建消息。

6.使用消息生产者发送消息。    

接收消息的步骤如下: 

1.从连接工厂中拿出Connecion对象。

2.和服务器建立连接(Connection.start())。 

3.创建会话(Session)对象。

4.通过Session,在指定的Queue创建消息接受者(MessageConsumer)。

5.1.调用messageConsumer.receive方法接受消息,如果队列上有消息,则receive方法返回该消息对象,如果队列上无消息,则该方法阻塞。

5.2.也可以以为Session指定MessageListener对象的方式来接受消息,该方法的好处在于,一旦有新消息到来,会自动触发该对象的onMessage方法执行。 

下类描述了以5.1的方式接受消息。

下类描述了以5.2的方式接受消息。 消息队列的特点是:

1.可以多个生产者对同一个消息队列发送消息。

2.可以多个接受者监听同一个消息对列。

3.消息只能一次性被消费,一旦消息被Consumer1消费了,则Consumer2不可能再拿到这一消息,并且同时该消息被消息队列移除。

4.持久性存储,一旦消息没有被消费,消息会一直保留在消息队列中。 

利用消息队列的这一特点,我们可以实现简单的负载均衡,比如,我们可以部署几个相同的Service到不同的机器上,让他们监听同一个Queue,那么客户的请求到来后,消息中间件会动态分配其到某一个Service处理。 

上一篇文章,我们介绍了创建连接对象的不同方法,这里我们把这两种方式做一个包装:  
创建不同的生产者对同一队列发送消息。

创建不同的消费者监听同一对列。

 实验结果如下(事实上,不同的生产者生产的消息被那个消费者接收到是不确定的):如果你先执行发送消息的程序,在启动接受消息的程序,所有的消息都有可能被同一消费者消费,这是ActiveMQ为了提高效率,重用了同一个连接传输了所有的消息。其他的MQ产品未必会这么做,SnoicMQ它就会以一种随机的方式分发给不同的消费者。一旦你创建好消费者先监听消息队列,然后,再发送消息,由于这个时候,消费者与JMS Server之间的连接都已经建立,所以消息会随机的分发到不同的消费者。 

猜你喜欢

转载自blog.csdn.net/zhiqiangzhan/article/details/4730074