springboot内嵌ActiveMQ
ps: springboot 2.2.7
1、增加依赖
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-activemq</artifactId> |
| </dependency> |
| |
| <dependency> |
| <groupId>org.messaginghub</groupId> |
| <artifactId>pooled-jms</artifactId> |
| </dependency> |
2、增加MQ优化的配置
| package com.platform.gis.common.config; |
| |
| import org.apache.activemq.ActiveMQConnectionFactory; |
| import org.apache.activemq.RedeliveryPolicy; |
| import org.springframework.context.annotation.Bean; |
| import org.springframework.context.annotation.Configuration; |
| import org.springframework.jms.config.DefaultJmsListenerContainerFactory; |
| import org.springframework.jms.config.JmsListenerContainerFactory; |
| import org.springframework.jms.core.JmsMessagingTemplate; |
| import org.springframework.jms.core.JmsTemplate; |
| import org.springframework.jms.listener.SimpleMessageListenerContainer; |
| |
| import javax.jms.ConnectionFactory; |
| |
| @Configuration |
| public class ActiveMQConfig { |
| |
| @Bean |
| public JmsListenerContainerFactory<?> queueListenerFactory() { |
| DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); |
| SimpleMessageListenerContainer container=new SimpleMessageListenerContainer(); |
| container.setConcurrentConsumers(3); |
| container.setConnectionFactory(connectionFactory()); |
| factory.setPubSubDomain(false); |
| factory.setConnectionFactory(connectionFactory()); |
| |
| factory.setConcurrency("3-15"); |
| |
| factory.setRecoveryInterval(1000L); |
| factory.setSessionAcknowledgeMode(4); |
| return factory; |
| } |
| @Bean |
| public ConnectionFactory connectionFactory() { |
| ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); |
| connectionFactory.setTrustAllPackages(true); |
| connectionFactory.setRedeliveryPolicy(redeliveryPolicy()); |
| return connectionFactory; |
| } |
| |
| @Bean |
| public RedeliveryPolicy redeliveryPolicy(){ |
| RedeliveryPolicy redeliveryPolicy=new RedeliveryPolicy(); |
| |
| redeliveryPolicy.setUseExponentialBackOff(true); |
| |
| redeliveryPolicy.setMaximumRedeliveries(3); |
| |
| redeliveryPolicy.setInitialRedeliveryDelay(1); |
| |
| redeliveryPolicy.setBackOffMultiplier(2); |
| |
| redeliveryPolicy.setUseCollisionAvoidance(false); |
| |
| redeliveryPolicy.setMaximumRedeliveryDelay(-1); |
| return redeliveryPolicy; |
| } |
| |
| @Bean |
| public JmsTemplate jmsTemplate(){ |
| JmsTemplate jmsTemplate=new JmsTemplate(connectionFactory()); |
| |
| jmsTemplate.setDeliveryMode(1); |
| |
| |
| jmsTemplate.setSessionAcknowledgeMode(4); |
| return jmsTemplate; |
| } |
| |
| @Bean |
| public JmsMessagingTemplate jmsMessageTemplate(){ |
| return new JmsMessagingTemplate(connectionFactory()); |
| } |
| |
| } |
3、启动activeMq的内嵌连接
工具类启动mq服务
| package com.platform.gis.common.util; |
| |
| import org.apache.activemq.broker.BrokerService; |
| |
| public class ActiveMQUtils { |
| |
| private static final String BROKERURL = "tcp://localhost:61616"; |
| |
| public static void startBrokerService(){ |
| try { |
| BrokerService broker = new BrokerService(); |
| broker.addConnector(BROKERURL); |
| broker.setPersistent(false); |
| broker.start(); |
| }catch (Exception e){ |
| |
| } |
| } |
| } |
| public static void main(String[] args) { |
| |
| ActiveMQUtils.startBrokerService(); |
| SpringContextUtil.setApplicationContext(SpringApplication.run(AdminServiceApplication.class, args)); |
| |
| } |
4、增加生产者
| package com.platform.gis.common.producer; |
| |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.jms.core.JmsMessagingTemplate; |
| import org.springframework.stereotype.Service; |
| |
| import javax.jms.Destination; |
| |
| @Service |
| public class JmsProduce { |
| |
| @Autowired |
| private JmsMessagingTemplate jmsTemplate; |
| |
| |
| public void sendMessage(Destination destination, final Object message) { |
| jmsTemplate.convertAndSend(destination, message); |
| } |
| } |
5、增加消费者
| package com.platform.gis.admin.consumer; |
| |
| import com.alibaba.fastjson.JSON; |
| import com.alibaba.fastjson.JSONObject; |
| import com.platform.gis.admin.constant.SysConstanst; |
| import com.platform.gis.admin.dao.SysMessageDao; |
| import com.platform.gis.admin.log.po.SysInterfaceLog; |
| import com.platform.gis.admin.message.po.SysMessage; |
| import com.platform.gis.admin.message.vo.SysMessageVo; |
| import com.platform.gis.admin.service.SysLogService; |
| import com.platform.gis.admin.service.SysSendMessageService; |
| import com.platform.gis.common.constant.CommonConstant; |
| import com.platform.gis.common.util.Pages; |
| import org.apache.commons.lang3.exception.ExceptionUtils; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| import org.springframework.beans.factory.annotation.Autowired; |
| import org.springframework.data.redis.core.RedisTemplate; |
| import org.springframework.jms.annotation.JmsListener; |
| import org.springframework.scheduling.annotation.Scheduled; |
| import org.springframework.stereotype.Component; |
| |
| import javax.jms.JMSException; |
| import javax.jms.Message; |
| import javax.jms.Session; |
| import javax.jms.TextMessage; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| @Component |
| public class JmsConsumer { |
| |
| protected final Logger LOG = LoggerFactory.getLogger(getClass()); |
| |
| @Autowired |
| SysSendMessageService sysSendMessageService; |
| |
| @Autowired |
| SysLogService sysLogService; |
| |
| @Autowired |
| private SysMessageDao sysMessageDao; |
| |
| @Autowired |
| protected RedisTemplate<String, Object> jsonRedisTemplate; |
| |
| |
| |
| |
| |
| |
| @JmsListener(destination = SysConstanst.MESSAGE_QUEUE_EMAIL) |
| public void emailReceiveQueue(Message message, Session session) throws JMSException { |
| SysMessageVo sysMessageVo = new SysMessageVo(); |
| String text = ""; |
| try { |
| TextMessage msg = (TextMessage) message; |
| text = msg.getText(); |
| JSONObject jsonObject = JSON.parseObject(text); |
| sysMessageVo = JSON.toJavaObject(jsonObject, SysMessageVo.class); |
| if (sysMessageVo != null) { |
| sysSendMessageService.sendMail(sysMessageVo); |
| sysMessageVo.setStatus("1"); |
| } |
| |
| message.acknowledge(); |
| } catch (Exception e) { |
| LOG.error(e.getLocalizedMessage(), e); |
| if (sysMessageVo != null) { |
| sysMessageVo.setStatus("2"); |
| sysMessageVo.setErrorReason(ExceptionUtils.getStackTrace(e)); |
| } |
| |
| session.recover(); |
| } finally { |
| if (sysMessageVo != null) { |
| SysMessage sysMessage = Pages.convert(sysMessageVo, SysMessage.class); |
| sysMessageDao.updateById(sysMessage); |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| |
| @JmsListener(destination = SysConstanst.MESSAGE_QUEUE_SMS) |
| public void smsReceiveQueue(Message message, Session session) throws JMSException { |
| SysMessageVo sysMessageVo = new SysMessageVo(); |
| String text = ""; |
| Map<String, String> msgResult = new HashMap<String, String>(); |
| try { |
| TextMessage msg = (TextMessage) message; |
| text = msg.getText(); |
| JSONObject jsonObject = JSON.parseObject(text); |
| sysMessageVo = JSON.toJavaObject(jsonObject, SysMessageVo.class); |
| if (sysMessageVo != null) { |
| msgResult = sysSendMessageService.sendSMS(sysMessageVo); |
| JSONObject smsResult = JSONObject.parseObject(msgResult.get("result")); |
| if ("SUC0000".equals(smsResult.get("rtcode").toString())) { |
| sysMessageVo.setStatus("1"); |
| } else { |
| String errorMessage = smsResult.get("rtmsg").toString(); |
| LOG.error("SMS failed to send,the reason is:" + errorMessage); |
| sysMessageVo.setErrorReason(errorMessage); |
| } |
| } |
| |
| message.acknowledge(); |
| } catch (Exception e) { |
| LOG.error(e.getLocalizedMessage(), e); |
| if (sysMessageVo != null) { |
| sysMessageVo.setStatus("2"); |
| sysMessageVo.setErrorReason(ExceptionUtils.getStackTrace(e)); |
| } |
| |
| session.recover(); |
| } finally { |
| if (sysMessageVo != null) { |
| sysMessageVo.setContent(msgResult.get("sendJson")); |
| SysMessage sysMessage = Pages.convert(sysMessageVo, SysMessage.class); |
| sysMessageDao.updateById(sysMessage); |
| } |
| } |
| } |
| |
| |
| |
| |
| @Scheduled(fixedDelay = SysConstanst.SCHEDULED_AUDIT_LOG_TIME) |
| public void auditLogQueue() { |
| sysLogService.saveAuditLogToDb(); |
| } |
| |
| |
| |
| |
| |
| @JmsListener(destination = CommonConstant.MESSAGE_QUEUE_INTERFACE_LOG) |
| public void interfaceLogQueue(Message message, Session session) throws JMSException { |
| SysInterfaceLog sysInterfaceLog = null; |
| String text = ""; |
| try { |
| TextMessage msg = (TextMessage) message; |
| text = msg.getText(); |
| JSONObject jsonObject = JSON.parseObject(text); |
| sysInterfaceLog = JSON.toJavaObject(jsonObject, SysInterfaceLog.class); |
| if (sysInterfaceLog != null) { |
| sysLogService.saveInterfaceLog(sysInterfaceLog); |
| } |
| |
| message.acknowledge(); |
| } catch (Exception e) { |
| LOG.error(e.getLocalizedMessage(), e); |
| |
| session.recover(); |
| } |
| } |
| |
| } |
6、增加消息调用MQ
注入
| @Autowired |
| private JmsProduce producer; |
增加管道(生产不同的queue:不同的queue相当于不同的消费逻辑)
| Destination destination = destination = new ActiveMQQueue(SysConstanst.MESSAGE_QUEUE_EMAIL); |
| producer.sendMessage(destination, JSON.toJSONString(sysMessageVo)); |
7、查看是否调用成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!