1:在《ActiveMQ 基于zookeeper的主从(levelDB Master/Slave)搭建以及Spring-boot下使用》(http://www.cnblogs.com/yshyee/p/7277801.html)中,采用以下代码进行JMS消息发送:
@Servicepublic classProducer {
@AutowiredprivateJmsMessagingTemplate jmsTemplate;public void sendMessage(Destination destination, finalString message){
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;/*** Created by yan on 2017/8/3.*/@Configurationpublic classSenderConfig {
@Value("${spring.activemq.broker-url}")privateString brokerUrl;
@BeanpublicActiveMQConnectionFactory activeMQConnectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory= newActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL(brokerUrl);returnactiveMQConnectionFactory;
}
@BeanpublicCachingConnectionFactory cachingConnectionFactory() {return newCachingConnectionFactory(activeMQConnectionFactory());
}
@BeanpublicJmsTemplate jmsTemplate() {return newJmsTemplate(cachingConnectionFactory());
}
@BeanpublicSender sender() {return newSender();
}
}
(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;/*** Created by yan on 2017/8/3.*/
public classSender {
@AutowiredprivateJmsTemplate jmsTemplate;public void send(final String destination, finalString message){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;/*** Created by yan on 2017/8/3.*/
public class Receiver implements SessionAwareMessageListener{
@JmsListener(destination= "${queue.destination}")public voidreceive(String message) {try{
Thread.sleep(2000);
}catch(InterruptedException e) {
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;/*** Created by yan on 2017/8/3.*/@Configuration
@EnableJmspublic classReceiverConfig {
@Value("${spring.activemq.broker-url}")privateString brokerUrl;
@BeanpublicActiveMQConnectionFactory activeMQConnectionFactory() {
ActiveMQConnectionFactory activeMQConnectionFactory= newActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL(brokerUrl);returnactiveMQConnectionFactory;
}
@BeanpublicDefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory= newDefaultJmsListenerContainerFactory();
factory.setConnectionFactory(activeMQConnectionFactory());
factory.setConcurrency("3-10");returnfactory;
}
@BeanpublicReceiver receiver() {return newReceiver();
}
}
(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;/*** Created by yan on 2017/8/2.*/@RestController
@RequestMapping(
value= "/test",
headers= "Accept=application/json",
produces= "application/json;charset=utf-8")public classTestCtrl {
@AutowiredprivateSender sender;
@Value("${queue.destination}")privateString destination;
@RequestMapping(
value= "/say/{msg}/to/{name}",
method=RequestMethod.GET
)public Mapsay(@PathVariable String msg, @PathVariable String name){
Map map = new HashMap<>();
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=truespring.activemq.pool.enabled=falsespring.activemq.user=admin
spring.activemq.password=admin
queue.destination=test.queue
queue.concurrency=3-10