springboot2.1以javabean整合rabbitmq及自动注入rabbitmqTemplate为空问题
springboot集成rabbitmq之前也写过,这次再来个总结,总体来讲比较简单
主要就是配置属性文件,将属性以javabean的形式注入,配置工厂,对象等原来以xml<bean>形式注入的对象。
代码如下properties属性
#rabbitMQ配置
rabbit.config.host=192.168.135.129
rabbit.config.port=5672
rabbit.config.userName=guest
rabbit.config.password=guest
/**
*
*/
package com.sharp.forward.config; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component; /**
* @author 醉逍遥
*
*/
@Component
@ConfigurationProperties(prefix="rabbit.config")
@PropertySource(value="classpath:config/rabbitmq.properties",encoding="utf-8")
public class RabbitMQProperties { public String getHost() {
return host;
} public void setHost(String host) {
this.host = host;
} public int getPort() {
return port;
} public void setPort(int port) {
this.port = port;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} private String host; private int port; private String userName; private String password; }
/**
*
*/
package com.sharp.forward.config; import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.support.ConsumerTagStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component; /**
* @author 醉逍遥
*
*/
@Configuration
public class RabbitMQConf{ @Autowired
private RabbitMQProperties rabbitMQProperties; // 获取连接工厂
@Bean
public ConnectionFactory factory() {
CachingConnectionFactory factory = new CachingConnectionFactory();
factory.setHost(rabbitMQProperties.getHost());
factory.setPort(rabbitMQProperties.getPort());
factory.setUsername(rabbitMQProperties.getUserName());
factory.setPassword(rabbitMQProperties.getPassword());
return factory;
}
// 获取rabbitmqAdmin
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory factory) {
RabbitAdmin admin = new RabbitAdmin(factory);
admin.setAutoStartup(true);
return admin;
} @Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory factory) {
RabbitTemplate template =new RabbitTemplate(factory);
return template;
} /**
* 不配置这个容器,启动项目时候,rabbitmq的管控台看不到动作
* @param factory
* @return
*/
@Bean
public SimpleMessageListenerContainer container(ConnectionFactory factory) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(factory);
container.setConsumerTagStrategy(new ConsumerTagStrategy() { @Override
public String createConsumerTag(String queue) {
return null;
}
});
return container;
} // 定义交换器
public static final String SHARP_EXANGE_TEST_001="sharpExchangeTest001"; public static final String SHARP_EXANGE_TEST_002="sharpExchangeTest002"; public static final String SHARP_EXANGE_TEST_003="sharpExchangeTest003";
// 定义队列
public static final String SHARP_QUEUE_TEST_001="sharpQueueTest001"; public static final String SHARP_QUEUE_TEST_002="sharpQueueTest002"; public static final String SHARP_QUEUE_TEST_003="sharpQueueTest003";
// 定义路由键
public static final String SHARP_ROUTINGKEY_TEST_001="sharp.test"; public static final String SHARP_ROUTINGKEY_TEST_002="sharp.topic.#"; @Bean(name="sharpExchangeTest001")
public DirectExchange getExchage_001() {
return new DirectExchange(SHARP_EXANGE_TEST_001, true, false, null);
}
@Bean(name="sharpExchangeTest002")
public TopicExchange getExchange_002() {
return new TopicExchange(SHARP_EXANGE_TEST_002, true, false, null);
}
@Bean(name="sharpExchangeTest003")
public FanoutExchange getExchange_003() {
return new FanoutExchange(SHARP_EXANGE_TEST_003, true, false, null);
}
@Bean(name="sharpQueueTest001")
public Queue getQueue_001() {
return new Queue(SHARP_QUEUE_TEST_001, true, false, false, null);
}
@Bean(name="sharpQueueTest002")
public Queue getQueue_002() {
return new Queue(SHARP_QUEUE_TEST_002, true, false, false, null);
}
@Bean(name="sharpQueueTest003")
public Queue getQueue_003() {
return new Queue(SHARP_QUEUE_TEST_003, true, false, false, null);
}
// 定义绑定
@Bean
public Binding getDirectBinding() {
return BindingBuilder.bind(getQueue_001()).to(getExchage_001()).with(SHARP_ROUTINGKEY_TEST_001);
} @Bean
public Binding getTopicBinding() {
return BindingBuilder.bind(getQueue_002()).to(getExchange_002()).with(SHARP_ROUTINGKEY_TEST_002);
} @Bean
public Binding getFauoutBinding() {
return BindingBuilder.bind(getQueue_003()).to(getExchange_003());
}
}
rabbitUtil
/**
*
*/
package com.sharp.forward.util; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import com.sharp.forward.config.RabbitMQConf; /**
* @author 醉逍遥
*/
@Component
public class RabbitUtil { private static final Logger logger = LoggerFactory.getLogger(RabbitUtil.class); @Autowired
private RabbitTemplate template; public void sendObjectMessage(Object obj) {
template.convertAndSend("sharpExchangeTest001", "sharp.test", obj);
} public void sendStringMessage(String message) { } public void sendMessage(String message) {
logger.info("rabbitUtil发送消息前的信息:{}",message);
logger.info("template是否为空:{}",(template==null));
template.convertAndSend(RabbitMQConf.SHARP_EXANGE_TEST_001, RabbitMQConf.SHARP_ROUTINGKEY_TEST_001, message==null?"hello":message);
}
}
rabbitServiceImpl(service代码就不贴了)
/**
*
*/
package com.sharp.forward.user.serviceImpl; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.sharp.forward.user.service.RabbitService;
import com.sharp.forward.util.RabbitUtil; /**
* @author 醉逍遥
*
*/
@Service("rabbitService")
@Transactional(readOnly=true)
public class RabbitServiceImpl implements RabbitService{ private static final Logger logger = LoggerFactory.getLogger(RabbitServiceImpl.class);
@Autowired
private RabbitUtil util;
@Override
public void sendObjectMessage(String message) {
logger.info("要发送的参数是:------> {}",message);
util.sendMessage(message);
}
}
之前运行一直在rabbitUtil中报rabbitTemplate注入始终为空,导致消息不能发送,是因为我之前在service层25行处用的RabbitUtil不是用的@Autowired注入,而是用了new RabbitUtil,尽管RabbitUtil中用的@Autowired注入了模板,找错时一直在rabbitUtil中找找不到错误,后来将RabbitUtil注解为@Companent,service层对应修改为spring注入,Ok
启动项
package com.sharp.forward; import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication; import com.sharp.forward.config.RabbitMQProperties; @SpringBootApplication
//@ImportResource("classpath:config/application-user-service-dubbo.xml")
@MapperScan(basePackages= {"com.sharp.forward.mapper"})
@EnableAutoConfiguration
public class Application implements CommandLineRunner{ private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} @Autowired
private RabbitMQProperties rabbitMQProperties; /**
* @param args
* @throws Exception
*/
@Override
public void run(String... args) throws Exception {
String config = "host: " + rabbitMQProperties.getHost()
+ ", config.port:" + rabbitMQProperties.getPort()
+ ", config.userName:" + rabbitMQProperties.getUserName(); log.info("SpringBoot2.0实现自定义properties配置文件与JavaBean映射: {}" , config); } }
然后在消费服务中测试
代码如下
@PostMapping("/sendString")
public void sendString(@Param(value = "message") String message) {
logger.info("start send message test: {}",message);
rabbitService.sendObjectMessage(message);
}
测试后在管控台看到消息

