RabbitMQ学习整理————Spring AMQP与RabbitMQ整合_洒脱的智障的博客-程序员宅基地

技术标签: RabbitMQ  

  • 前言

    上一篇博客整理了一些RabbitMQ的一些高级特性,像confirm消息确认机制,消费端限流等等。今天这篇博客主要整理下Spring AMQP与RabbitMQ的整合,主要是一些常用组件的使用。整理的比较简单,但是代码都是自己本地运行成功的,如果有什么问题,希望可以及时指出交流。

  • Spring AMQP用户管理组件——RabbitAdmin

    RabbitAdmin封装了对RabbitMQ的一些操作,比如声明交换机,声明队列,绑定交换机和队列等等。

  1. RabbitAdmin需要设置setAutoStartup参数为true,这样在启动spring 的时候才会去加载
  2. RabbitAdmin底层是通过RabbitTemplate去完成声明,修改,删除的一系列RabbitMQ操作

    代码示例

    这边通过JavaConfig的方式来装配Bean。RabbitAdmin需要一个ConnectionFactory对象,我们将ConnectionFactory注入。然后注入RabbitAdmin对象。

/**
 * SpringAMQP  RabbitAdmin配置类
 * @author Y
 * @date 2020年2月4日
 */
@Configuration
public class RabbitConfig {
	
	@Bean
	public ConnectionFactory connectionFactory() {
		CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
		connectionFactory.setAddresses("192.168.159.128:5672");
		connectionFactory.setUsername("guest");
		connectionFactory.setPassword("guest");
		connectionFactory.setVirtualHost("/");
		return connectionFactory;
	}
	
	@Bean
	public RabbitAdmin rabbitAdmin() {
		RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());
		rabbitAdmin.setAutoStartup(true);
		return rabbitAdmin;
	}
}

    之后我们就可以通过RabbitAdmin来进行一系列的RabbitMQ操作。这边我测试了声明交换机和队列,以及交换机和队列的绑定操作。

/**
 * RabbitMQ测试类
 * @author Y
 * @date 2020年2月11日
 */
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {RabbitConfig.class})
public class RabbitTest {
	
	@Autowired
	private RabbitAdmin rabbitAdmin;
	
	@Test
	public void test01() {
		//声明交换机
		rabbitAdmin.declareExchange(new DirectExchange("test.direct.exchange", false, false));
		rabbitAdmin.declareExchange(new TopicExchange("test.topic.exchange", false, false));
		//声明队列
		rabbitAdmin.declareQueue(new Queue("test.direct.queue", false));
		rabbitAdmin.declareQueue(new Queue("test.topic.queue", false));
		//绑定交换机和队列
		rabbitAdmin.declareBinding(new Binding("test.direct.queue", Binding.DestinationType.QUEUE, 
				"test.direct.exchange", "test", new HashMap<>()));
		
		rabbitAdmin.declareBinding(BindingBuilder.bind(new Queue("test.topic.queue", false)).
				to(new TopicExchange("test.topic.exchange", false, true)).with("#"));
	}
}

    执行测试方法,通过RabbitMQ管控平台,可以看到声明的交换机和队列,以及交换机和队列的绑定关系。

    

  • Spring AMQP消息模块组件——RabbitTemplate

    RabbitTemplate是Spring AMQP与RabbitMQ整合的发送消息的一个很关键的类,它提供了很多有效的方法,像回调监听ConfirmCallback,返回监听ReturnCallback等等。

    同样,我们也通过@Bean注解,将RabbitTemplate注入到spring容器中,RabbitTemplate也需要一个ConnectionFactory对象。

	@Bean
	public RabbitTemplate rabbitTemplate() {
		RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
		rabbitTemplate.setConfirmCallback(new MyConfirmCallback());//设置确认消息的回调函数
		return rabbitTemplate;
	}

  使用rabbitTemplate进行消息的发送操作,convertAndSend方法会进行一次转换,将对象转换成 AMQP Message的格式。

        @Autowired
        private RabbitTemplate rabbitTemplate;

	@Test
	public void test02() {
		rabbitTemplate.convertAndSend("test.topic.exchange", "test", "卧槽无情");
		rabbitTemplate.convertAndSend("test.topic.exchange", "haha", "卧槽 哈哈", new MessagePostProcessor() {
	
			//自定义设置消息的一些属性
			@Override
			public Message postProcessMessage(Message message) throws AmqpException {
				message.getMessageProperties().getHeaders().put("name", "ahao");
				return message;
			}
			
		});
	}

执行测试方法,查看RabbitMQ管控平台,可以看到发送的两条等待消费的消息。

  • Spring AMQP消息容器——SimpleMessageListenerContainer

    SimpleMessageListenerContainer​​​​​​​​​​​​​​是一个很强大的类,他是一个消息监听的容器,它可以监听指定的多个队列,设置消息确认和自动确认的策略,设置具体的消息转换器以及监听器等等。这边只对最简单的用法做一个总结。

    我们通过@Bean注解将SimpleMessageListenerContainer对象注入到spring容器中,SimpleMessageListenerContainer也需要指定一个ConnectionFactory对象。这边指定监听的队列是之前创建的test.topic.queue队列。

