activeMQ

1 篇文章 0 订阅
  1. 可应用于分布式,是在内存中操作的,用到连接池,达到复用connection session
  2. 消息模式:Point to Point, publish/Subsricbe

  3. P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
    每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中);
    发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被消费;
    接收者在成功接收消息之后需向队列应答成功;
    如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式。

  4. 包含三个角色主题(Topic),发布者(Publisher),订阅者(Subscriber) 多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
    Pub/Sub的特点
    每个消息可以有多个消费者
    发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个
    订阅者之后,才能消费发布者的消息
    为了消费消息,订阅者必须保持运行的状态
    为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订
    阅者没有被激活(运行),它也能接收到发布者的消息。
    如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费
    者处理的话,那么可以采用Pub/Sub模型。

  5. 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
    启动失败:①计算机名有下划线②端口占用

  6. 消息持久化及持久订阅
    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消息默认不进行持久化
    除非这种类型的消息不是必须被消费的,否则都应该使用持久化

  7. 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

  8. 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

  9. JMS定义的消息类型有TextMessage、MapMessage、BytesMessage、StreamMessage和ObjectMessage。
    TextMessage:  java.lang.String对象,如xml文件内容;
    MapMessage:   名/值对的集合,名是String对象,值类型可以是Java任何基本类型;
    BytesMessage: 字节流
    StreamMessage:Java中的输入输出流
    ObjectMessage:Java中的可序列化对象

  10. ActiveMQ的消息确认机制有:
    AUTO_ACKNOWLEDGE    自动确认
    CLIENT_ACKNOWLEDGE     客户端手动确认   
    DUPS_OK_ACKNOWLEDGE     自动批量确认
    SESSION_TRANSACTED     事务提交并确认
    INDIVIDUAL_ACKNOWLEDGE    单条消息确认 activemq 独有

    ACK指消息被消费后确认的机制,比如当消息被Consumer接收之后,Consumer将在何时确认消息。
    对于broker(    消息队列核心,相当于一个控制中心,负责路由消息、保存订阅和连接、消息确认和控制事务
    )而言,只有接收到ACK指令,才会认为消息被正确的接收或者处理成功了,通过ACK,可以在consumer(/producer)
    与Broker之间建立一种简单的“担保”机制.

  11. 使用MQ需要避免的问题:
        1.消息重复消费
            在某些情况下(发送消息了,队列挂了,也消费了,可能被认为/消费完了,没来及响应挂了)消息会被重复发送,导致重复消费
            解决方案: 在数据库保存此消息的唯一标识,消费消息时检查是否已经消费(订单号一般唯一,所以不会出现此情况)
        2.消息丢失:
            单点故障或者断线可能导致消息丢失
            解决方案: 设置消息持久化        
    在监听器中必须使用try catch 进行异常处理,防止消息消费异常
        不报异常认为消息被正确消费了,否则会认为消息没有正常消费,可能重发一次(重复消费),要try catch,自己处理,保存到一个专门记录有问题订单的表里,可能服务器问题导致的订单失败 ,解决好后,从表里拿出再重新执行一次,接二连三失败,交给人工

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值