使用Spring Boot和注释支持配置Spring JMS应用程序

1.简介

在以前的文章中,我们学习了如何使用Spring JMS配置项目。 如果查看有关使用Spring JMS进行消息传递的文章介绍 ,您会注意到它是使用XML配置的。 本文将利用Spring 4.1版本中引入的改进 ,并仅使用Java config来配置JMS项目。

在这个示例中,我们还将看到使用Spring Boot配置项目是多么容易。

在开始之前,请注意,与往常一样,您可以看一下下面示例中使用的项目的源代码。

请参阅github上的示例项目 。

栏目:

  1. 介绍。
  2. 示例应用程序。
  3. 设置项目。
  4. 一个使用JMS侦听器的简单示例。
  5. 使用@SendTo将响应发送到另一个队列。
  6. 结论。

2.示例应用程序

该应用程序使用客户端服务将订单发送到JMS队列,在该队列中将注册JMS侦听器并处理这些订单。 收到后,侦听器将通过Store服务存储订单:

jms_diagram

我们将使用Order类来创建订单:

public class Order implements Serializable {private static final long serialVersionUID = -797586847427389162L;private final String id;public Order(String id) {this.id = id;}public String getId() {return id;}
}

在继续第一个示例之前,我们将首先探讨如何构建项目结构。

3.设置项目

3.1配置pom.xml

首先要做的是将工件spring-boot-starter-parent定义为我们的父pom。

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.2.3.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent>

这个父级基本上设置了几个Maven默认值,并为我们将使用的主要依赖项提供了依赖项管理,例如Spring版本(4.1.6)。

重要的是要注意,此父pom定义了许多库的版本,但未对我们的项目添加任何依赖关系。 因此,不必担心会得到不使用的库。

下一步是设置Spring Boot的基本依赖关系:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>

除了核心Spring库之外,此依赖项还将带来Spring Boot的自动配置功能。 这将允许框架尝试根据您添加的依赖项自动设置配置。

最后,我们将添加Spring JMS依赖项和ActiveMQ消息代理,将整个pom.xml保留如下:

<groupId>xpadro.spring</groupId>
<artifactId>jms-boot-javaconfig</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>JMS Spring Boot Javaconfig</name><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.2.3.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><start-class>xpadro.spring.jms.JmsJavaconfigApplication</start-class><java.version>1.8</java.version><amq.version>5.4.2</amq.version>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-core</artifactId><version>${amq.version}</version></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

3.2使用Java Config进行Spring配置

配置类仅需要配置嵌入式消息代理。 其余的由Spring Boot自动配置:

@SpringBootApplication
public class JmsJavaconfigApplication {private static final String JMS_BROKER_URL = "vm://embedded?broker.persistent=false,useShutdownHook=false";@Beanpublic ConnectionFactory connectionFactory() {return new ActiveMQConnectionFactory(JMS_BROKER_URL);}public static void main(String[] args) {SpringApplication.run(JmsJavaconfigApplication.class, args);}
}

我们使用@SpringBootApplication代替了通常的@Configuration批注。 这个Spring Boot注释也用@Configuration注释。 此外,它还设置其他配置,例如Spring Boot自动配置:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {

现在都设置好了。 在下一部分的示例中,我们将了解如何配置JMS侦听器,因为它已配置了注释。

4.使用JMS侦听器的简单示例

4.1将订单发送到JMS队列

ClientService类负责将新订单发送到JMS队列。 为了做到这一点,它使用一个JmsTemplate:

@Service
public class ClientServiceImpl implements ClientService {private static final String SIMPLE_QUEUE = "simple.queue";private final JmsTemplate jmsTemplate;@Autowiredpublic ClientServiceImpl(JmsTemplate jmsTemplate) {this.jmsTemplate = jmsTemplate;}@Overridepublic void addOrder(Order order) {jmsTemplate.convertAndSend(SIMPLE_QUEUE, order);}
}

在这里,我们使用JmsTemplate转换Order实例并将其发送到JMS队列。 如果您希望直接通过发送消息发送消息,则可以使用新的JmsMessagingTemplate 。 这是更好的选择,因为它使用了更加标准化的Message类。

4.2接收发送到JMS队列的订单

将JMS侦听器注册到JMS侦听器容器就像将@JmsListener批注添加到我们要使用的方法一样简单。 这将在幕后创建一个JMS侦听器容器,该容器将接收发送到指定队列的消息并将它们委派给我们的侦听器类:

@Component
public class SimpleListener {private final StoreService storeService;@Autowiredpublic SimpleListener(StoreService storeService) {this.storeService = storeService;}@JmsListener(destination = "simple.queue")public void receiveOrder(Order order) {storeService.registerOrder(order);}
}

StoreService接收订单并将其保存到已接收订单的列表中:

@Service
public class StoreServiceImpl implements StoreService {private final List<Order> receivedOrders = new ArrayList<>();@Overridepublic void registerOrder(Order order) {this.receivedOrders.add(order);}@Overridepublic Optional<Order> getReceivedOrder(String id) {return receivedOrders.stream().filter(o -> o.getId().equals(id)).findFirst();}
}

4.3测试应用程序

现在让我们添加一个测试来检查我们是否正确完成了所有操作:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = JmsJavaconfigApplication.class)
public class SimpleListenerTest {@Autowiredprivate ClientService clientService;@Autowiredprivate StoreService storeService;@Testpublic void sendSimpleMessage() {clientService.addOrder(new Order("order1"));Optional<Order> storedOrder = storeService.getReceivedOrder("order1");Assert.assertTrue(storedOrder.isPresent());Assert.assertEquals("order1", storedOrder.get().getId());}
}

