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

spring boot注释

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

spring boot注释

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

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

相关文章

C语言 | 简单工厂方法模式实现例子

点击蓝字关注我们1、简介简单工厂方法定义一个用于创建对象的类&#xff0c;该类接受一个参数&#xff0c;通过参数决定创建不同的对象。GOF并没有把简单工厂方法定义为23种设计模式之一&#xff0c;可以认为简单工厂方法是工厂方法的简化形式。为了体现简单工厂方法和工厂方法…

C语言 / C++基础面试知识大集合

点击蓝字关注我们相对而言&#xff0c;C语言和C相关的面试题比较少见&#xff0c;没有Java方向写的人那么多&#xff0c;这是一篇 C 语言与 C面试知识点总结的文章&#xff0c;个人感觉非常难得&#xff0c;希望能对大家有所帮助。const作用修饰变量&#xff0c;说明该变量不可…

input发送a.jax_Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型

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

jooq sql_jOOQ星期二:Vlad Mihalcea深入了解SQL和Hibernate

jooq sql欢迎来到jOOQ Tuesdays系列。 在本系列文章中&#xff0c;我们每隔一个月的第三个星期二发布一篇文章&#xff0c;从jOOQ的角度采访我们发现该行业令人兴奋的人。 这包括从事SQL&#xff0c;Java&#xff0c;开放源代码以及各种其他相关主题的人员。 我们很高兴在第三…

C语言灵魂拷问:++i 为比 i++效率高?

点击蓝字关注我们相信很多人遇到过这样的问题&#xff1a;printf("%d,%d",i,i);也纠结过这个问题&#xff0c;到底答案是什么。确没有一个参考的资料。唯一知道的是&#xff0c;几乎所有C语言教材都这么讲&#xff1a;i就是先使用i的值再使i自身加一&#xff0c;而i则…

HibernateNONSTRICT_READ_WRITE CacheConcurrencyStrategy如何工作

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

最全,面中率最高的C++经典面试题分享!

点击蓝字关注我们1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存&#xff0c;new调用构造函数。malloc与free是C/C语言的标准库函数&#xff0c;new/delete是C的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象…

mysql不同版本会覆盖吗,[mysql不同版本数据库同步]mysql数据库主从同步,master和slave上的mysql必须版本一样吗,如果不一样会有什么结果?...

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件497950890Slave_SQL_Running: No mysql同步故障解决如果数据不同步可以尝试该资料mysql> show slave status\GSlave_IO_Running: YesSlave_SQL_Running: NoLast_Errno: 1062….Seconds_Behind_Master:NU…

C++ 面试被问到的“左值引用和右值引用”

点击蓝字关注我们1.左值和右值在C11中可以取地址的、有名字的就是左值&#xff0c;反之&#xff0c;不能取地址的、没有名字的就是右值&#xff08;将亡值或纯右值&#xff09;。举个例子&#xff0c;int a bc, a 就是左值&#xff0c;其有变量名为a&#xff0c;通过&a可以…

初学者宝典:C语言入门基础知识大全

点击蓝字关注我们01C语言程序的结构认识用一个简单的c程序例子&#xff0c;介绍c语言的基本构成、格式、以及良好的书写风格&#xff0c;使小伙伴对c语言有个初步认识。例1&#xff1a;计算两个整数之和的c程序&#xff1a;#include main() {int a,b,sum; a20; /*定义变量a,b&a…

qt如何捕获应用程序输出_企业应用程序中需要捕获的5大Java性能指标

qt如何捕获应用程序输出有兴趣了解如何使用AppDynamics捕获这些Java性能指标吗&#xff1f; 立即开始免费试用 &#xff01; 前几篇文章介绍了应用程序性能管理&#xff08;APM&#xff09;&#xff0c;并指出了有效实施APM战略的挑战。 本文通过回顾五个顶级性能指标来构建这…

C语言入门笔记,推荐收藏!

点击蓝字关注我们C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好&#xff0c;可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言&#xff0c;所以说学习C语言是进…

php.c drcom,校园网绕过Drcom安装自动登录程序到路由器

简单记录一下&#xff0c;怎么在路由器上安装drcom脚本&#xff0c;实现自动登陆&#xff0c;一个路由器&#xff0c;全寝室都可以使用的方法。安装固件&#xff1a;我这里使用的是newifi mini型号的路由器下载后&#xff0c;插拔一次路由器&#xff0c;按下路由器上的reset按钮…

php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序

C 如何实现字典序排序法,自然排序类似PHP的natcasesort函数,整了一天没有头绪.数组是vector排序前:[0] > IMG0.png[1] > IMG3.png[2] > img1.png[3] > img10.png[4] > img12.png[5] > img2.png排序后:[0] > IMG0.png[1] > img1.png[2] > img2.png[3…

如何优雅地利用C++编程从1乘到20?

点击蓝字关注我们知乎的一个问题&#xff1a;答主&#xff1a;小白白。数学家版本&#xff1a;&#xff08;简单利索&#xff0c;深藏功与名&#xff09;#include <iostream> #include <cmath> int main() {std::cout << std::tgamma(20 1) << std::e…

用这个C语言骰子代码做选择

点击蓝字关注我们我相信很多人都遇到选择的事情&#xff0c;比较正常的就是&#xff0c;我拿了两个offer要如何选择。用下面这段C代码挺好的&#xff0c;你可以自己加上自己喜欢的判断。#include<stdio.h> #include<stdlib.h> #include<time.h>int main() {i…

java ee的小程序_Java EE应用程序的单片到微服务重构

java ee的小程序您是否曾经想过将现有的Java EE单体应用程序重构为基于微服务的应用程序需要做什么&#xff1f; 该博客说明了一个简单的购物车示例如何转换为基于微服务的应用程序&#xff0c;以及围绕它的一些担忧。 整体和基于微服务的应用程序的完整代码库位于&#xff1a…

C语言数据结构:什么是树?什么是二叉树?

点击蓝字关注我们前言在之前的数据结构学习中&#xff0c;我们学习了顺序表、链表、栈、队列这几种结构它们都是用链表或者数组的方式来实现的&#xff0c;主要考察我们对结构体的运用今天让我们来学习一个新的数据结构&#xff0c;也就是下面这副图里面的树啊不好意思&#xf…

如何把CPP源程序改写成C语言?

点击蓝字关注我们曾经参与过公司的bpp项目&#xff0c;就是bluetooth print profile。由于使用了hpijs的开源包&#xff0c;但是是C&#xff0b;&#xff0b;的。由于C&#xff0b;&#xff0b;解释器比C语言解释器占用的存储空间要大500k左右。为了节省有限的存储空间&#xf…

9 个很酷的 CMD 命令

点击蓝字关注我们ipconfig功能&#xff1a;查询本机IP地址操作方法&#xff1a;只要在在打开的cmd命令界面中输入“ipconfig”就可以了。msg功能&#xff1a;向对方电脑发送一条文本提示操作方法&#xff1a;首先你要知道对方的IP地址&#xff0c;接下来输入命令“msg /server:…