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){
Mapmap=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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。