ActiveMQ 点对点(p2p)

来源:互联网 发布:医疗器械软件哪家好 编辑:程序博客网 时间:2024/05/15 14:03

p2p的过程则理解起来更加简单。它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在实际应用中因为有多个用户对使用p2p的链路,它的通信场景如下图所示:


我们再来看看一个p2p的示例:

    在p2p的场景里,相互通信的双方是通过一个类似于队列的方式来进行交流。和前面pub-sub的区别在于一个topic有一个发送者和多个接收者,而在p2p里一个queue只有一个发送者和一个接收者。


发送者


和前面的示例非常相似,我们构造函数里需要初始化的内容基本上差不多:

public Publisher() throws JMSException {      factory = new ActiveMQConnectionFactory(brokerURL);      connection = factory.createConnection();      connection.start();      session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);      producer = session.createProducer(null);  }  

发送消息的方法如下:


public void sendMessage() throws JMSException {    for(int i = 0; i < jobs.length; i++)    {       String job = jobs[i];       Destination destination = session.createQueue("JOBS." + job);       Message message = session.createObjectMessage(i);       System.out.println("Sending: id: " + ((ObjectMessage)message).getObject() + " on queue: " + destination);       producer.send(destination, message);    }}


这里我们定义了一个jobs的数组,通过遍历这个数组来创建不同的job queue。这样就相当于建立了多个点对点通信的链路。

 

    消息发送者的启动代码如下:

public static void main(String[] args) throws JMSException {    Publisher publisher = new Publisher();    for(int i = 0; i < 10; i++) {        publisher.sendMessage();        System.out.println("Published " + i + " job messages");try {            Thread.sleep(1000);        } catch (InterruptedException x) {    e.printStackTrace();        }    }    publisher.close();}


我们在这里发送10条消息,当然,在每个sendMessage的方法里实际上是针对每个queue发送了10条。


接收者

     接收者的代码很简单,一个构造函数初始化所有的资源:


public Consumer() throws JMSException {    factory = new ActiveMQConnectionFactory(brokerURL);    connection = factory.createConnection();        connection.start();        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);    }


 还有一个就是注册消息处理的对象:


public static void main(String[] args) throws JMSException {    Consumer consumer = new Consumer();    for (String job : consumer.jobs) {    Destination destination = consumer.getSession().createQueue("JOBS." + job);    MessageConsumer messageConsumer = consumer.getSession().createConsumer(destination);    messageConsumer.setMessageListener(new Listener(job));    }    }public Session getSession() {return session;}

具体注册的对象处理方法和前面还是类似,实现MessageListener接口就可以了。


import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.ObjectMessage;public class Listener implements MessageListener {private String job;public Listener(String job) {this.job = job;}public void onMessage(Message message) {try {//do something hereSystem.out.println(job + " id:" + ((ObjectMessage)message).getObject());} catch (Exception e) {e.printStackTrace();}}}

这里代码和前面pub-sub的具体实现代码非常相似,就不再赘述。

 

     现在如果我们比较一下pub-sub和p2p模式的具体实现步骤的话,我们会发现他们基本的处理流程都是类似的,除了在pub-sub中要通过createTopic来设置topic,而在p2p中要通过createQueue来创建通信队列。他们之间存在着很多的重复之处,在具体的开发过程中,我们是否可以进行一些工程上的优化呢?别急,后面我们会讨论到的。





1 0
原创粉丝点击