5.使用@SendTo将响应发送到另一个队列

Spring JMS的另一个附加功能是@SendTo批注。 此批注允许侦听器将消息发送到另一个队列。 例如,以下侦听器从“ in.queue”接收命令,并在存储该命令后向“ out.queue”发送确认。

@JmsListener(destination = "in.queue")
@SendTo("out.queue")
public String receiveOrder(Order order) {storeService.registerOrder(order);return order.getId();
}

在那里,我们注册了另一个侦听器,它将处理此确认ID:

@JmsListener(destination = "out.queue")
public void receiveOrder(String orderId) {registerService.registerOrderId(orderId);
}

六,结论

有了注释支持,现在可以更轻松地配置Spring JMS应用程序,从而利用使用注释JMS侦听器进行异步消息检索的优势。

翻译自: https://www.javacodegeeks.com/2015/04/configure-a-spring-jms-application-with-spring-boot-and-annotation-support.html

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

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

相关文章

室内主题元素分析图_2020届室内设计专业优秀毕业设计作品展(五)

“环”食疗养生空间概念设计△建筑外立面▲LOGO前 言每当人们提及健康时&#xff0c;人们的反应往往是运动、睡眠和饮食。现代的青年上班族&#xff0c;又因为快节奏的生活&#xff0c;工作压力大&#xff0c;饮食的不规律&#xff0c;生活不良习性的增加&#xff0c;导致了各…

C++输入cin详解

C输入cin详解 输入原理&#xff1a; 程序的输入都建有一个缓冲区&#xff0c;即输入缓冲区。一次输入过程是这样的&#xff0c;当一次键盘输入结束时会将输入的数据存入输入缓冲区&#xff0c;而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的&#xf…

时间序列的截尾和拖尾_R语言:时间序列(一)

01 解决什么问题在社会活动中经常可见按照时间顺序记录下来的随机事件观察值&#xff0c;例如每年死亡人数序列&#xff0c;每年糖尿病发病人数序列&#xff0c;医院门诊每日诊治病例数序列。这类数据的特性是相邻时间点的观察值之间具有明显的相关性&#xff0c;这一特性不同于…

JVM崩溃时:如何调查最严重错误的根本原因

当应用程序崩溃时&#xff0c;您可以学到什么&#xff1f; 我认为&#xff0c;“后见之明是20 /”是最喜欢的短语之一托马斯罗梅尔 &#xff0c;工程ZeroTurnaround的副总裁。 好吧&#xff0c;我实际上不确定在他的短语中占什么位置&#xff0c;但是我已经听过他几次说了。 鉴…

常用个人密码管理软件

http://www.williamlong.info/archives/3100.html转载于:https://www.cnblogs.com/svennee/p/4099358.html

查看网口命令_20个常用Linux命令

今天总结几个非常常用的Linux命令,其中有几个在面试中很可能问相关命令的原理,比如后台运行命令。希望对大家有所帮助,最好自己去尝试在Linux操作系统中实践一下。 1、查看目录以及权限 在windows中,使用dir查看当前目录中文件。在Linux中使用ls(list)查看当前目录文件。 w…

中统计字符串长度的函数_SQL Server中的字符串分割函数

您是否知道从SQL Server 2016开始&#xff0c;系统就内置STRING_SPLIT函数&#xff0c;该函数用于将字符串分隔的变量拆分为一个可用列表。 对于经常需要分割字符串的技术人员&#xff0c;建议您查看此功能。 STRING_SPLIT是一个表值函数&#xff0c;它返回由定界符分隔的字符串…

JBoss BPM Suite快速指南–将外部数据模型导入BPM项目

您正在从事一个大型项目&#xff0c;在企业中开发规则&#xff0c;事件和流程以满足关键业务需求。 部分要求指出&#xff0c;某个业务部门将提供您的数据模型供您利用。 不会在JBoss BPM Suite数据建模器中设计此数据模型&#xff0c;但是在从业务中心仪表板处理规则&#x…

