Spring-boot JMS 发送消息慢的解决方法
Spring-bootJMS发送消息慢的问题解决
1、在《ActiveMQ基于zookeeper的主从(levelDBMaster/Slave)搭建以及Spring-boot下使用》中,采用以下代码进行JMS消息发送:
@Service publicclassProducer{ @Autowired privateJmsMessagingTemplatejmsTemplate; publicvoidsendMessage(Destinationdestination,finalStringmessage){ jmsTemplate.convertAndSend(destination,message); } }
经使用JMeter进行压力测试,发现JMS的发送消息特别慢。
2、下面通过自定义CachingConnectionFactory解决。
(1)SenderConfig.java
packagecom.example.springbootactivemq.jms; importorg.apache.activemq.ActiveMQConnectionFactory; importorg.springframework.beans.factory.annotation.Value; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.jms.connection.CachingConnectionFactory; importorg.springframework.jms.core.JmsTemplate; /** *Createdbyyanon2017/8/3. */ @Configuration publicclassSenderConfig{ @Value("${spring.activemq.broker-url}") privateStringbrokerUrl; @Bean publicActiveMQConnectionFactoryactiveMQConnectionFactory(){ ActiveMQConnectionFactoryactiveMQConnectionFactory=newActiveMQConnectionFactory(); activeMQConnectionFactory.setBrokerURL(brokerUrl); returnactiveMQConnectionFactory; } @Bean publicCachingConnectionFactorycachingConnectionFactory(){ returnnewCachingConnectionFactory(activeMQConnectionFactory()); } @Bean publicJmsTemplatejmsTemplate(){ returnnewJmsTemplate(cachingConnectionFactory()); } @Bean publicSendersender(){ returnnewSender(); } }
(2)Sender.java
packagecom.example.springbootactivemq.jms; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.jms.core.JmsTemplate; importjavax.jms.JMSException; importjavax.jms.Message; importjavax.jms.Session; importjavax.jms.TextMessage; /** *Createdbyyanon2017/8/3. */ publicclassSender{ @Autowired privateJmsTemplatejmsTemplate; publicvoidsend(finalStringdestination,finalStringmessage){ this.jmsTemplate.convertAndSend(destination,message); } }
(3)Receiver.java
packagecom.example.springbootactivemq.jms; importorg.springframework.jms.annotation.JmsListener; importorg.springframework.jms.listener.SessionAwareMessageListener; importorg.springframework.jms.support.JmsUtils; importjavax.jms.JMSException; importjavax.jms.MessageProducer; importjavax.jms.Session; importjavax.jms.TextMessage; /** *Createdbyyanon2017/8/3. */ publicclassReceiverimplementsSessionAwareMessageListener{ @JmsListener(destination="${queue.destination}") publicvoidreceive(Stringmessage){ try{ Thread.sleep(2000); }catch(InterruptedExceptione){ e.printStackTrace(); } } }
(4)ReceiverConfig.java
packagecom.example.springbootactivemq.jms; importorg.apache.activemq.ActiveMQConnectionFactory; importorg.springframework.beans.factory.annotation.Value; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.jms.annotation.EnableJms; importorg.springframework.jms.config.DefaultJmsListenerContainerFactory; /** *Createdbyyanon2017/8/3. */ @Configuration @EnableJms publicclassReceiverConfig{ @Value("${spring.activemq.broker-url}") privateStringbrokerUrl; @Bean publicActiveMQConnectionFactoryactiveMQConnectionFactory(){ ActiveMQConnectionFactoryactiveMQConnectionFactory=newActiveMQConnectionFactory(); activeMQConnectionFactory.setBrokerURL(brokerUrl); returnactiveMQConnectionFactory; } @Bean publicDefaultJmsListenerContainerFactoryjmsListenerContainerFactory(){ DefaultJmsListenerContainerFactoryfactory=newDefaultJmsListenerContainerFactory(); factory.setConnectionFactory(activeMQConnectionFactory()); factory.setConcurrency("3-10"); returnfactory; } @Bean publicReceiverreceiver(){ returnnewReceiver(); } }
(5)TestCtrl.java
packagecom.example.springbootactivemq.test; importcom.example.springbootactivemq.jms.Sender; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.beans.factory.annotation.Value; importorg.springframework.web.bind.annotation.PathVariable; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestMethod; importorg.springframework.web.bind.annotation.RestController; importjava.util.HashMap; importjava.util.Map; /** *Createdbyyanon2017/8/2. */ @RestController @RequestMapping( value="/test", headers="Accept=application/json", produces="application/json;charset=utf-8" ) publicclassTestCtrl{ @Autowired privateSendersender; @Value("${queue.destination}") privateStringdestination; @RequestMapping( value="/say/{msg}/to/{name}", method=RequestMethod.GET ) publicMapsay(@PathVariableStringmsg,@PathVariableStringname){ Map map=newHashMap<>(); map.put("msg",msg); map.put("name",name); sender.send(destination,msg); returnmap; } }
(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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。