资讯专栏INFORMATION COLUMN

SpringBoot ActiveMq JmsTemplate 异步发送、非持久化

AprilJ / 1793人阅读

摘要:异步发送不会在受到的确认之前一直阻塞方法。方法成功返回意味着所有的持久消息都以被写到二级存储中。总结默认情况,非持久化消息事务内的消息均采用异步发送对于持久化消息采用同步发送。

ActiveMq事务

ActiveMq事务的作用就是在发送、接收处理消息过程中,如果出现问题,可以回滚。

ActiveMq异步/同步发送

以下摘抄自https://blog.csdn.net/songhai...

同步发送:
消息生产者使用持久(persistent)传递模式发送消息的时候,Producer.send() 方法会被阻塞,直到 broker 发送一个确认消息给生产者(ProducerAck),这个确认消息暗示broker已经成功接收到消息并把消息保存到二级存储中。

异步发送
如果应用程序能够容忍一些消息的丢失,那么可以使用异步发送。异步发送不会在受到 broker 的确认之前一直阻塞 Producer.send 方法。

当发送方法在一个事务上下文中时,被阻塞的是 commit 方法而不是 send 方法。commit 方法成功返回意味着所有的持久消息都以被写到二级存储中。

想要使用异步,在brokerURL中增加 jms.alwaysSyncSend=false&jms.useAsyncSend=true
如果设置了alwaysSyncSend=true系统将会忽略useAsyncSend设置的值都采用同步
     1) 当alwaysSyncSend=false时,“NON_PERSISTENT”(非持久化)、事务中的消息将使用“异步发送”
     2) 当alwaysSyncSend=false时,如果指定了useAsyncSend=true,“PERSISTENT”类型的消息使用异步发送。如果useAsyncSend=false,“PERSISTENT”类型的消息使用同步发送。
总结:默认情况(alwaysSyncSend=false,useAsyncSend=false),非持久化消息、事务内的消息均采用异步发送;对于持久化消息采用同步发送。
   jms.sendTimeout:发送超时时间,默认等于0,如果jms.sendTimeout>0将会忽略(alwaysSyncSend、useAsyncSend、消息是否持久化)所有的消息都是用同步发送!

官方连接:http://activemq.apache.org/as...

配置使用异步发送方式

1.在连接上配置
cf = new ActiveMQConnectionFactory("tcp://locahost:61616?jms.useAsyncSend=true");

2.通过ConnectionFactory
((ActiveMQConnectionFactory)connectionFactory).setUseAsyncSend(true);

3.通过connection
((ActiveMQConnection)connection).setUseAsyncSend(true);

SpringBoot JMS实现异步发送

1.如果在配置中使用了连接池,那么SpringBoot默认会使用PooledConnectionFactory,ActiveMQConnectionFactory的useAsyncSend默认会true。使用连接池配置如下

activemq:
    in-memory: true
    broker-url: tcp://127.0.0.1:61616
    pool:
      enabled: true
      max-connections: 5
    user:
    password:

2.修改JmsTemplate 默认参数

JmsTemplate template = new JmsTemplate(pooledConnectionFactory);
//设备为true,deliveryMode, priority, timeToLive等设置才会起作用
template.setExplicitQosEnabled(true);
//设为非持久化模式
template.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

完整代码如下:

@Slf4j
@Configuration
public class ActiveConfig {
    /**
     * 配置用于异步发送的非持久化JmsTemplate
     */ 
    @Autowired
    @Bean
    @Primary
    public JmsTemplate asynJmsTemplate(PooledConnectionFactory pooledConnectionFactory) {
        JmsTemplate template = new JmsTemplate(pooledConnectionFactory);
        template.setExplicitQosEnabled(true);
        template.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        log.info("jsmtemplate ------------->sessionTransacted:{}",template.isSessionTransacted());
        log.info("jsmtemplate ------------->ExplicitQosEnabled:{}",template.isExplicitQosEnabled());
        return template;
    }

    /**
     * 配置用于同步发送的持久化JmsTemplate
     */  
    @Autowired
    @Bean
    public JmsTemplate synJmsTemplate(PooledConnectionFactory pooledConnectionFactory) {
        JmsTemplate template = new JmsTemplate(pooledConnectionFactory);
        log.info("jsmtemplate ------------->sessionTransacted:{}",template.isSessionTransacted());
        log.info("jsmtemplate ------------->ExplicitQosEnabled:{}",template.isExplicitQosEnabled());
        return template;
    }

//如果对于SpringBoot自动生成的PooledConnectionFactory需要调优,可以自己生PooledConnectionFactory调优参数
//    private PooledConnectionFactory getPooledConnectionFactory(String userName,String password,String brokerURL) {
//        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(userName,password,brokerURL);
//        ActiveMQPrefetchPolicy activeMQPrefetchPolicy = new ActiveMQPrefetchPolicy();
//        activeMQConnectionFactory.setPrefetchPolicy(activeMQPrefetchPolicy);
//        PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(activeMQConnectionFactory);
//        pooledConnectionFactory.setMaxConnections(5);
//        return pooledConnectionFactory;
//    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72773.html

相关文章

  • JMS 在 SpringBoot 中的使用

    摘要:本文主要讲述消息服务在中的使用。所以需要一个监听容器工厂的概念,即接口,它会引用上面创建好的与的连接工厂,由它来负责接收消息以及将消息分发给指定的监听器。为了消费消息,订阅者必须保持运行的状态。 JMS 在 SpringBoot 中的使用 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog> 本文所有服务均采用doc...

    Michael_Ding 评论0 收藏0
  • SpringBoot ActiveMQ 整合使用

    摘要:介绍它是出品,最流行的,能力强劲的开源消息总线。是一个完全支持和规范的实现,尽管规范出台已经是很久的事情了,但是在当今的应用中间仍然扮演着特殊的地位。相关文章整合使用整合使用关注我转载请务必注明原创地址为安装同之前一样,直接在里面玩吧。 showImg(https://segmentfault.com/img/remote/1460000012996066?w=1920&h=1281)...

    gaara 评论0 收藏0
  • 慕课网_《Java消息中间件》学习总结

    摘要:时间年月日星期六说明本文部分内容均来自慕课网。这个时候,可以启动多台积分系统,来同时消费这个消息中间件里面的登录消息,达到横向扩展的作用。 时间:2017年07月22日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:课程介绍 1-1 课程安排 Java...

    twohappy 评论0 收藏0
  • 消息队列ActiveMQ的使用详解

    摘要:学习消息队列的使用之前,我们先来搞清。是操作消息的接口。消息生产者由创建,并用于将消息发送到。接收消息打印结果这是接收到的消息消费者启动。。。。 通过上一篇文章 《消息队列深入解析》,我们已经消息队列是什么、使用消息队列的好处以及常见消息队列的简单介绍。 这一篇文章,主要带大家详细了解一下消息队列ActiveMQ的使用。 学习消息队列ActiveMQ的使用之前,我们先来搞清JMS。 J...

    niceforbear 评论0 收藏0
  • 深入浅出 JMS(七) - ActiveMQ 与 Spring 整合

    摘要:消费者,监听生产者往指定目的地发送消息后,接下来就是消费者对指定目的地的消息进行消费了。它不会动态的适应运行时需要和参与外部的事务管理。它很好的平衡了对提供者要求低先进功能如事务参与和兼容环境。 深入浅出 JMS(七) - ActiveMQ 与 Spring 整合 一、与spring整合实现ptp的同步接收消息 (1)config.properties ## ActiveMQ Conf...

    NoraXie 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<