一、 应用场景
用于解耦系统,解决高并发系统反应慢。
二、 模式
1. 点对点(queue)
特性:
l 生产者发送的消息只能被一个消费者消费。
l 消息设置为持久性存储,如果生产者发送消息时消费者不在线,那么无论activeMQ服务器是否重启过,消费者上线时都会接收到缓存中的消息。
消息设置为非持久性存储,如果生产者发送消息时消费者不在线,如果activeMQ服务器没有重启则消费者上线时可以接收到缓存在内存中的消息;如果activeMQ服务器重启过,则消费者接收不到消息。
2. 发布-订阅(topic)
特性:
l 发布订阅模式规定生产者发送的消息可被多个消费者消费。
l 如果生产者发送消息时消费者不在线,当消费者上线时也接收不到消息。
三、 消息类型
根据 JSR 914: JavaTM Message Service (JMS) API ,JMS规范中的消息类型包括TextMessage、BytesMessage、MapMessage、StreamMessage和ObjectMessage 等五种。
l TextMessage
将字符串存放在消息体内。
//设置 TextMessage message = session.createTextMessage(); message.setText("字符串消息"); //读取 message.getText();
l BytesMessage
将字节存放在消息体内。
//设置 byte[] data; BytesMessage msg = session.createBytesMessage(); msg.wirte(data); //读取 byte[] msgData = new byte[256]; int bytesRead = msg.readBytes(msgData);
l MapMessage
//设置 MapMessage msg = session.createMapMessage(); msg.setString(“CUSTOMER_NAME”,”John”); msg.setInt(“CUSTOMER_AGE”,12); //读取 String s = msg.getString(“CUSTOMER_NAME”); int age = msg.getInt(“CUSTOMER_AGE”);
l StreamMessage
//设置 StreamMessage msg = session.createStreamMessage(); msg.writeString(“John”); msg.writeInt(12); //读取 String s = msg.readString(); Int age = msg.readInt();
l ObjectMessage
传入可序列化的对象。
四、 持久化存储
1. 持久化为文件
activeMQ默认持久化到文件中
2. 持久化到mysql
l 配置config/activemq.xml文件
在”broker”节点后添加mysql数据源配置
<bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/> <property name="poolPreparedStatements" value="true"/>
</bean>
将默认持久化配置注释掉,添加mysql配置
<!--<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>-->
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysqlDataSource"/> </persistenceAdapter>
l 将mysql的驱动jar包以及相关连接池的jar包放在lib目录下
l 重新启动activemq,然后数据库中会自动建立三张表,其中activemq_msgs存储离线消息。