【J2EE】企业级项目开发总结--JMS发布-订阅模型篇
来源:互联网 发布:淘宝上的星巴克月饼券 编辑:程序博客网 时间:2024/06/07 06:41
通过上篇博客的示例,我们可以总结出消息通信的基本过程。首先得到连接工厂,通过工厂生产连接,从连接中得到一个会话,根据会话创建消息生产者,目的地,消息和消息消费者。详细过程如下图。
和前一篇P2P中的代码类似,我们今天来看看发布订阅模型。只是在这里把Queue换成了Topic,消息生产者叫做消息发布者,发布一个主题,所有订阅主题的类叫做消息订阅者,每个订阅者都对应一个监听类,当消息发送到主题队列后,会调用监听类的onMessage方法,从而使得各订阅者收到消息,所有的订阅者都能收到同样的消息,消息被消费了不只一次。
代码如下:
TopicPublisher
package com.tgb.topic;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import javax.jms.Topic;import org.apache.activemq.ActiveMQConnectionFactory;/** * 消息发布者 * @author ghy * */public class TopicPublisher {private static final String USERNAME=ActiveMQConnectionFactory.DEFAULT_USER;//默认的连接用户名private static final String PASSWORD=ActiveMQConnectionFactory.DEFAULT_PASSWORD;//默认的连接密码private static final String BROKEURL=ActiveMQConnectionFactory.DEFAULT_BROKER_URL;//默认的连接地址private static final int SENDNUM=10;//发送的消息数量public static void main(String[] args){ConnectionFactory connectionFactory;//连接工厂Connection connection=null;//连接Session session; //会话,接受或者发送消息的线程MessageProducer messageProducer; //消息发送者//实例化连接工厂connectionFactory=new ActiveMQConnectionFactory(TopicPublisher.USERNAME,TopicPublisher.PASSWORD,TopicPublisher.BROKEURL);try {connection=connectionFactory.createConnection();//创建连接connection.start();//启动连接session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE);//创建连接Topic topic =session.createTopic("FirstTopic");//创建主题messageProducer=session.createProducer(topic);//创建消息生产者sendMessage(session,messageProducer);session.commit();} catch (Exception e) {e.printStackTrace();}finally{if(connection!=null){try {connection.close();} catch (JMSException e) {e.printStackTrace();}}}}//发送消息public static void sendMessage(Session session,MessageProducer messageProducer){for (int i=0;i<TopicPublisher.SENDNUM;i++){TextMessage message;try {message = session.createTextMessage("ActiveMQ 发送的消息" + i);System.out.println("发送消息:" + "ActiveMQ 发送的消息" + i);messageProducer.send(message);} catch (JMSException e) {e.printStackTrace();}}}}
TopicSubscriber
package com.tgb.topic;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Session;import javax.jms.Topic;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * 消息订阅者1 * @author ghy * */public class TopicSubscriber {private static final String USERNAME=ActiveMQConnection.DEFAULT_USER;//默认连接的用户名private static final String PASSWORD=ActiveMQConnection.DEFAULT_PASSWORD;//默认连接密码private static final String BROKEURL=ActiveMQConnection.DEFAULT_BROKER_URL;//默认链接地址public static void main(String[] args){ConnectionFactory connectionFactory;//连接工厂Connection connection=null;//连接Session session;//会话MessageConsumer messageConsumer;//消息消费者connectionFactory=new ActiveMQConnectionFactory(TopicSubscriber.USERNAME,TopicSubscriber.PASSWORD,TopicSubscriber.BROKEURL);try {connection=connectionFactory.createConnection();//创建连接connection.start();//启动连接session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//创建sessionTopic topic=session.createTopic("FirstTopic");//创建主题messageConsumer=session.createConsumer(topic);//创建消息消费者//注册消息监听TopicListener listener=new TopicListener();messageConsumer.setMessageListener(listener);} catch (JMSException e) {e.printStackTrace();}}}
TopicListener
package com.tgb.topic;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;/** * 监听器 * @author ghy * */public class TopicListener implements MessageListener {public void onMessage(Message message) {try {System.out.println("订阅者1收到的消息:" + ((TextMessage)message).getText());} catch (JMSException e) {e.printStackTrace();}}}
TopicSubscriber2和TopicListener2和上面的一样,改一下名称和打印信息即可.
运行代码,得到如下结果:
关于P2P模型和Pub/Sub模型的特点,我们好好体会体会吧.
0 0
- 【J2EE】企业级项目开发总结--JMS发布-订阅模型篇
- 【J2EE】企业级项目开发总结--JMS点对点模型篇
- 【J2EE】企业级项目开发总结--JMS基础篇
- 【J2EE】企业级项目开发总结--EJB篇
- JMS之发布订阅模型
- 【J2EE】企业级项目开发总结-JBoss Modules
- JMS订阅/发布消息传送模型
- JMS 发布/订阅消息
- J2EE企业级开发攻略
- 10 发布订阅模型
- 企业级项目开发总结------之PLAN
- 利用JMS Topic发布/订阅消息
- JMS消息机制--发布-订阅模式
- jms点对点API,发布/订阅API
- spring---消息订阅发布之JMS
- 使用JMS发布订阅topic,传送TextMessage
- 使用JMS发布订阅topic,传递ObjectMessage
- jms activeMQ发布与订阅入门实例
- 【排序算法】——堆排序
- 关于RHCE
- AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用
- Add Binary
- 实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,
- 【J2EE】企业级项目开发总结--JMS发布-订阅模型篇
- Java中的substring真的会引起内存泄露么?
- Linux常用命令
- linux下执行java为什么bash:javac:command not found
- 【物联网】WiFi基础知识
- linux进程管理
- Java 实现单向链表
- Linux下locale: Cannot set LC_CTYPE to default locale: No such file or directory警告
- linux下C语言开发入门