/**
	 * 消息监听容器
	 * @return
	 */
        @Bean
	public SimpleMessageListenerContainer simpleMessageListenerContainer() {
		SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory());		
		//手动应答
		container.setAcknowledgeMode(AcknowledgeMode.AUTO);
		//监听的队列
		container.setQueueNames("test.topic.queue");
                //消费者数量
		container.setConcurrentConsumers(1);
                //最大消费者数量
		container.setMaxConcurrentConsumers(5);
		//设置ConsumerTag命名的规则
		container.setConsumerTagStrategy(new ConsumerTagStrategy() {
			@Override
			public String createConsumerTag(String queue) {
				return queue+"_"+CommUtils.uuid();
			}
		});
		//设置消息监听
		container.setMessageListener(new ChannelAwareMessageListener() {

			@Override
			public void onMessage(Message message, Channel channel) throws Exception {
				String msg = new String(message.getBody(),"UTF-8");
				System.out.println("------------消费者---------- "+msg);
			}
			
		});
		
		return container;
	}

    这边直接运行测试方法,会启动消息容器。可以看到之前发送的两条消息已经被消费了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_32238611/article/details/104269161

智能推荐

openscale中projection,resolution,比例尺的概念_夜路人的博客-程序员宅基地

1、比例尺本身虽然没有单位:1:15000,但它的两个数字是有单位的。表示1厘米代表15000厘米,即150米。而不是1厘米代表15000米。1:5000000的地图,表示1厘米代表50000米,即5公里。转载:问题描述:在openscales2.2版本中,如果有地物标注的文字时,文字会随着地图的缩放而变换字体的大小。比如文字标注设定的字体为12号字,那么在地图的缩放过程中

Tomcat——配置Tomcat的服务端口(默认端口8080)_caigen001的博客-程序员宅基地

修改conf文件夹下的server.xml文件修改成功后,重启Tomcat,在浏览器地址栏中输入localhost一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。好处:在访问时,就不用输入端口号...

littlefs系列:重要的数据结构_nstcl的博客-程序员宅基地_littlefs文件系统原理

1、文件类型// File typesenum lfs_type { // file types LFS_TYPE_REG = 0x001, LFS_TYPE_DIR = 0x002, // internally used types LFS_TYPE_SPLICE = 0x400, ...

BUUCTF--[HCTF 2018]Hideandseek_Uzero.的博客-程序员宅基地_buuctf hideandseek 1

帐号登录后是一个上传ZIP文件上传一个.ZIP文件后发现他会显示文件的内容可能是有文件读取,我们创建一个软链接(类似windows的快捷方式)指向一个服务器上的文件,尝试是否可以读取[email protected]:~/Desktop# ln -s /etc/passwd [email protected]:~/Desktop# zip -y passwd.zip passwd adding: passwd (stored 0%)上传后发现可以成功读取到/etc/passwd的...

zhouwf0726(zhouweifeng)_ctk87443的博客-程序员宅基地

zhouwf0726(zhouweifeng)链接:http://zhouwf0726.itpub.net/ ...

Flex的通信方式(四)——HTTPService_2_gaoyuan21810的博客-程序员宅基地_flex http请求

<br />1、Flex中请求URL得到json的数据,然后在script中解析json数据 <br />其中用的是HTTPService通信方式 和 navigateToURL直接访问URL<br /><?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center" vertical

随便推点

iview上传图片_I NFINIT Y的博客-程序员宅基地

iview上传图片 &amp;amp;amp;amp;lt;Upload ref=&amp;amp;amp;quot;upload&amp;amp;amp;quot; :format=&amp;amp;amp;quot;['jpg','jpeg','png']&amp;amp;amp;quot; action=&amp;amp;amp;quot;http://10.0.0.4:8004/uploadPic&amp;amp;amp;qu

S2S3H4 SSH框架 搭建 环境配置及测试_三目君的博客-程序员宅基地

struts2.1 + spring 3.1 + hibernate 4.1.4 集成 使用以下jar包。myeclipse2014版本自带这些包。eclipse推荐使用maven管理jar包,方便使用。 antlr-2.7.7.jaraopalliance-1.0.jarasm-3.1.jaraspectjweaver-1.6.9.jarc3p0-0.9.

在(CListView)列表中添加右键菜单方法_skyremember的博客-程序员宅基地

 在(CListView)列表中添加右键菜单方法 [收藏此页] [打印] [推荐] [挑错] 作者:csdn Nada_Red  2005-08-21    内容导航:

STM32入门培训_小锋学长生活大爆炸的博客-程序员宅基地

大家好,非常高兴能跟大家一起聊一聊STM32。本次培训呢,主要是介绍一些概念,不做深入的探讨。内容比较多,讲的可能会有点快。本次内容主要分为5个部分。首先简单介绍一下STM32STM32有什么应用呢?我学了它能干什么呢?作为微控制器,需要控制的地方,基本都可以用上。比如智能家居、智慧农业、工厂自动化这些,都可以使用STM32作为主控制器或者辅助控制器。我们实验室做的小车和无人机的主控芯片,包括以后读研,有些实验...

Sql Server创建和使用临时表_平行宇宙i的博客-程序员宅基地_创建临时表的sql语句

创建临时表 方法一: create table #临时表名(字段1 约束条件,字段2 约束条件,.....)create table ##临时表名(字段1 约束条件,字段2 约束条件,...

OC-015.OC中的@property_龙叔叔的博客-程序员宅基地_oc ## @property 增强

现有Xcode中的@property已经增强过了,能够让程序员编写程序的效率大大提高。[email protected] 它是一个编译器指令,帮助程序员快速编写变量和读写方法。(是一个编译器指令,并不是OC的语言,只不过让我们少些点重复的代码而已)2.当在类的声明中使用@property,它会自动生成标准的setter和getter方法的声明和实现3.现在使用的是增强@property,不用在实现

推荐文章

热门文章

相关标签