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
- 初始化资源;
- 接收消息;
- 必要的时候关闭资源;
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(); } } }
接收和处理消息的方法有两种: 分为同步和异步的;
- 一般同步的方式我们是通过MessageConsumer.receive()方法来处理接收到的消息;
- 异步的方法则是通过注册一个MessageListener的方法,使用MessageConsumer.setMessageListener();
总结:通过实现前面的publisher和consumer我们已经实现了pub-sub模式的一个实例;
- 主要就是要两者设定一个共同的topic,有了这个topic之后他们可以实现一方发消息另外一方接收;
- 另外,为了连接到具体的message server,这里是使用了连接tcp://localhost:16161作为定义ActiveMQConnectionFactory的路径;
- 在publisher端通过session创建producer;
- 根据指定的参数创建destination,然后将消息和destination作为producer.send()方法的参数发消息;
- 在consumer端也要创建类似的connection, session。通过session得到destination,再通过session.createConsumer(destination)来得到一个MessageConsumer对象;
- 有了这个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(); } } }
阅读全文
0 0
- ActiveMQ
- ACtiveMQ
- ACtiveMQ
- activeMQ
- ActiveMQ
- activeMQ
- activeMQ
- activemq
- ActiveMQ
- ActiveMQ
- ActiveMQ
- ActiveMQ
- activeMQ
- activemq
- ActiveMQ
- ActiveMQ
- ActiveMQ
- ActiveMQ
- 编程之路小细节-jar包和a标签的浅析
- b2b b2c o2o分布式电子商务云平台 需要准备哪些技术?
- php 在线读取PDF文件
- 树的拷贝
- 25 设备树里直接提供gpio口的中断号
- Activemq
- Windows下Mysql5.7开启binlog步骤及注意事项
- 英语作业
- Kotlin学习(十九): 属性自动生成方法所引发问题
- 源发行版 1.8 错误问题
- php7.0.5
- 报错了
- 【java基础】03.泛型
- anaconda的正确安装