ActiveMQ
Activemq/ zeromq /rocketmq/kafka/RabbitMq/JMS
| |||
JMS 规范
ActiveMQ 特点
1. 完全支持JMS规范
2. 支持多种传输协议/方式: VM/ TCP /SSL / NIO /UDP/JXTA/JGROUPS
3. 非常容易与我们的业务系统集成
4. 支持多种语言编写的客户端
5. 消息做持久化-jdbc 。 kahadb
安装ActiveMq和启动
1. 下载activemq:http://www.apache.org/dyn/closer.cgi?filename=/activemq/5.14.3/apache-activemq-5.14.3-bin.tar.gz&action=download
2. 通过tar –zxvf 解压我们的activemq.tar.gz
3. 进入到bin目录下执行./activemq start/stop
4. 启动成功后,有两个端口号 , 1. 控制台:8161. 2. 默认连接端口61616
第一个实例
发送端
public static void main(String[] args) {
|
接收端
public static void main(String[] args) { ConnectionFactory connectionFactory; //连接工厂 Connection connection=null; //客户端到JMS provider的连接 Session session; //一个发送或者接收消息的会话 Destination destination; //消息的目的 MessageConsumer consumer; //消息发送者 try{ connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.11.130:61616"); connection=connectionFactory.createConnection(); session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); destination=session.createQueue("first_queue"); consumer=session.createConsumer(destination); connection.start(); while (true) { TextMessage message = (TextMessage) consumer.receive(); if(message!=null) { System.out.println(message.getText()); session.commit(); }else{ break; } } session.close(); }catch (Exception e){ e.printStackTrace(); }finally { try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } |
消息可以发送String,Map,对象等。
JMS规范
JMS是什么
Jms的消息服务或规范(java message service)
JMS 的规范
Java中提供访问消息中间件的接口,并没有给出实现 , 通过ActiveMq
JMS provider
实现了jms接口和规范的消息中间件
JMS消息的组成:
消息头
JMSDestinanion: 比如是QUEUE或者是TOPIC
destination = session.createQueue("first_queue"); //点对点
producer = session.createProducer(destination);
JMSDeliveryMode: 持久模式和非持久模式
JMSExpiration: 消息过期时间
message.setJMSExpiration(0); //0消息永不过期
JMSPriorty : 消息优先级别(0-9) 默认是4; 注意:JMS只保证加急消息(5~9)比普通消息(0~4)更早到达,
JMSMessageID ;
JMSTimestamp:
JMSReplyTo:
消息属性
通过Message.setStringProperty()来设置
message.setStringProperty("key","hello world"); //消息属性
消息体
JMS consumer
JMS domains【消息域】
PTP (point – to –point ) 目的地被成为QUEUE(默认是持久化)
特点
1. 如果在session关闭时, 有一些消息发送到队列,消费者从队列接收消息,接收消息后会将其从队列中消除,如果没被签收,那么下次连接时还能再次接收
destination = session.createQueue("first_queue");
pub/sub 目的地被成为 (topic) (默认是非持久化)
|
topic特性:
如果发送端发送的时候,消费端没有启动(如果消费端已经启动可接受),那么消费端就不能接受到这个消息。(消息丢失)
destination = session.createTopic("first_topic");
JMS的可靠性机制
消息的接收确认
JMS消息只有被确认过以后,才会认为消息被成功消费: 客户端接收消息、客户端处理消息、消息确认
消息事务性
消息确认方式
1. AUTO_ACKNOWLEDGE ; 需要客户端session.commit()来确认会话签收
收:
2. CLIENT_ACKNOWLEDGE; 通过客户端调用message.acknowledge()方法来签收消息
接收端要为false(如果为true,能接受消息,但是没有消费),发送端依旧是true.
3. DUPS_ACKNOWLEDGE ; 会话延迟确认提交。JMSprovider会在消息头的JMSRedelivered字段设置为true,表示该消息为重复消息
消息的持久性
持久化消息(可靠性)
保证消息只被传送一次和成功使用一次。
非持久化消息(可能会丢失消息,性能更好)
保证消息最多被传送一次
持久化订阅(topic,消息不再丢失)
消息会一直存在
发送端:
producer.setDeliveryMode(DeliveryMode.PERSISTENT); //持久化模型
接收端:
注释成员变量中的destination,consumer
下面代码:第三行不能放在第四行后面,报错:clientID on a used Connection is not allowed.
clientID 唯一就可以,让发送端知道你是持久订阅客户端【类似zookeeper中的节点】
topic1是随便写的
消息回滚:
session.rollback() 发送端本地事物
②
Spring+activeMq
(processon绘制) D:优惠券等
如果这些业务都放在A就会很大,很复杂。解耦等
多线程也可以去做,但是具有一定的局限性和复杂性,也不能持久化存储等。
Spring+activeMQ
sender
1.
2.
3.
在此过程中出现的报错总结:
① :local class incompatible: stream classdesc serialVersionUID = -5514063437663796977, loca
Intellij IDEA 自动生成SerialVersionUID
Setting->Inspections->Serialization issues->Serializable class without ’serialVersionUID’
选上以后,在你的class中:Alt+Enter(放在类名)就会提示自动创建serialVersionUID了。
两个实体中的UID必须是一样的?
企业中更多的是用上面的监听➕spring的注解监听消息。封装了consumer.setMessageListener(new MessageListener(){}))
ActiveMQ支持的传输协议
ActiveMQ支持 client-broker通讯协议
TCP传输(默认)
1. 高可靠性、而且稳定性强
2. 传输效率高
3. 应用比较广泛
Nio:
1. 如果有大量的client去连接到broker上的时候,一般情下,会出现线程数限制的问题
2. Nio比TCP性能更好
NIO、
UDP: udp://ip:port (不稳定传输,消息丢失)
HTTP :
VM、SSL
Nio方式传输
1. 修改${activemq_home}/conf/activemq.xml
2.
3. 修改连接串:
4. log日志/data/activemq.log
ActiveMQ消息持久化
支持的持久存储方式有哪些
1. AMQ 基于文件的存储方式(硬盘中), 5.0之前的默认方式
2. Kahadb 这是5.0后的默认方式 (实务日志+索引)
1. Director 目录
2. IndexWriteBatchSize: 批量写入磁盘大小设置
3. cleanupInterval : 持续多久消息没用就清除
4. indexcachesize 缓存中索引数量
3. JDBC 消息存储 【消息消费了,数据库中就没有了】
消息表(ACTIVEMQ_MSGS) 所有的queue和topic都存在里面
消息响应(ACTIVEMQ_ACK) 持久订阅的信息和最后一个持久订阅接收的消息id信息
锁定表(ACTIVEMQ_LOCK) 默认集群,master,slave判断主表,如果单表,useDatabaseLock=”false”
配置过程中要注意的几个点:[没有搞出来!!!]
1.
2.
3. 引入jar包到lib目录下,包括:commons-pools.jar commons-dbcp.jar . mysql的驱动包
4. JDBC Message store with activemq journal jdbc+缓存 效率更高
报这个错,很有可能标签少写了/,坑大了!!
ActiveMQ第三次课
1.持久化存储
2.集群配置
3.高级特性
4.总结
1. kahadb
2. Jdbc持久化操作
3. Jdbc Message store with ActiveMQ journal 【有缓存,效率更高】
会先缓存到内存中,如果宕机数据不会丢失,在文件中有记录,可以恢复。文件操作(kafka)快于数据库. 4 2048这两个参数先不要配置,有点问题。(应该根据文件大小刷入数据库)
4. Memory 基于内存方式来持久化消息 (快,宕机消息丢失)
1. Journal 性能优于jdbc
2. Jdbc一般用于master/slave模式 ,
3. 一般使用journal
|
activeMQ的集群配置
queue consumer cluster (谁获得谁消费,其他人靠边站)
Broker Cluster
静态网络连接
TransportConnector (tcp /udp)
NetworkConnector (多个broker通信)
1.
static:(tcp://192.168.11.132:61616,tcp://….)
initialReconnectDelay ;
maxReconnectDelay .
2. 如果要做双向链接,那么需要在指定的双方服务器上都需要配置networkConnector [只是做到了负载而没有集群]
这种方式可以认为,发送给130,132先去130消费,然后消费者再去132消费。如此可以理解demo中的问题。如果132宕机,重启依旧可以在132中消费剩下的消息,但在130中已经没有消息,不能消费。【相对而言就出现了消息卡住】
管道订阅的方式(conduit subscription)
消息回流 【如果要双向回流,双方服务器都需要配置】
默认是true,broker之间均分消息,false是不均分(最好两台都配)
容错链接(failover protocol)
通过failover协议实现自动重连的逻辑。提供了两种方式: randomize=true/false
true,随机负载;false,主从备份,主宕机后才会连从。
1. initialReconnectDelay ; (&in 添加在false后)
2. maxReconnectDelay
3. useExponentialBackOff: 重连间隔时间是否已指数形式增长(衰减重试)
动态网络连接 (广播机制,时时发现去连接,但可能会丢包)
<networkConnectors>
<networkConnect uri=”multicast://default”/>
</networkConnectors>
Master slave
1. Shared file system master slave
主要通过共享存储目录实现master和slave的热备。所有ActiveMQ应用都在不断获取共享目co录
的控制权,谁抢到了控制权,它就是master
2. JDBC Master (主从,高可用)
3. Replicated levelDB store (类似zookeeper原理 )
Destinantion 高级特性
组合队列 : (一个消息可以发给多个队列 )
<destinationInterceptors>
<virtualDestinationInterceptor>
</ virtualDestinationInterceptor>
</destinationInterceptors>
Message Dispatch 高级特性
Message Cursors (消息游标)
Store-based (对非持久化消息处理)
VM (虚拟化内存)
File-based (磁盘临时文件)
1. 异步调用 (有实务一定要同步)
2. 一对多通信 (topic方式订阅)
3. 多个系统的集成
4. 提高系统的可用性和伸缩性
ActiveMQ
Activemq/ zeromq /rocketmq/kafka/RabbitMq/JMS
| |||
JMS 规范
ActiveMQ 特点
1. 完全支持JMS规范
2. 支持多种传输协议/方式: VM/ TCP /SSL / NIO /UDP/JXTA/JGROUPS
3. 非常容易与我们的业务系统集成
4. 支持多种语言编写的客户端
5. 消息做持久化-jdbc 。 kahadb
安装ActiveMq和启动
1. 下载activemq:http://www.apache.org/dyn/closer.cgi?filename=/activemq/5.14.3/apache-activemq-5.14.3-bin.tar.gz&action=download
2. 通过tar –zxvf 解压我们的activemq.tar.gz
3. 进入到bin目录下执行./activemq start/stop
4. 启动成功后,有两个端口号 , 1. 控制台:8161. 2. 默认连接端口61616
第一个实例
发送端
public static void main(String[] args) {
|
接收端
public static void main(String[] args) { ConnectionFactory connectionFactory; //连接工厂 Connection connection=null; //客户端到JMS provider的连接 Session session; //一个发送或者接收消息的会话 Destination destination; //消息的目的 MessageConsumer consumer; //消息发送者 try{ connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.11.130:61616"); connection=connectionFactory.createConnection(); session=connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); destination=session.createQueue("first_queue"); consumer=session.createConsumer(destination); connection.start(); while (true) { TextMessage message = (TextMessage) consumer.receive(); if(message!=null) { System.out.println(message.getText()); session.commit(); }else{ break; } } session.close(); }catch (Exception e){ e.printStackTrace(); }finally { try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } |
消息可以发送String,Map,对象等。
JMS规范
JMS是什么
Jms的消息服务或规范(java message service)
JMS 的规范
Java中提供访问消息中间件的接口,并没有给出实现 , 通过ActiveMq
JMS provider
实现了jms接口和规范的消息中间件
JMS消息的组成:
消息头
JMSDestinanion: 比如是QUEUE或者是TOPIC
destination = session.createQueue("first_queue"); //点对点
producer = session.createProducer(destination);
JMSDeliveryMode: 持久模式和非持久模式
JMSExpiration: 消息过期时间
message.setJMSExpiration(0); //0消息永不过期
JMSPriorty : 消息优先级别(0-9) 默认是4; 注意:JMS只保证加急消息(5~9)比普通消息(0~4)更早到达,
JMSMessageID ;
JMSTimestamp:
JMSReplyTo:
消息属性
通过Message.setStringProperty()来设置
message.setStringProperty("key","hello world"); //消息属性
消息体
JMS consumer
JMS domains【消息域】
PTP (point – to –point ) 目的地被成为QUEUE(默认是持久化)
特点
1. 如果在session关闭时, 有一些消息发送到队列,消费者从队列接收消息,接收消息后会将其从队列中消除,如果没被签收,那么下次连接时还能再次接收
destination = session.createQueue("first_queue");
pub/sub 目的地被成为 (topic) (默认是非持久化)
|
topic特性:
如果发送端发送的时候,消费端没有启动(如果消费端已经启动可接受),那么消费端就不能接受到这个消息。(消息丢失)
destination = session.createTopic("first_topic");
JMS的可靠性机制
消息的接收确认
JMS消息只有被确认过以后,才会认为消息被成功消费: 客户端接收消息、客户端处理消息、消息确认
消息事务性
消息确认方式
1. AUTO_ACKNOWLEDGE ; 需要客户端session.commit()来确认会话签收
收:
2. CLIENT_ACKNOWLEDGE; 通过客户端调用message.acknowledge()方法来签收消息
接收端要为false(如果为true,能接受消息,但是没有消费),发送端依旧是true.
3. DUPS_ACKNOWLEDGE ; 会话延迟确认提交。JMSprovider会在消息头的JMSRedelivered字段设置为true,表示该消息为重复消息
消息的持久性
持久化消息(可靠性)
保证消息只被传送一次和成功使用一次。
非持久化消息(可能会丢失消息,性能更好)
保证消息最多被传送一次
持久化订阅(topic,消息不再丢失)
消息会一直存在
发送端:
producer.setDeliveryMode(DeliveryMode.PERSISTENT); //持久化模型
接收端:
注释成员变量中的destination,consumer
下面代码:第三行不能放在第四行后面,报错:clientID on a used Connection is not allowed.
clientID 唯一就可以,让发送端知道你是持久订阅客户端【类似zookeeper中的节点】
topic1是随便写的
消息回滚:
session.rollback() 发送端本地事物
②
Spring+activeMq
(processon绘制) D:优惠券等
如果这些业务都放在A就会很大,很复杂。解耦等
多线程也可以去做,但是具有一定的局限性和复杂性,也不能持久化存储等。
Spring+activeMQ
sender
1.
2.
3.
在此过程中出现的报错总结:
① :local class incompatible: stream classdesc serialVersionUID = -5514063437663796977, loca
Intellij IDEA 自动生成SerialVersionUID
Setting->Inspections->Serialization issues->Serializable class without ’serialVersionUID’
选上以后,在你的class中:Alt+Enter(放在类名)就会提示自动创建serialVersionUID了。
两个实体中的UID必须是一样的?
企业中更多的是用上面的监听➕spring的注解监听消息。封装了consumer.setMessageListener(new MessageListener(){}))
ActiveMQ支持的传输协议
ActiveMQ支持 client-broker通讯协议
TCP传输(默认)
1. 高可靠性、而且稳定性强
2. 传输效率高
3. 应用比较广泛
Nio:
1. 如果有大量的client去连接到broker上的时候,一般情下,会出现线程数限制的问题
2. Nio比TCP性能更好
NIO、
UDP: udp://ip:port (不稳定传输,消息丢失)
HTTP :
VM、SSL
Nio方式传输
1. 修改${activemq_home}/conf/activemq.xml
2.
3. 修改连接串:
4. log日志/data/activemq.log
ActiveMQ消息持久化
支持的持久存储方式有哪些
1. AMQ 基于文件的存储方式(硬盘中), 5.0之前的默认方式
2. Kahadb 这是5.0后的默认方式 (实务日志+索引)
1. Director 目录
2. IndexWriteBatchSize: 批量写入磁盘大小设置
3. cleanupInterval : 持续多久消息没用就清除
4. indexcachesize 缓存中索引数量
3. JDBC 消息存储 【消息消费了,数据库中就没有了】
消息表(ACTIVEMQ_MSGS) 所有的queue和topic都存在里面
消息响应(ACTIVEMQ_ACK) 持久订阅的信息和最后一个持久订阅接收的消息id信息
锁定表(ACTIVEMQ_LOCK) 默认集群,master,slave判断主表,如果单表,useDatabaseLock=”false”
配置过程中要注意的几个点:[没有搞出来!!!]
1.
2.
3. 引入jar包到lib目录下,包括:commons-pools.jar commons-dbcp.jar . mysql的驱动包
4. JDBC Message store with activemq journal jdbc+缓存 效率更高
报这个错,很有可能标签少写了/,坑大了!!
ActiveMQ第三次课
1.持久化存储
2.集群配置
3.高级特性
4.总结
1. kahadb
2. Jdbc持久化操作
3. Jdbc Message store with ActiveMQ journal 【有缓存,效率更高】
会先缓存到内存中,如果宕机数据不会丢失,在文件中有记录,可以恢复。文件操作(kafka)快于数据库. 4 2048这两个参数先不要配置,有点问题。(应该根据文件大小刷入数据库)
4. Memory 基于内存方式来持久化消息 (快,宕机消息丢失)
1. Journal 性能优于jdbc
2. Jdbc一般用于master/slave模式 ,
3. 一般使用journal
|
activeMQ的集群配置
queue consumer cluster (谁获得谁消费,其他人靠边站)
Broker Cluster
静态网络连接
TransportConnector (tcp /udp)
NetworkConnector (多个broker通信)
1.
static:(tcp://192.168.11.132:61616,tcp://….)
initialReconnectDelay ;
maxReconnectDelay .
2. 如果要做双向链接,那么需要在指定的双方服务器上都需要配置networkConnector [只是做到了负载而没有集群]
这种方式可以认为,发送给130,132先去130消费,然后消费者再去132消费。如此可以理解demo中的问题。如果132宕机,重启依旧可以在132中消费剩下的消息,但在130中已经没有消息,不能消费。【相对而言就出现了消息卡住】
管道订阅的方式(conduit subscription)
消息回流 【如果要双向回流,双方服务器都需要配置】
默认是true,broker之间均分消息,false是不均分(最好两台都配)
容错链接(failover protocol)
通过failover协议实现自动重连的逻辑。提供了两种方式: randomize=true/false
true,随机负载;false,主从备份,主宕机后才会连从。
1. initialReconnectDelay ; (&in 添加在false后)
2. maxReconnectDelay
3. useExponentialBackOff: 重连间隔时间是否已指数形式增长(衰减重试)
动态网络连接 (广播机制,时时发现去连接,但可能会丢包)
<networkConnectors>
<networkConnect uri=”multicast://default”/>
</networkConnectors>
Master slave
1. Shared file system master slave
主要通过共享存储目录实现master和slave的热备。所有ActiveMQ应用都在不断获取共享目co录
的控制权,谁抢到了控制权,它就是master
2. JDBC Master (主从,高可用)
3. Replicated levelDB store (类似zookeeper原理 )
Destinantion 高级特性
组合队列 : (一个消息可以发给多个队列 )
<destinationInterceptors>
<virtualDestinationInterceptor>
</ virtualDestinationInterceptor>
</destinationInterceptors>
Message Dispatch 高级特性
Message Cursors (消息游标)
Store-based (对非持久化消息处理)
VM (虚拟化内存)
File-based (磁盘临时文件)
1. 异步调用 (有实务一定要同步)
2. 一对多通信 (topic方式订阅)
3. 多个系统的集成
4. 提高系统的可用性和伸缩性