- 可应用于分布式,是在内存中操作的,用到连接池,达到复用connection session
-
消息模式:Point to Point, publish/Subsricbe
-
P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中);
发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被消费;
接收者在成功接收消息之后需向队列应答成功;
如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式。 -
包含三个角色主题(Topic),发布者(Publisher),订阅者(Subscriber) 多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
Pub/Sub的特点
每个消息可以有多个消费者
发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个
订阅者之后,才能消费发布者的消息
为了消费消息,订阅者必须保持运行的状态
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订
阅者没有被激活(运行),它也能接收到发布者的消息。
如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费
者处理的话,那么可以采用Pub/Sub模型。 -
ActiveMQ 各目录作用
activemq-all-5.12.1.jar:activemq所有jar
bin:启动命令文件夹,环境变量
conf:配置文件
data:数据目录,包含activemq的进程文件,数据文件,及日志文件
docs:用户使用帮助相关文件
examples:配置文件,及java操作ActiveMQ相关实例
lib:activemq jar包
webapps:activemq控制台应用目录
webapps-demo:activemq使用实例目录
默认端口8161
控制台用户/密码 admin/admin
成功后访问localhost:8161出现右图界面
启动:apache-activemq-5.11.1\bin\win64\activemq.bat
启动失败:①计算机名有下划线②端口占用 -
-
-
-
消息持久化及持久订阅
ActiveMQ消息持久化信息保存有三种方式:AMQ、KahaDB、JDBC
可以在conf/activemq.xml中通过persistenceAdapter标签配置
KahaDB是基于文件的本地数据库储存形式,虽然没有AMQ的速度快,但是它具有强扩展性,恢复的时间比AMQ短
AMQ是一种文件存储形式,它具有写入速度快和容易恢复的特点。消息存储在一个个文件中,文件的默认大小为32兆
JDBC是把数据持久化到数据库
设置消息持久化的两种方式:
1):producer.setDeliveryMode()方法设置,由该producer发出的消息都是持久化的,但是必须在连接建立之前设置才有效,,持久化后,队列挂调了,消费者也可在队列重启后获得消息;不设置,即使消费者是持久订阅,队列重启后获得不到消息
2):send()方法设置,对此次发送的消息有效
DeliveryMode有两种种模式DeliveryMode.NON_PERSISTENT不需要持久化/DeliveryMode.PERSISTENT需要持久化
队列默认会进行持久化,topic消息默认不进行持久化
除非这种类型的消息不是必须被消费的,否则都应该使用持久化 -
-
1.创建springBoot项目,添加activemq依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!--#如果spring.activemq.pool.enabled设置为true,需要加如下的依赖包,否则会自动配置失败,报JmsMessagingTemplate注入失败-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<!-- <version>5.7.0</version> -->
</dependency>
2.在application.properties中添加配置(因为都有默认配置项,所以即使不添加任何配置也可以使用)
#是否是内存模式,默认为true.
spring.activemq.in-memory=true
#默认不使用连接池,若想使用需设置为true
spring.activemq.pool.enabled=true
#spring boot 默认只支持P2P 不支持P/S,所以要开启P/S模式,但开启后有不支持P2P,一般我们自己配置类
spring.jms.pub-sub-domain=true -
ActiveMQ配置项
#指定ActiveMQ broker的URL,默认自动生成.
spring.activemq.broker-url=
#是否是内存模式,默认为true.
spring.activemq.in-memory=
#指定broker的密码.
spring.activemq.password=
#是否创建PooledConnectionFactory,而非ConnectionFactory,默认false
spring.activemq.pooled=
#指定broker的用户.
spring.activemq.user=
#信任所有的包
#如果传输的对象是Obeject 这里必须加上这句或者指定信任的包 否则会导致对象序列化#失败 出现classnotfound异常 详细: http://activemq.apache.org/objectmessage.html
spring.activemq.packages.trust-all=false
#指定信任的包,当有信任所有的包为true是无效的
spring.activemq.packages.trusted=
#暴露pool配置
spring.activemq.pool.configuration.*=
#是否使用PooledConnectionFactory
spring.activemq.pool.enabled=false
#连接超时时间
spring.activemq.pool.expiry-timeout=0
#空闲时间
#spring.activemq.pool.idle-timeout=30000
#最大连接数
spring.activemq.pool.max-connections=1
#指定Connection factory JNDI 名称.
spring.jms.jndi-name
#指定ack模式,默认自动ack.
spring.jms.listener.acknowledge-mode
#是否启动时自动启动jms,默认为: true
spring.jms.listener.auto-startup
#指定最小的并发消费者数量.
spring.jms.listener.concurrency
#指定最大的并发消费者数量.
spring.jms.listener.max-concurrency
#是否使用默认的destination type来支持 publish/subscribe,默认: false只支持queue
#如果设置为true则只支持topic
#如果需要两个都支持需要使用@Bean配置不同的JmsListenerContainerFactory,参见示例
spring.jms.pub-sub-domain=true -
-
-
-
-
JMS定义的消息类型有TextMessage、MapMessage、BytesMessage、StreamMessage和ObjectMessage。
TextMessage: java.lang.String对象,如xml文件内容;
MapMessage: 名/值对的集合,名是String对象,值类型可以是Java任何基本类型;
BytesMessage: 字节流
StreamMessage:Java中的输入输出流
ObjectMessage:Java中的可序列化对象 -
ActiveMQ的消息确认机制有:
AUTO_ACKNOWLEDGE 自动确认
CLIENT_ACKNOWLEDGE 客户端手动确认
DUPS_OK_ACKNOWLEDGE 自动批量确认
SESSION_TRANSACTED 事务提交并确认
INDIVIDUAL_ACKNOWLEDGE 单条消息确认 activemq 独有ACK指消息被消费后确认的机制,比如当消息被Consumer接收之后,Consumer将在何时确认消息。
对于broker( 消息队列核心,相当于一个控制中心,负责路由消息、保存订阅和连接、消息确认和控制事务
)而言,只有接收到ACK指令,才会认为消息被正确的接收或者处理成功了,通过ACK,可以在consumer(/producer)
与Broker之间建立一种简单的“担保”机制. -
使用MQ需要避免的问题:
1.消息重复消费
在某些情况下(发送消息了,队列挂了,也消费了,可能被认为/消费完了,没来及响应挂了)消息会被重复发送,导致重复消费
解决方案: 在数据库保存此消息的唯一标识,消费消息时检查是否已经消费(订单号一般唯一,所以不会出现此情况)
2.消息丢失:
单点故障或者断线可能导致消息丢失
解决方案: 设置消息持久化
在监听器中必须使用try catch 进行异常处理,防止消息消费异常
不报异常认为消息被正确消费了,否则会认为消息没有正常消费,可能重发一次(重复消费),要try catch,自己处理,保存到一个专门记录有问题订单的表里,可能服务器问题导致的订单失败 ,解决好后,从表里拿出再重新执行一次,接二连三失败,交给人工
activeMQ
最新推荐文章于 2024-07-01 17:26:20 发布