JSM之ActivityMQ
来源:互联网 发布:优先级调度算法流程图 编辑:程序博客网 时间:2024/05/21 10:28
1. JMS基本概念
JMS(Java Message Service) 即Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业 应用的开发。它支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。P2P 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者。
对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取,一旦这个消息被一个接收者读取之后,它就在这个Queue中消失了,所以一个消息只能被一个接收者消费。
与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。
2. 几个重要概念
Destination :消息发送的目的地,也就是前面说的Queue和Topic。创建好一个消息之后,只需要把这个消息发送到目的地,消息的发送者就可以继续做自己的事情,而不用等待消息被处理完成。至于这个消息什么时候,会被哪个消费者消费,完全取决于消息的接受者。
Message :从字面上就可以看出是被发送的消息。它有下面几种类型:
StreamMessage:Java 数据流消息,用标准流操作来顺序的填充和读取。
MapMessage:一个Map类型的消息;名称为 string 类型,而值为 Java 的基本类型。
TextMessage:普通字符串消息,包含一个String。
ObjectMessage:对象消息,包含一个可序列化的Java 对象
BytesMessage:二进制数组消息,包含一个byte[]。
XMLMessage: 一个XML类型的消息。
最常用的是TextMessage和ObjectMessage。
Session: 与JMS提供者所建立的会话,通过Session我们才可以创建一个Message。
Connection: 与JMS提供者建立的一个连接。可以从这个连接创建一个会话,即Session。
ConnectionFactory: 那如何创建一个Connection呢?这就需要下面讲到的ConnectionFactory了。通过这个工厂类就可以得到一个与JMS提供者的连接,即Conection。
Producer: 消息的生产者,要发送一个消息,必须通过这个生产者来发送。
MessageConsumer: 与生产者相对应,这是消息的消费者或接收者,通过它来接收一个消息。
前面多次提到JMS提供者,因为JMS给我们提供的只是一系列接口,当我们使用一个JMS的时候,还是需要一个第三方的提供者,它的作用就是真正管理 这些Connection,Session,Topic和Queue等。
通过下面这个简图可以看出上面这些概念的关系。
ConnectionFactory---->Connection--->Session--->Message
Destination + Session------------------------------------>Producer
Destination + Session------------------------------------>MessageConsumer
创建生产者:
package ActivityMQ1;import javax.jms.*;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * 消息生产者 * @author Administrator * */public class JMSProducer {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; // 默认的连接地址private static final int SENDNUM=10; // 发送的消息数量public static void main(String[] args) {ConnectionFactory connectionFactory; // 连接工厂Connection connection = null; // 连接Session session; // 会话 接受或者发送消息的线程Destination destination; // 消息的目的地MessageProducer messageProducer; // 消息生产者// 实例化连接工厂connectionFactory=new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);try {connection=connectionFactory.createConnection(); // 通过连接工厂获取连接connection.start(); // 启动连接/**Boolean.TRUE:是否支持事务,true表示支持 * Session.AUTO_ACKNOWLEDGE:当客户成功的从receive方法返回的时候, 或者从MessageListener.onMessage 方法成功返回的时候,会话自动确认客户收到的消息 */session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); // 创建Sessiondestination=session.createQueue("zhan"); // 创建消息队列messageProducer=session.createProducer(destination); // 创建消息生产者messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);//消息是否持久化sendMessage(session, messageProducer); // 发送消息session.commit();} catch (Exception e) {e.printStackTrace();} finally{if(connection!=null){try {connection.close();} catch (JMSException e) {e.printStackTrace();}}}}/** * 发送消息 * @param session * @param messageProducer * @throws Exception */public static void sendMessage(Session session,MessageProducer messageProducer)throws Exception{for(int i=0;i<JMSProducer.SENDNUM;i++){TextMessage message=session.createTextMessage("ActiveMQ 发送的消息"+i);System.out.println("发送消息:ActiveMQ 发送的消息"+i);messageProducer.send(message);}}}
创建消费者(以while(true)不断获取消息)
package ActivityMQ1;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Session;import javax.jms.TextMessage;import ActivityMQ2.*;import ActivityMQ2.Listener;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * 消息消费者 * @author Administrator * */public class JMSConsumer {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; // 会话 接受或者发送消息的线程Destination destination; // 消息的目的地MessageConsumer messageConsumer; // 消息的消费者// 实例化连接工厂connectionFactory=new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD, JMSConsumer.BROKEURL);try {connection=connectionFactory.createConnection(); // 通过连接工厂获取连接connection.start(); // 启动连接session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 创建Sessiondestination=session.createQueue("zhan"); // 创建连接的消息队列messageConsumer=session.createConsumer(destination); // 创建消息消费者//不推荐使用,一般用监听messageConsumer.setMessageListener(new Listener());while(true){TextMessage textMessage=(TextMessage)messageConsumer.receive(100000);if(textMessage!=null){System.out.println("收到的消息:"+textMessage.getText());}else{break;}}} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}以监听的方式创建消费者
package ActivityMQ1;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnection;import org.apache.activemq.ActiveMQConnectionFactory;/** * 消息消费者 * @author Administrator * */public class JMSConsumer2 {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; // 会话 接受或者发送消息的线程Destination destination; // 消息的目的地MessageConsumer messageConsumer; // 消息的消费者// 实例化连接工厂connectionFactory=new ActiveMQConnectionFactory(JMSConsumer2.USERNAME, JMSConsumer2.PASSWORD, JMSConsumer2.BROKEURL);try {connection=connectionFactory.createConnection(); // 通过连接工厂获取连接connection.start(); // 启动连接session=connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 创建Sessiondestination=session.createQueue("zhan"); // 创建连接的消息队列messageConsumer=session.createConsumer(destination); // 创建消息消费者messageConsumer.setMessageListener(new Listener()); // 注册消息监听} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package ActivityMQ1;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;/** * 消息监听 * @author Administrator * */public class Listener implements MessageListener{public void onMessage(Message message) {// TODO Auto-generated method stubtry {System.out.println("收到的消息:"+((TextMessage)message).getText());} catch (JMSException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
- JSM之ActivityMQ
- JSM之ActivityMQ消息头
- activityMQ
- JSM
- ActivityMQ 事务
- ActivityMQ 事务
- jsm(二)
- ActivityMQ (1) 简介
- ActivityMQ android开发
- Spring整合activityMq
- ActivityMQ中的使用详解
- ActivityMQ的实现原理
- ActivityMQ入门案例
- ActivityMQ应用详解
- a simple jsm sample
- spring jsm(一)
- spring jsm(二)
- JSM消息模型简介
- linux 下的一些特征码
- 解析MySQL的information_schema数据库
- kuangbin——线段树专题 A - 敌兵布阵
- m阶B+树与m阶B树的主要差异在于:
- JaVa 程序员如何获得高工资?
- JSM之ActivityMQ
- POJ 1474 Video Surveillance -
- UIApplication
- 将每一个单词的首字母都转成大写的
- 设计模式-代理模式
- 画圆——方程算法
- ScrollView是否滑动到底部
- javascript中的this
- 二叉树中和为某一值的路径