Activemq

来源:互联网 发布:java gbk转utf8 编辑:程序博客网 时间:2024/05/01 08:32

一,publish-subscribe 发布-订阅

publisher

1,

public Publisher() throws JMSException {          factory = new ActiveMQConnectionFactory(brokerURL);          connection = factory.createConnection();          try {          connection.start();          } catch (JMSException jmse) {              connection.close();              throw jmse;          }          session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);          producer = session.createProducer(null);      }  protected void setTopics(String[] stocks) throws JMSException {      destinations = new Destination[stocks.length];      for(int i = 0; i < stocks.length; i++) {          destinations[i] = session.createTopic("STOCKS." + stocks[i]);      }  }  protected void sendMessage(String[] stocks) throws JMSException {      for(int i = 0; i < stocks.length; i++) {          Message message = createStockMessage(stocks[i], session);          System.out.println("Sending: " + ((ActiveMQMapMessage)message).getContentMap() + " on destination: " + destinations[i]);          producer.send(destinations[i], message);      }  }  protected Message createStockMessage(String stock, Session session) throws JMSException {      MapMessage message = session.createMapMessage();      message.setString("stock", stock);      message.setDouble("price", 1.00);      message.setDouble("offer", 0.01);      message.setBoolean("up", true);      return message;  }  

测试主类:

public static void main(String[] args) throws JMSException {      if(args.length < 1)          throw new IllegalArgumentException();          // Create publisher               Publisher publisher = new Publisher();          // Set topics      publisher.setTopics(args);      for(int i = 0; i < 10; i++) {          publisher.sendMessage(args);          System.out.println("Publisher '" + i + " price messages");          try {              Thread.sleep(1000);          } catch(InterruptedException e) {              e.printStackTrace();          }      }      // Close all resources      publisher.close();  }  public void close() throws JMSException {      if (connection != null) {          connection.close();       }  }  

consumer

  1. 初始化资源;
  2. 接收消息;
  3. 必要的时候关闭资源;
    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 stock : args) {      Destination destination = consumer.getSession().createTopic("STOCKS." + stock);      MessageConsumer messageConsumer = consumer.getSession().createConsumer(destination);      messageConsumer.setMessageListener(new Listener());          }      }      public Session getSession() {          return session;      }     public class Listener implements MessageListener {      public void onMessage(Message message) {          try {              MapMessage map = (MapMessage)message;              String stock = map.getString("stock");              double price = map.getDouble("price");              double offer = map.getDouble("offer");              boolean up = map.getBoolean("up");              DecimalFormat df = new DecimalFormat( "#,###,###,##0.00" );              System.out.println(stock + "\t" + df.format(price) + "\t" + df.format(offer) + "\t" + (up?"up":"down"));          } catch (Exception e) {              e.printStackTrace();          }      }  } 

接收和处理消息的方法有两种: 分为同步和异步的;

  1. 一般同步的方式我们是通过MessageConsumer.receive()方法来处理接收到的消息;
  2. 异步的方法则是通过注册一个MessageListener的方法,使用MessageConsumer.setMessageListener();

总结:通过实现前面的publisher和consumer我们已经实现了pub-sub模式的一个实例;

  1. 主要就是要两者设定一个共同的topic,有了这个topic之后他们可以实现一方发消息另外一方接收;
  2. 另外,为了连接到具体的message server,这里是使用了连接tcp://localhost:16161作为定义ActiveMQConnectionFactory的路径;
  3. 在publisher端通过session创建producer;
  4. 根据指定的参数创建destination,然后将消息和destination作为producer.send()方法的参数发消息;
  5. 在consumer端也要创建类似的connection, session。通过session得到destination,再通过session.createConsumer(destination)来得到一个MessageConsumer对象;
  6. 有了这个MessageConsumer我们就可以自行选择是直接同步的receive消息还是注册listener了;

二,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);      }  }  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();  }  

接收者:

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;      }  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 here              System.out.println(job + " id:" + ((ObjectMessage)message).getObject());          } catch (Exception e) {              e.printStackTrace();          }      }  }