本文是结合过去几年中项目的mq中间件的使用,把activeMQ引入springboot项目的过程,还有实际过程中使用的范例,从消息发送到消息接收的代码例子都有,已经过两年大量数据考验,下面就是整个相关的代码,供初学者学习和使用参考。
<!--activemq 消息中间件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
#在springboot项目的application.yml的配置 默认的密码和端口 61616是mq通过tcp传输协议的通讯端口
#通过浏览器查看管理mq的 http://xx.xxx.xx.xx:8161/admin
activemq:
broker-url: tcp://xx.xxx.xx.xx:61616
user: admin
password: admin
in-memory: false
close-timeout: 5000
packages:
trust-all: false
@Configuration
@EnableJms
public class JmsConfig {
/**
* 操作xxxxx数据
* @return
*/
@Bean
public Queue xxxxxData() {
return new ActiveMQQueue("xxxxxData");
}
/**
* 普通方式实现
*
* @param brokerUrl
* @param userName
* @param password
* @return
*/
@Bean(name = "xxConnectionFactory1")
public ActiveMQConnectionFactory getXxConnectionFactory(@Value("${activemq.broker-url}") String brokerUrl,
@Value("${activemq.user}") String userName, @Value("${activemq.password}") String password) {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(brokerUrl);
connectionFactory.setUserName(userName);
connectionFactory.setPassword(password);
return connectionFactory;
}
/**
* 池方式实现
*
* @param brokerUrl
* @param userName
* @param password
* @return
*/
@Bean(name = "xxPoolConnectionFactory")
public PooledConnectionFactory getXxPoolConnectionFactory(@Value("${activemq.broker-url}") String brokerUrl,
@Value("${activemq.user}") String userName, @Value("${activemq.password}") String password) {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(brokerUrl);
connectionFactory.setUserName(userName);
connectionFactory.setPassword(password);
PooledConnectionFactory cf = new PooledConnectionFactory(connectionFactory);
//#连接池最大连接数
cf.setMaxConnections(150);
//空闲的连接过期时间,默认为30秒
cf.setIdleTimeout(30000);
//#强制的连接过期时间,与idleTimeout的区别在于:idleTimeout是在连接空闲一段时间失效,而expiryTimeout不管当前连接的情况,只要达到指定时间就失效。默认为0,never
cf.setExpiryTimeout(0);
return cf;
}
/**
* 定义JmsMessagingTemplate
*
* @param connectionFactory
* @return
*/
@Bean(name = "xxJmsTemplate")
public JmsMessagingTemplate getXxJmsTemplate(
@Qualifier("xxPoolConnectionFactory") ConnectionFactory connectionFactory) {
JmsMessagingTemplate template = new JmsMessagingTemplate(connectionFactory);
return template;
}
/**
* queue模式的ListenerContainer
*
* @param connectionFactory
* @return
*/
@Bean(name = "xxQueueListener")
public DefaultJmsListenerContainerFactory getXxQueueListener(
@Qualifier("xxPoolConnectionFactory") ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrency("15");
// change acknowledge mode
// factory.setSessionAcknowledgeMode(4);
return factory;
}
/**
* topic模式的ListenerContainer
*
* @param connectionFactory
* @return
*/
@Bean(name = "xxTopicListener")
public DefaultJmsListenerContainerFactory getXxTopicListener(
@Qualifier("xxPoolConnectionFactory") ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
// if topic, set true
factory.setPubSubDomain(true);
factory.setConcurrency("15");
// change acknowledge mode
// factory.setSessionAcknowledgeMode(4);
return factory;
}
}
@Component
@Slf4j
public class QueueSender {
@Resource
@Qualifier("xxJmsTemplate")
JmsMessagingTemplate jmsTemplate;
/**
* 操作xxxxx数据
*/
@Resource
private Queue xxxxxJdptMailData;
public void pushXxxxDataQueue(final String message) {
this.jmsTemplate.convertAndSend(xxxxxData, message);
}
}
public class DataXxxServiceImpl implements DataXxxService {
private final DataXxxMapper dataXxxMapper;
private final QueueSender queueSender;
//Xxxxx为实体对象,这里只是举个栗子
@Override
@Async("xxxAsyncServiceExecutor")
public Future<Boolean> dataHandle(Xxxxx xxx){
queueSender.pushXxxxDataQueue(JSONUtil.toJsonStr(xxx));
dataXxxMapper.updateStat(xxx);
return new AsyncResult<>(true);
}
}
@Component
@AllArgsConstructor
@Slf4j
public class ActiveMqXxxQueueReceiver {
private final IXxxxService xxxxService;
/**
* 接收xxxx数据
*
* @param message
*/
@JmsListener(destination = "xxxxxData", containerFactory = "xxQueueListener")
public void receiveXxxxxDataQueue(String message) {
log.info("接收xxxxx数据:{}", message);
try {
xxxxService.receiveXxxxlDataQueue(message);
} catch (Exception e) {
e.printStackTrace();
log.error("接收xxxxDataQueue数据列数据失败:{}", message);
}
}
}
//接收转化处理
@Override
@Transactional(rollbackFor = Exception.class)
public void receiveXxxxDataQueue(String message) {
//hutool工具转化
Xxxx x= JSONUtil.toBean(message, Xxxx.class);
//Map returnedMap = _GsonUtils.json2Obj(message);
//。。。。。
}