卸载 流程_一款适合于windows端的卸载神器 彻底清理残留软件

今天给大家介绍的是一款适合于Windows端的软件卸载神器---Uninstall&#xff0c;可以彻底清理残留软件。它的卸载流程是这样的&#xff0c;首先会使用软件本身的默认卸载程序进行卸载&#xff0c;卸载完成后再次扫描软件残留的一些残余文件及注册表之类的&#xff0c;可以完美的…

十三水算法php_基于PHP+Redis令牌桶限流

一 、场景描述在开发接口服务器的过程中&#xff0c;为了防止客户端对于接口的滥用&#xff0c;保护服务器的资源&#xff0c; 通常来说我们会对于服务器上的各种接口进行调用次数的限制。比如对于某个 用户&#xff0c;他在一个时间段&#xff08;interval&#xff09;内&…

Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型

无论是X-Form-Urlencoded还是JSON HTTP发布到REST资源端点&#xff0c;对于与日期或时间相关的数据都没有特定的“数据类型”。 大多数开发人员会将这些数据发布为“字符串”&#xff0c;或者只是将它们转换为Unix时间戳值&#xff08;例如1435061152&#xff09;。 但是&#…

html中给div设置的属性怎么样才能拿得到_HTML与CSS结合的三种方式:优先级比较...

所谓实践出真知&#xff0c;只有自己动手去做了&#xff0c;才能得到正确的结论。首先我们看看三种结合方式&#xff1a;通过link标签引入外部css文件通过style标签通过style属性很长一段时间我受这个一段话影响&#xff1a;在html文件中&#xff0c;代码的执行顺序是从外到内&…

Quartz作业调度框架及时间表达式的含义和语法

Quartz 是一个开源的作业调度框架&#xff0c;它完全由 Java 写成&#xff0c;并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。本系统结合通过 Spring 来集成 Quartz 。 Quartz 下载地址 &#x…

spring mvc mysql 实例_Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

一、准备工作1. 首先创建一个表&#xff1a;CREATE TABLE t_user (USER_ID int(11) NOT NULL AUTO_INCREMENT,USER_NAME char(30) NOT NULL,USER_PASSWORD char(10) NOT NULL,USER_EMAIL char(30) NOT NULL,PRIMARY KEY (USER_ID),KEY IDX_NAME (USER_NAME)) ENGINEInnoDB AUTO…

daocloud创建mysql_GitHub - DaoCloud/php-apache-mysql-sample

如何开发一个 PHP MySQL 的 Docker 化应用目标&#xff1a;基于典型的 LAMP 技术栈&#xff0c;用 Docker 镜像的方式搭建一个 Linux Apache MySQL PHP 的应用 。创建 PHP 应用容器因所有官方镜像均位于境外服务器&#xff0c;为了确保所有示例能正常运行&#xff0c;DaoCl…

自动计算尺寸列表功能案例ios源码

源码HTKDynamicResizingCell&#xff0c;HTKDynamicResizingCell提供自动计算尺寸的TableViewCell/CollectionViewCel&#xff0c;只要设置了合适AutoLayout的约束。<ignore_js_op> 使用方法&#xff1a;使用CocoaPods添加&#xff1a; pod HTKDynamicResizingCell, ~>…

休眠NONSTRICT_READ_WRITE CacheConcurrencyStrategy如何工作

介绍 在我以前的文章中 &#xff0c;我介绍了READ_ONLY CacheConcurrencyStrategy &#xff0c;这是不可变实体图的显而易见的选择。 当缓存的数据可变时&#xff0c;我们需要使用读写缓存策略&#xff0c;本文将介绍NONSTRICT_READ_WRITE二级缓存的工作方式。 内部运作 提交H…

mysql用大白话解释_Java基础--2021Java面试题系列教程--大白话解读

前言序言再高大上的框架&#xff0c;也需要扎实的基础才能玩转&#xff0c;高频面试问题更是基础中的高频实战要点。适合阅读人群Java 学习者和爱好者&#xff0c;有一定工作经验的技术人&#xff0c;准面试官等。阅读建议本教程是系列教程&#xff0c;包含 Java 基础&#xff…

Android开源之行之走进zxing,轻松实现二维码扫描(二)

对于Zxing开源项目的简化上文已给出&#xff0c;源码经过测试且不断修改。众所周知&#xff0c;Zxing项目的扫描是横向的&#xff0c;这么引用的用户体验确实不好&#xff1b;然而盲目的修改会出现拉伸以及样本采集的偏离。所以这里说一下如何将横屏修改为竖屏扫描 解决办法引用…

mysql二进制大文件_Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)...

《Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改调试整理)》要点&#xff1a;本文介绍了Mysql实例Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改调试整理)&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。#include "stdafx.h"/…