rabbitMQ应用,laravel生产广播消息,springboot消费消息
最近做一个新需求,用户发布了动态,前台需要查询,为了用户读取信息响应速度更快(MySQL很难实现或者说实现起来很慢),所以在用户动态发布成功后,利用消息机制异步构建 redis缓存 和 elasticsearch索引 。
开发环境
rabbitMQ服务端,docker安装
拉取rabbit-mq镜像
docker pull hub.c..com/library/rabbitmq:3.6.-management 运行镜像
docker run -d --name rabbitmq --publish : --publish : --publish : --publish : --publish : --publish : hub.c..com/library/rabbitmq:3.6.-management 后台地址:
http://192.168.1.8:15672
消息生产端(PHP):
composer 安装 rabbitmq客户端
composer require php-amqplib/php-amqplib 生产广播消息官方demo
https://github.com/php-amqplib/php-amqplib/blob/master/demo/amqp_publisher_fanout.php
应用中代码
<?php
/**
* User: szliugx@gmail.com
* Date: 2018/6/18
* Time: 下午1:54
*/ namespace App\ThirdParty\Message; use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage; class AmqpPublisher
{
public function send($content)
{
$exchange = 'message.fanout.exchange';
// 创建连接
$connection = new AMQPStreamConnection(
config('app.mq_host'),
config('app.mq_port'),
config('app.mq_user'),
config('app.mq_pass'),
config('app.mq_vhost')
);
$channel = $connection->channel();
/*
name: $exchange
type: fanout
passive: false // don't check is an exchange with the same name exists
durable: false // the exchange won't survive server restarts
auto_delete: true //the exchange will be deleted once the channel is closed.
*/
$channel->exchange_declare($exchange, 'fanout', false, true, false);
$messageBody = $content;
$message = new AMQPMessage($messageBody, array('content_type' => 'text/plain'));
$channel->basic_publish($message, $exchange);
// 关闭通道
$channel->close();
// 关闭连接
$connection->close();
}
}

消息消费端(Java):
引入maven依赖 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置广播队列信息
package cn.taxiong.release.config; import cn.taxiong.release.constant.QueueConstants;
import lombok.extern.slf4j.Slf4j;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* RabbitMQFanout模式配置
*
* @author szliugx@gmail.com
* @create 2018-06-18 下午4:04
**/
@Slf4j
@Configuration
public class RabbitMQFanoutConfig { @Bean
public Queue createFanoutQueueCache() {
log.info( "创建了FanoutQueue cache 缓存 队列" );
return new Queue(QueueConstants.MESSAGE_QUEUE_RELEASE_CACHE_NAME);
} @Bean
public Queue createFanoutQueueIndex() {
log.info( "创建了FanoutQueue index 缓存 队列" );
return new Queue(QueueConstants.MESSAGE_QUEUE_RELEASE_INDEX_NAME);
} @Bean
public FanoutExchange fanoutExchangeRelease() {
log.info( "创建了fanoutExchange交换机" );
return new FanoutExchange( QueueConstants.MESSAGE_FANOUT_EXCHANGE);
} @Bean
public Binding fanoutExchangeCacheQueueBinding() {
log.info( "将FanoutQueue cache 队列绑定到交换机fanoutExchange" );
return BindingBuilder.bind( createFanoutQueueCache() ).to( fanoutExchangeRelease() );
} @Bean
public Binding fanoutExchangeIndexQueueBinding() {
log.info( "将FanoutQueue index 队列绑定到交换机fanoutExchange" );
return BindingBuilder.bind( createFanoutQueueIndex() ).to( fanoutExchangeRelease() );
}
}
队列常量信息
package cn.taxiong.release.constant; /**
* 队列常量
*
* @author szliugx@gmail.com
* @create 2018-06-14 下午7:02
**/
public interface QueueConstants {/**
* 消息交换
*/
String MESSAGE_FANOUT_EXCHANGE = "message.fanout.exchange"; /**
* 发布缓存消息队列名称
*/
String MESSAGE_QUEUE_RELEASE_CACHE_NAME = "message.release.cache.queue"; /**
* 发布索引消息队列名称
*/
String MESSAGE_QUEUE_RELEASE_INDEX_NAME = "message.release.index.queue";
}
缓存(cache)服务消费消息:
package cn.taxiong.release.message; import cn.taxiong.release.constant.QueueConstants;
import cn.taxiong.release.service.OperateReleaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component; /**
* 消息消费
*
* @author szliugx@gmail.com
* @create 2018-06-14 下午7:14
**/
@Slf4j
@Component
@RabbitListener(queues = QueueConstants.MESSAGE_QUEUE_RELEASE_CACHE_NAME)
public class MessageConsumer { @Autowired
private OperateReleaseService operateReleaseService; @RabbitHandler
public void handler(@Payload String message) {
// operateReleaseService.storeReleaseRedisCache(message);
log.info("缓存cache消息消费1:{}", message);
}
}
索引(index)服务消费消息:
package cn.taxiong.release.message; import cn.taxiong.release.constant.QueueConstants;
import cn.taxiong.release.service.OperateReleaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component; /**
* 消息消费
*
* @author szliugx@gmail.com
* @create 2018-06-14 下午7:14
**/
@Slf4j
@Component
@RabbitListener(queues = QueueConstants.MESSAGE_QUEUE_RELEASE_INDEX_NAME)
public class MessageConsumer2 { @Autowired
private OperateReleaseService operateReleaseService; @RabbitHandler
public void handler(@Payload String message) {
log.info("索引消息 index 消费2:{}", message);
}
}

