zoukankan      html  css  js  c++  java
  • Spring-boot JMS 发送消息慢的问题解决

    1:在《ActiveMQ 基于zookeeper的主从(levelDB Master/Slave)搭建以及Spring-boot下使用》(http://www.cnblogs.com/yshyee/p/7277801.html)中,采用以下代码进行JMS消息发送:

    @Service
    public class Producer {
    
        @Autowired
        private JmsMessagingTemplate jmsTemplate;
    
        public void sendMessage(Destination destination, final String message){
            jmsTemplate.convertAndSend(destination, message);
        }
    }

    经使用JMeter进行压力测试,发现JMS的发送消息特别慢。

    2:下面通过自定义CachingConnectionFactory解决。

    (1)SenderConfig.java

    package com.example.springbootactivemq.jms;
    
    import org.apache.activemq.ActiveMQConnectionFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jms.connection.CachingConnectionFactory;
    import org.springframework.jms.core.JmsTemplate;
    
    /**
     * Created by yan on 2017/8/3.
     */
    @Configuration
    public class SenderConfig {
    
        @Value("${spring.activemq.broker-url}")
        private String brokerUrl;
    
        @Bean
        public ActiveMQConnectionFactory activeMQConnectionFactory() {
            ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
            activeMQConnectionFactory.setBrokerURL(brokerUrl);
    
            return activeMQConnectionFactory;
        }
    
        @Bean
        public CachingConnectionFactory cachingConnectionFactory() {
            return new CachingConnectionFactory(activeMQConnectionFactory());
        }
    
        @Bean
        public JmsTemplate jmsTemplate() {
            return new JmsTemplate(cachingConnectionFactory());
        }
    
        @Bean
        public Sender sender() {
            return new Sender();
        }
    }

    (2)Sender.java

    package com.example.springbootactivemq.jms;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsTemplate;

    import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import javax.jms.TextMessage; /** * Created by yan on 2017/8/3. */ public class Sender { @Autowired private JmsTemplate jmsTemplate; public void send(final String destination, final String message){ this.jmsTemplate.convertAndSend(destination, message); } }

    (3)Receiver.java

    package com.example.springbootactivemq.jms;
    
    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.jms.listener.SessionAwareMessageListener;
    import org.springframework.jms.support.JmsUtils;
    
    import javax.jms.JMSException;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    
    /**
     * Created by yan on 2017/8/3.
     */
    public class Receiver implements SessionAwareMessageListener<TextMessage> {
    
        @JmsListener(destination = "${queue.destination}")
        public void receive(String message) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    }

    (4)ReceiverConfig.java

    package com.example.springbootactivemq.jms;
    
    import org.apache.activemq.ActiveMQConnectionFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jms.annotation.EnableJms;
    import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
    
    /**
     * Created by yan on 2017/8/3.
     */
    @Configuration
    @EnableJms
    public class ReceiverConfig {
        @Value("${spring.activemq.broker-url}")
        private String brokerUrl;
    
        @Bean
        public ActiveMQConnectionFactory activeMQConnectionFactory() {
            ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
            activeMQConnectionFactory.setBrokerURL(brokerUrl);
    
            return activeMQConnectionFactory;
        }
    
        @Bean
        public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
            DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
            factory.setConnectionFactory(activeMQConnectionFactory());
            factory.setConcurrency("3-10");
    
            return factory;
        }
    
        @Bean
        public Receiver receiver() {
            return new Receiver();
        }
    }

    (5)TestCtrl.java

    package com.example.springbootactivemq.test;
    
    import com.example.springbootactivemq.jms.Sender;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * Created by yan on 2017/8/2.
     */
    @RestController
    @RequestMapping(
            value = "/test",
            headers = "Accept=application/json",
            produces = "application/json;charset=utf-8"
    )
    public class TestCtrl {
        @Autowired
        private Sender sender;
    
        @Value("${queue.destination}")
        private String destination;
    
        @RequestMapping(
                value = "/say/{msg}/to/{name}",
                method = RequestMethod.GET
        )
        public Map<String, Object> say(@PathVariable String msg, @PathVariable String name){
            Map<String, Object> map = new HashMap<>();
            map.put("msg", msg);
            map.put("name", name);
    
            sender.send(destination, msg);
    
            return map;
        }
    }

    (6)application.properties

    spring.activemq.broker-url=failover:(tcp://192.168.3.10:61616,tcp://192.168.3.11:61616,tcp://192.168.3.12:61616)
    spring.activemq.in-memory=true
    spring.activemq.pool.enabled=false
    spring.activemq.user=admin
    spring.activemq.password=admin
    
    queue.destination=test.queue
    queue.concurrency=3-10
  • 相关阅读:
    在模拟器安装测试APP,给指定设备安装APP
    设置安卓模拟器,打开模拟器,设置语言为中文
    使用appium1.4在android8.0真机上测试程序时报错command failed shell "ps 'uiautomator'"的解决方式
    appium1.4+华为8.0执行自动化脚本,报启动session失败,原因是unicode_ime_apk\Uni codeIMEdebug.apk在手机上已存在,再次安装失败,导致启动session失败,解决办法:换高版本的appium
    搭建appium+maven手机自动化测试环境搭建
    appium1.7的使用
    SDK打开模拟器遇到SDK包里缺少API组件,附上我的解决历程,心累
    简单记录下Jmeter通过CSV保存测试数据,测试用例,及将测试结果导出到Excel里
    基于webpack的React项目搭建(一)
    基于webpack的React项目搭建(二)
  • 原文地址:https://www.cnblogs.com/yshyee/p/7283064.html
Copyright © 2011-2022 走看看