主要结构

springboot2.1以javabean整合rabbitmq及自动注入rabbitmqTemplate为空问题的更多相关文章
- Spring与Struts2整合时action自动注入的问题
当Struts和Spring框架进行整合时,原本由action实例化对象的过程移交给spring来做(这个过程依赖一个叫struts2-spring-plugin的jar包,这个包主要的功能就是实现刚 ...
- SpringBoot2.0源码分析(三):整合RabbitMQ分析
SpringBoot具体整合rabbitMQ可参考:SpringBoot2.0应用(三):SpringBoot2.0整合RabbitMQ RabbitMQ自动注入 当项目中存在org.springfr ...
- SpringBoot2.0应用(三):SpringBoot2.0整合RabbitMQ
如何整合RabbitMQ 1.添加spring-boot-starter-amqp <dependency> <groupId>org.springframework.boot ...
- java框架之SpringBoot(12)-消息及整合RabbitMQ
前言 概述 大多数应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦的能力. 消息服务中两个重要概念:消息代理(message broker)和目的地(destination).当消息发送者发送 ...
- spring boot实战(第十二篇)整合RabbitMQ
前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...
- Spring Boot 整合 rabbitmq
一.消息中间件的应用场景 异步处理 场景:用户注册,信息写入数据库后,需要给用户发送注册成功的邮件,再发送注册成功的邮件. 1.同步调用:注册成功后,顺序执行发送邮件方法,发送短信方法,最后响应用户 ...
- springboot 学习之路 20 (整合RabbitMQ)
整合RabbitMQ: 我的操作系统是window7 ,所以在整合ribbotMQ之前需要先安装rabbitMq服务:安装步骤请参考:window下安装RabbitMQ 这个详细介绍了安装步骤,请按 ...
- Spring Boot整合RabbitMQ详细教程
原文:https://blog.csdn.net/qq_38455201/article/details/80308771 1.首先我们简单了解一下消息中间件的应用场景 异步处理 场景说明:用户注册后 ...
- springboot整合rabbitmq,支持消息确认机制
安装 推荐一篇博客https://blog.csdn.net/zhuzhezhuzhe1/article/details/80464291 项目结构 POM.XML <?xml version= ...
随机推荐
- 8.1.2hadoop Streaming 作业原理和参数设置
1.1.1 Stream 作业 (1)hadoop streaming Hadoop streaming是hadoop的一个工具,用于运行费java的maper或reducer作业,例 ...
- netty集成springboot
一 前言 springboot 如何集成netty实现mapper调用不为null的问题让好多读者都头疼过,知识追寻者发了一点时间做了个基本入门集成应用给读者们指明条正确的集成方式,我相信,只要你有n ...
- SQL SERVER 2005还原差异备份、日志备份 2012-03-29 11:43
其实要备份,还原最安全最有保障的是完全备份.但是完全备份肯定是需要更多的磁盘空间的开销.尤其是数据量比较大的.比如基数是500M,每天的增长量为10M,那么第一次完全备份是500M,第二次是510M, ...
- python字符记录
所有的字符方法论 # -*- coding: utf-8 -*- 2 #__author__ = 'Administrator' 3 4 name = "my name is {name} ...
- 8个问题全面了解5G关键技术Massive MIMO
1 什么是Massive MIMO Massive MIMO(大规模天线技术,亦称为Large Scale MIMO)是第五代移动通信(5G)中提高系统容量和频谱利用率的关键技术.它最早由美国贝尔实验 ...
- 第1节 Scala基础语法:scala中的方法源码分析
val list=List(1,2,3,4) list.reduce((x:Int,y:Int)=>x+y)--->list.reduceLeft((x:Int,y:Int)=>x+ ...
- Graphviz 使用笔记
官网:Graphviz 最近一直在找如何用写代码的方式就可以实现数据结构可视化.流程图等等,于是发现了她,上手也比较简单,但正当我仅觉得不错的时候,我发现竟然还可以用python来写,瞬间好感度爆满啊 ...
- lib文件和dll文件
一. 简介 1.1 C++两种库文件 lib包含了函数所在的dll文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的dll提供,称为动态链接库dynamic link library. ...
- 利用Python进行数据分析笔记-时间序列(时区、周期、频率)
此文对Python中时期.时间戳.时区处理等阐述十分清楚,特别值得推荐学习. 原文链接:https://blog.csdn.net/wuzlun/article/details/80287517
- 《iOS开发进阶》书籍目录
第一部分:iOS开发工具 第二部分:iOS开发实践 第10章 理解内存管理 10.1 引用计数 10.1.1 什么是引用计数,原理是什么 10.1.2 我们为什么需要引用计数 10.1.3 不要向已经 ...