rabbitMQ应用,laravel生产广播消息,springboot消费消息的更多相关文章
- kafka生产者与消费者的生产消息与消费消息所遇到的问题
当我们用API写kafka的时候 生产者生产消息,但是消费者接收不到消息?集群上启动消费者显示生产的消息.我们需要修改一下配置 (1)我们打开在虚拟机中修改kafka集群的配置文件 [root@spa ...
- RabbitMQ 消费消息
1, 创建一个 springboot 项目, 导入依赖(和生产者一致) 2, application.properties (基础配置和生产者一致, 消费者需要再额外配置一些) # rabbitmq ...
- 压测应用服务对RabbitMQ消息的消费能力--实践脚本
最近运维跟我反馈我负责的应用服务线上监控到消费RabbitMQ消息队列过慢,目前只有20左右,监控平台会有消息积压的告警. 开发修改了一版应用服务的版本,提交给我做压测验证. 之前没有做过消息中间件的 ...
- 17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列
原文:https://mp.weixin.qq.com/s/lpsQ3dEZHma9H0V_mcxuTw 一.资料文档 二.开发语言 三.支持的协议 四.消息存储 五.消息事务 六.负载均衡 七.集群 ...
- 综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列
来源:http://t.cn/RVDWcfe 一.资料文档 Kafka:中.有kafka作者自己写的书,网上资料也有一些.rabbitmq:多.有一些不错的书,网上资料多.zeromq:少.没有专门写 ...
- 【Azure Developer】在Azure VM (Windows) 中搭建 kafka服务,并且通过本地以及远程验证 发送+消费 消息
问题描述 查看了 "How to Install and Run Apache Kafka on Windows? " 一文后,成功安装了Kafka服务,但是如何使用呢?如何在其他 ...
- RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性
目录 消息存储 消息存储方式 非持久化 持久化 消息存储介质 消息存储与读写方式 消息存储结构 刷盘机制 同步刷盘 异步刷盘 小结 高可用 高可用实现 主从复制 负载均衡 消息重试 顺序消息重试 无序 ...
- 2.RABBITMQ 入门 - WINDOWS - 生产和消费消息 一个完整案例
关于安装和配置,见上一篇 1.RABBITMQ 入门 - WINDOWS - 获取,安装,配置 公司有需求,要求使用winform开发这个东西(消息中间件),另外还要求开发一个日志中间件,但是也是要求 ...
- springboot项目整合rabbitMq涉及消息的发送确认,消息的消费确认机制,延时队列的实现
1.引入maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
随机推荐
- bzoj1603 / P2913 [USACO08OCT]车轮旋转Wheel Rotation
P2913 [USACO08OCT]车轮旋转Wheel Rotation 稳妥起见(防止数据出锅),用了bfs 每次的转移可以直接用异或和解决. #include<iostream> #i ...
- 读写 Excel 工作表
导入诸如 CSV 之类文本格式的数据的优点是不需要依靠某些特定软件来读取数据,并且文件具有可读性,即软件中性.然而,它的缺点也很明显——我们不能直接对文本编辑器中的数据执行计算操作,因为这些内容是纯文 ...
- Eclipse 常用快捷键和使用技巧
1.查看快捷键定义的地方 Window->Preferences->General->Keys. 2.更改启动页 在AndroidManifest.xml第一个activity标签项 ...
- The web application you are attempting to access on this web server is currently unavailable.......
今天去服务器安装了个.net 4.0 framework(原本有1.0和2.0的),配置好站点后,选择版本为4.0,访问出错,错误代码如下 Server Application Unavailable ...
- System.ComponentModel.DataAnnotations 命名空间和RequiredAttribute 类
System.ComponentModel.DataAnnotations 命名空间提供定义 ASP.NET MVC 和 ASP.NET 数据控件的类的特性. RequiredAttribute 指定 ...
- 使用扩展方法(Chapter3 P39-41)
namespace LanguageFeatures { public class ShoppingCart { public List<Product> Products { get; ...
- 021PHP基础知识——代码重用
<?php /** * 代码重用 * include() require() 载入文件 * include() 如果载入的文件不存在,提示警告错误. * require() 如果载入的文件不存在 ...
- centos7.3安装配置vsftp
首先使用命令查看,系统内是否安装了vsftp [root@instance_290388 down]# rpm -qa |grep vsftp 如果没有安装,使用命令,进行安装 [root@insta ...
- 将int转int数组并将int数组元素处理后转int,实现加密
package faceobject; import java.util.Arrays; public class Test { /** 加密问题 数据是小于8位的整数 先将数据倒序,然后将每位数字都 ...
- 2018.12.4 王二的经济学故事 DYNASTIES
1从王二卖粮食:外汇储备缩水 2王二兑酒:固定汇率与变动汇率 3苹果换梨子:固定汇率的代价 4跨港购物:一价定律,汇率的价格传递效应 5富人吃透,春运火车票涨价:供需问题,弱者保护,让富人多消费,给穷 ...