Java消息服务~@JmsListener集成

1、配置ActiveMQ连接工厂、JmsTemplate等

注意:需要开启@EnableJms。

注解@EnableJms自动扫描带有@JmsListener的Bean方法,并为其创建一个MessageListener把它包装起来

import javax.jms.ConnectionFactory;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.connection.CachingConnectionFactory;
import org.springframework.jms.core.JmsTemplate;/*** ActiveMQ配置.<br>* @author gqltt<br>*/
@Configuration
@EnableJms
public class ActiveMQConfig {/*** 队列JmsTemplate的名称.*/public static final String JMS_TEMPLATE_QUEUE = "innerJmsQueueTemplate";/*** 订阅JmsTemplate的名称.*/public static final String JMS_TEMPLATE_TOPIC = "innerJmsTopicTemplate";/*** 队列JmsListenerContainerFactory的名称.*/public static final String JMS_CONTAINER_FACTORY_QUEUE = "innerJmsQueueListenerContainerFactory";/*** 订阅JmsListenerContainerFactory的名称.*/public static final String JMS_CONTAINER_FACTORY_TOPIC = "innerJmsTopicListenerContainerFactory";/*** 获取brokerURL.*/public static String getBrokerURL() {return PropertyConfigUtil.getProperty("spring.activemq.brokerURL");}/*** 获取userName.* @return*/public static String getUserName() {return PropertyConfigUtil.getProperty("spring.activemq.userName");}/*** 获取password.* @return*/public static String getPassword() {return PropertyConfigUtil.getProperty("spring.activemq.password");}/*** ActiveMQConnectionFactory.* @return*/@Conditional(ActiveMQCondition.class)@Bean(name = "innerActiveMQConnectionFactory")public ActiveMQConnectionFactory getActiveMQConnectionFactory() {final ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();connectionFactory.setBrokerURL(getBrokerURL());connectionFactory.setUserName(getUserName());connectionFactory.setPassword(getPassword());return connectionFactory;}/*** CachingConnectionFactory.* @param targetConnectionFactory* @return*/@Conditional(ActiveMQCondition.class)@Bean(name = "innerCachingConnectionFactory")public CachingConnectionFactory getCachingConnectionFactory(@Qualifier("abcInnerActiveMQConnectionFactory") ActiveMQConnectionFactory targetConnectionFactory) {final CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();cachingConnectionFactory.setTargetConnectionFactory(targetConnectionFactory);cachingConnectionFactory.setSessionCacheSize(20);return cachingConnectionFactory;}/*** 队列JmsTemplate.* @param connectionFactory* @return*/@Conditional(ActiveMQCondition.class)@Bean(name = JMS_TEMPLATE_QUEUE)public JmsTemplate getJmsQueueTemplate(@Qualifier("innerCachingConnectionFactory") ConnectionFactory connectionFactory) {final JmsTemplate jmsTemplate = new JmsTemplate();jmsTemplate.setConnectionFactory(connectionFactory);jmsTemplate.setPubSubDomain(false);jmsTemplate.setReceiveTimeout(30_000);return jmsTemplate;}/*** 订阅JmsTemplate.* @param connectionFactory* @return*/@Conditional(ActiveMQCondition.class)@Bean(name = JMS_TEMPLATE_TOPIC)public JmsTemplate getJmsTopicTemplate(@Qualifier("innerCachingConnectionFactory") ConnectionFactory connectionFactory) {final JmsTemplate jmsTemplate = new JmsTemplate();jmsTemplate.setConnectionFactory(connectionFactory);jmsTemplate.setPubSubDomain(true);jmsTemplate.setReceiveTimeout(30_000);return jmsTemplate;}/*** 队列模式JmsListenerContainerFactory.* @param connectionFactory* @return*/@Conditional(ActiveMQCondition.class)@Bean(name = JMS_CONTAINER_FACTORY_QUEUE)public JmsListenerContainerFactory<?> getJmsQueueListenerContainerFactory(@Qualifier("innerCachingConnectionFactory") ConnectionFactory connectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setPubSubDomain(false);factory.setReceiveTimeout(30_000L);return factory;}/*** 订阅模式JmsListenerContainerFactory.* @param connectionFactory* @return*/@Conditional(ActiveMQCondition.class)@Bean(name = JMS_CONTAINER_FACTORY_TOPIC)public JmsListenerContainerFactory<?> getJmsTopicListenerContainerFactory(@Qualifier("innerCachingConnectionFactory") ConnectionFactory connectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(connectionFactory);//设置为发布订阅方式, 默认情况下使用的生产消费者方式factory.setPubSubDomain(true);factory.setReceiveTimeout(30_000L);return factory;}}

注意:使用条件判断是否初始化ActiveMQ相关对象

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;/*** 是否初始化ActiveQM的判断.<br>* @author gqltt<br>*/
public class ActiveMQCondition implements Condition {/*** {@inheritDoc}*/@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {final String brokerUrl = ActiveMQConfig.getBrokerURL();return StringUtil.isNotEmpty(brokerUrl);}}

2、发送消息

	/*** 发送保存成功【确认】信息.* @param gid*/private void sendPay(long gid) {try {final String msg = CastUtil.getString(gid);final JmsTemplate jmsTemplate = JmsTemplateUtil.getJmsQueueTemplate();jmsTemplate.convertAndSend(OrderListener.ORDER_PAYED_QUEUE, msg);} catch (Exception e) {if (LOG.isErrorEnabled()) {LOG.error("发送消息:" + OrderListener.ORDER_PAYED_QUEUE + "失败。", e);}}}

3、@JmsListener配置消息监听

import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;@Component
public class OrderListener {/*** 订单支付队列.*/public static final String ORDER_PAYED_QUEUE = "order_payed_queue";@Autowiredprivate IOrderService orderService;/*** 订单已支付,通知改订单状态.* @param msg*/@JmsListener(containerFactory = ActiveMQConfig.JMS_CONTAINER_FACTORY_QUEUE, destination = ORDER_PAYED_QUEUE)public void payed(final String msg) {if (StringUtil.isNullOrTrimEmptyString(msg)) {return;}final long gid = CastUtil.getLong(msg);orderService.updatePayed(gid);}
}

@JmsListener 接收元素的Message对象

@Component
public class MailMessageListener {final Logger logger = LoggerFactory.getLogger(getClass());@Autowired ObjectMapper objectMapper;@Autowired MailService mailService;@JmsListener(destination = "jms/queue/mail", concurrency = "10")public void onMailMessageReceived(Message message) throws Exception {logger.info("received message: " + message);if (message instanceof TextMessage) {String text = ((TextMessage) message).getText();MailMessage mm = objectMapper.readValue(text, MailMessage.class);mailService.sendRegistrationMail(mm);} else {logger.error("unable to process non-text message!");}}
}

参考:集成JMS - 廖雪峰的官方网站

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c 富文本html编辑器,富文本HTML编辑器UEditor

SDC文件模版# 1. Define clock create_clock -name "clk_in" -period 20ns [get_ports {clk_in}] # 2. tco c ...dwz简单配置与操作1.首先将dwz的文件放到你的项目中(http://yunpan.cn/QbTH4kN6UXX9B) 2.在页面中将前台数据复制到页面中,将js,css等路径配置好 3.这个…

[转]高效产品经理的五个常用原则

本文转自&#xff1a;http://www.zjgtravel.com/show.asp?articleid174 原文如下&#xff1a; 今天无意之间看见这篇文章写不错&#xff0c;转载过来和正在做管理或者步入产品经理的朋友分享下。先借助前人之鉴然总结自己的经验一定会事半功倍。多的不说具体看看下面的前人经验…

html没有插件怎么办,html网页包插件没有插入options.title

我试图通过webpack和htmlwebpack插件动态地将标题注入html。我用的是车把模板引擎。但我没有注射title. 下面是我的webpack配置-/*|----------------------------------------------| setting up webpack build process for app| author: jahid haque| copyright: mysite, 2019…

SpringBoot 自带工具类

来源&#xff1a;SpringBoot 那些天生自带 Buff 的工具类&#xff0c;你用过几个&#xff1f; 断言 断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况 Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert …

linux python 永久添加自己的模块路径

Linux 环境变量配置 : https://blog.csdn.net/freeking101/article/details/81013045 linux python 永久添加自己的模块路径 添加路径: cd /usr/local/python3/lib/python3.6/site-packages vi my.pth 1 . 临时性添加>>>import sys >>>sys.path.a…

边缘计算:智慧城市的下一个浪潮

来源&#xff1a;资本实验室 作者&#xff1a;王进目前&#xff0c;在全球&#xff0c;智慧城市建设处于一个概念到逐步落地的过程&#xff0c;而科技巨头与投资大佬是这一新浪潮重要的参与者。2017年10月&#xff0c;Alphabet旗下城市创新部门Sidewalk Labs宣布&#xff0c;将…

部分代码规范

1 编程风格 4 1.1 统一编程风格的意义 4 1.2 变量命名规则 4 1.3 函数命名规则 5 1.4 类命名规则 5 1.5 常见语句书写规则 6 1.6 注释风格 7 2 代码组织 7 3 代码优化 8 3.1 代码优化的意义 8 3.2 函数内的代码优化 8 3.3 类内的代码优化 9 3.4 类之间的代码优化 10 4 调试技巧…

Nature:揭示大脑中的免疫记忆

来源&#xff1a;生物谷摘要&#xff1a;在一项新的研究中&#xff0c;德国研究人员报道身体中的炎症可能影响小鼠大脑中的免疫细胞的“记忆”。在一项新的研究中&#xff0c;德国研究人员报道身体中的炎症可能影响小鼠大脑中的免疫细胞的“记忆”。如果这一发现在人体中得到证…

辨别 Python 中 load 和 loads 的小技巧

load 和 loads 都是实现“反序列化”&#xff0c;load 通过 json.load(open(*.json)) 这样的格式&#xff0c;从文件句柄中打开文件&#xff0c;加载到Python的变量中&#xff0c;并以字典的格式转换。而 loads 必须对于 Python内存中的序列化对象转换成字符串。 load 和 load…

SpringBoot 自带工具类~断言

SpringBoot 中提供了 Assert 断言工具类&#xff0c;通常用于数据合法性检查 org.springframework.util.Assert // 要求参数 object 必须为非空&#xff08;Not Null&#xff09;&#xff0c;否则抛出异常&#xff0c;不予放行 // 参数 message 参数用于定制异常信息。 v…

电竞专业与计算机专业,2021电竞专业的大学排名 电竞专业主要上什么课程

2017年教育部下文增设电竞专业&#xff0c;电子竞技人才培养体系正式形成。为了让广大电竞爱好者&#xff0c;从业者&#xff0c;考生及家长全面客观地了解电竞教育现状&#xff0c;电竞专业高校排行榜应运而生&#xff01;2021年电竞专业大学排行榜1、中国传媒大学南广学院中国…

是精通CSS吗?

经常看到些招聘都要求精通“CSS手写代码”、“通过W3C验证”、“兼容IE5678,FF,opera,safari…”&#xff0c;姑且对其自身认识的准确度不谈&#xff0c;所罗列的这一大堆东西真的觉得是有意义的吗&#xff1f; 难道CSS的最高境界就是熟知各浏览器的对HTML/XHTML&#xff0c;CS…

计算机主机部件与外设的工作原理,计算机组成原理名词解释和简答

第一章名词解释&#xff1a;1.中央处理器&#xff1a;主要由运算器和控制器组成。控制部件&#xff0c;运算部件&#xff0c;存储部件相互协调&#xff0c;共同完成对指令的执行。2.ALU&#xff1a;对数据进行算术和逻辑运算处理的部件。3.数据通路&#xff1a;由操作元件和存储…

Linux 源码安装 Python3 和 pip3

From&#xff1a;https://www.cnblogs.com/Mrhuangrui/p/7722531.html Python 包管理工具 pip 安装 和 使用&#xff1a; https://blog.csdn.net/freeking101/article/details/53445982 安装 Python3 下载源码包https://www.python.org/downloads/解压(以3.64版本为例) wget h…

周志华:满足这三大条件,可以考虑不用深度神经网络

来源&#xff1a; AI科技大本营摘要&#xff1a;4 月 15 日举办的京东人工智能创新峰会上&#xff0c;刚刚上任京东人工智能南京分院学术总顾问的周志华教授做了《关于深度学习一点思考》的公开分享。近年来&#xff0c;深度神经网络在语音、图像领域取得突出进展&#xff0c;以…

浅析C#的事件处理和自定义事件

一、简单的自定义事件(1)&#xff1a;无参数 namespace UserInputMonitor { class UserInputMonitor { public delegate void UserRequest(object sender, EventArgs e); //定义委托 public event UserRequest OnUserRequest; //此委托类型类型的事件 public void Run() { bool…

SpringBoot 自带工具类~ObjectUtils

org.springframework.util.ObjectUtils 1、获取对象的基本信息 // 获取对象的类名。参数为 null 时&#xff0c;返回字符串&#xff1a;"null" String nullSafeClassName(Object obj) // 参数为 null 时&#xff0c;返回 0 int nullSafeHashCode(Object obje…

ibatis常用的集中判断语句

<isPropertyAvailable> 属性是存在<isNotPropertyAvailable> 属性不存在<isNull> 属性值是null<isEmpty> 判断Collection.size<1或String.length()<1<isEqual> 等于<isNotEqual> 不等于<isGreaterThan> 大于<isGreaterEqua…

网络计算机显示10,win10电脑网络显示一个球怎么回事

win10电脑网络显示一个球怎么回事&#xff1f;win10上不了网怎么办&#xff1f;其实这个是网络连接图标&#xff0c;只是因为没网络了就会变成地球图标。那么当出现win10网络变成球状怎么办呢&#xff1f;下面小编教下大家win10电脑网络显示一个球的解决方法。方法一&#xff1…

专家观点 | 李德仁:基于云计算的智慧城市运营脑

来源&#xff1a;智慧城市产业与技术创新战略联盟中国科学院、中国工程院院士李德仁发表了“基于云计算的智慧城市运营脑”的主题报告&#xff0c;深度解读了以公共云服务平台为核心的智慧城市运营脑。首先&#xff0c;李院士就智慧城市及其应用发表了自己的见解。他认为&#…