SpringBoot项目实战--RabbitMQ

1、在pom.xml文件中添加以下依赖:

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

2、在 application.properties文件中添加配置信息:

spring.rabbitmq.username=XXX
spring.rabbitmq.password=XXX
spring.rabbitmq.virtualHost=XXX
spring.rabbitmq.addresses=ip:port,ip:port
或者从第三方配置信息中读取:

/**
 *
 */
import com.sohu.sns.manager.util.JsonMapper;
import org.apache.commons.lang3.StringUtils;

import java.util.Map;

/**
 * mq连接配置
 */
public class AmqpInit {
	private static final JsonMapper jsonMapper = JsonMapper.nonEmptyMapper();
	public static void init() {
		try {
			String mqConfig = ZooKeeperInit.getData("/mq.properties");
			if (StringUtils.isEmpty(mqConfig)) {
				throw new Exception("mq.properties is not found in zk.");
			} else {
				Map<String,Object> configMap = jsonMapper.fromJson(mqConfig,Map.class);
				//初始化ConnectionFactory需要参数
				System.setProperty("spring.rabbitmq.username", configMap.get("user_name").toString());
				System.setProperty("spring.rabbitmq.password", configMap.get("pwd").toString());
				System.setProperty("spring.rabbitmq.virtualHost", configMap.get("virtual_host").toString());
				System.setProperty("spring.rabbitmq.addresses", configMap.get("hosts").toString());

			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

才用此种配置时在服务启动时需要初始化信息。

更多配置参考配置类信息:

@ConfigurationProperties(
    prefix = "spring.rabbitmq"
)
public class RabbitProperties {
    private String host = "localhost";
    private int port = 5672;
    private String username;
    private String password;
    private final RabbitProperties.Ssl ssl = new RabbitProperties.Ssl();
    private String virtualHost;
    private String addresses;
    private Integer requestedHeartbeat;
}


3、添加mq配置信息:

import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.converter.MappingJackson2MessageConverter;

@Configuration
public class AmqpConfig {
    @Bean
    public RabbitMessagingTemplate rabbitMessagingTemplate(RabbitTemplate rabbitTemplate) {
        RabbitMessagingTemplate rabbitMessagingTemplate = new RabbitMessagingTemplate();
        rabbitMessagingTemplate.setMessageConverter(jackson2Converter());
        rabbitMessagingTemplate.setRabbitTemplate(rabbitTemplate);
        return rabbitMessagingTemplate;
    }
    @Bean
    public MappingJackson2MessageConverter jackson2Converter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        return converter;
    }

}

由于我在项目中需要往多个实例中发送消息,所以采用Fanout Exchange 类型,在生产中发送消息无需进行其他配置,发送消息代码如下:

@Service
public class SendMessageServiceImpl implements SendMessageService{
    private static final JsonMapper jsonMapper = JsonMapper.nonEmptyMapper();
    private static Logger log = LoggerFactory.getLogger(SendMessageServiceImpl.class);
    @Autowired
    private RabbitTemplate rabbitMessagingTemplate;
    @Override
    public void sendMessageToMQ(String modelType, String operateType, Object data) {
        Map<String,Object> mqDataMap = Maps.newConcurrentMap();
        mqDataMap.put("modelType",modelType);
        mqDataMap.put("operateType",operateType);
        mqDataMap.put("data",data);
        String exchangeName = System.getProperties().get("spring.rabbitmq.exchange_name").toString();
        String message = jsonMapper.toJson(mqDataMap);
        log.info("send message to mq..........."+message);
        rabbitMessagingTemplate.convertAndSend(exchangeName,null,message);
    }
}
只需要把消息发送到指定名称的交换机中即可。
4、消费者配置:

添加mq服务器配置信息,同生产者配置。

添加消费配置:

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by zhangnan on 2016/12/22.
 */
@Configuration
public class AmqpConfig{
    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
        return new RabbitAdmin(connectionFactory);
    }
    @Bean
    public Queue mqQueue(RabbitAdmin rabbitAdmin) {
        String queueName = System.getProperties().get("spring.rabbitmq.queue").toString();
        Queue queue = new Queue(queueName,true);
        rabbitAdmin.declareQueue(queue);
        return queue;
    }

    @Bean
    public FanoutExchange mqExchange(RabbitAdmin rabbitAdmin) {
        String exchangeName = System.getProperties().get("spring.rabbitmq.exchange_name").toString();
        //将消息分发到所有的绑定队列,无routingkey的概念
        FanoutExchange exchange = new FanoutExchange(exchangeName);
        rabbitAdmin.declareExchange(exchange);
        return exchange;
    }
    @Bean
    public Binding mqBinding(RabbitAdmin rabbitAdmin) {
        return BindingBuilder.bind(mqQueue(rabbitAdmin)).to(mqExchange(rabbitAdmin));
    }
}
声明交换路由和队列,并且把队列和交换路由进行绑定。

消费消息:

@Service
public class ReceiverMessageServiceImpl {
    private static final JsonMapper jsonMapper = JsonMapper.nonEmptyMapper();
    private static Logger log = LoggerFactory.getLogger(ReceiverMessageServiceImpl.class);
    @RabbitListener(queues = "${spring.rabbitmq.queue}")
    @RabbitHandler
    public void receiveQueue(String message) {
        log.info("receiver message from mq........"+message);
        
    }
}
由于在初始化配置信息时:spring.rabbitmq.queue采用的是一下配置:

System.setProperty("spring.rabbitmq.queue", configMap.get("queue_name").toString()+ InetAddress.getLocalHost());
所以可以实现,每个实例的声明的队列是不一样的,实现消息的广播发送到每个队列中。接收消息也非常简单,只需要添加两个注解,监控指定的队列就可以了,再有消息到达时,就可以消费信息。

5、遇到的问题:

在发送消息时,我刚开始采用的监听的模式,在需要发送消息的地方抛出监听事件,在监听中发送消息mq队列中,在实际测试后发现消息会重复发送,后来废弃这种方式,采用现有的在Service中直接发送消息,重复发送消息的问题解决。

@Component
public class EventListener implements ApplicationListener{
    private static Logger log = LoggerFactory.getLogger(EventListener.class);
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {

    }
}











SpringBoot实战(第4版)清晰文字版,第 1 章 入门 ................................................ 1 1.1 Spring 风云再起 ........................................ 1 1.1.1 重新认识 Spring ............................ 2 1.1.2 Spring Boot 精要 ........................... 3 1.1.3 Spring Boot 不是什么 ................... 6 1.2 Spring Boot 入门 ....................................... 6 1.2.1 安装 Spring Boot CLI .................... 7 1.2.2 使用 Spring Initializr 初始化 Spring Boot 项目 .......................... 10 1.3 小结 ......................................................... 18 第 2 章 开发第一个应用程序 .................... 19 2.1 运用 Spring Boot ..................................... 19 2.1.1 查看初始化的 Spring Boot 新项目 .......................................... 21 2.1.2 Spring Boot 项目构建过程 解析 .............................................. 24 2.2 使用起步依赖 .......................................... 27 2.2.1 指定基于功能的依赖 ................... 28 2.2.2 覆盖起步依赖引入的传递依赖 .... 29 2.3 使用自动配置 .......................................... 30 2.3.1 专注于应用程序功能 ................... 31 2.3.2 运行应用程序 .............................. 36 2.3.3 刚刚发生了什么 ........................... 38 2.4 小结 ......................................................... 41 第 3 章 自定义配置 .................................... 42 3.1 覆盖 Spring Boot 自动配置 ..................... 42 3.1.1 保护应用程序 .............................. 43 3.1.2 创建自定义的安全配置 ............... 44 3.1.3 掀开自动配置的神秘面纱 ........... 48 3.2 通过属性文件外置配置 ........................... 49 3.2.1 自动配置微调 .............................. 50 3.2.2 应用程序 Bean 的配置外置 ......... 55 3.2.3 使用 Profile 进行配置 .................. 59 3.3 定制应用程序错误页面 ........................... 62 3.4 小结 ......................................................... 64 第 4 章 测试 ............................................... 66 4.1 集成测试自动配置 .................................. 66 4.2 测试 Web 应用程序 ................................. 68 4.2.1 模拟 Spring MVC ........................ 69 4.2.2 测试 Web 安全 ............................. 72 4.3 测试运行中的应用程序 ........................... 74 4.3.1 用随机端口启动服务器 ............... 75 4.3.2 使用 Selenium 测试 HTML 页面 ............................................. 76 4.4 小结 ......................................................... 78 第 5 章 Groovy 与 Spring Boot CLI ......... 80 5.1 开发 Spring Boot CLI 应用程序 .............. 80 5.1.1 设置 CLI 项目 .............................. 81 5.1.2 通过 Groovy 消除代码噪声 ......... 81 5.1.3 发生了什么 .................................. 85 5.2 获取依赖 .................................................. 86 5.2.1 覆盖默认依赖版本 ....................... 87 5.2.2 添加依赖仓库 .............................. 88 5.3 用 CLI 运行测试 ...................................... 89 5.4 创建可部署的产物 .................................. 91 5.5 小结 ......................................................... 91 第 6 章 在 Spring Boot 中使用 Grails ...... 93 6.1 使用 GORM 进行数据持久化 ................. 93 2 目 录 6.2 使用 Groovy Server Pages 定义视图 ....... 98 6.3 结合 Spring Boot 与 Grails 3 ................. 100 6.3.1 创建新的 Grails 项目 ................. 100 6.3.2 定义领域模型 ............................ 103 6.3.3 开发 Grails 控制器 ..................... 104 6.3.4 创建视图 .................................... 105 6.4 小结 ....................................................... 107 第 7 章 深入 Actuator .............................. 108 7.1 揭秘 Actuator 的端点 ............................ 108 7.1.1 查看配置明细 ............................ 109 7.1.2 运行时度量 ................................ 115 7.1.3 关闭应用程序 ............................ 121 7.1.4 获取应用信息 ............................ 121 7.2 连接 Actuator 的远程 shell .................... 122 7.2.1 查看 autoconfig 报告 ........... 123 7.2.2 列出应用程序的 Bean ............... 124 7.2.3 查看应用程序的度量信息 ......... 124 7.2.4 调用 Actuator 端点 .................... 125 7.3 通过 JMX 监控应用程序 ....................... 126 7.4 定制 Actuator......................................... 128 7.4.1 修改端点 ID ............................... 128 7.4.2 启用和禁用端点 ........................ 129 7.4.3 添加自定义度量信息 ................. 129 7.4.4 创建自定义跟踪仓库 ................. 132 7.4.5 插入自定义健康指示器 ............. 134 7.5 保护 Actuator 端点 ................................ 136 7.6 小结 ....................................................... 138 第 8 章 部署 Spring Boot 应用程序 ........ 139 8.1 衡量多种部署方式 ................................ 139 8.2 部署到应用服务器 ................................ 140 8.2.1 构建 WAR 文件 ......................... 141 8.2.2 创建生产 Profile ........................ 142 8.2.3 开启数据库迁移 ........................ 145 8.3 推上云端 ............................................... 150 8.3.1 部署到 Cloud Foundry ............... 150 8.3.2 部署到 Heroku ........................... 153 8.4 小结 ....................................................... 155 附录 A Spring Boot 开发者工具.............. 157 附录 B Spring Boot 起步依赖 ................. 163 附录 C 配置属性 ...................................... 169 附录 D Spring Boot 依赖 ......................... 202
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值