linux延时队列,RabbitMQ消息队列+SpringBoot延迟队列实现

本文介绍如何在LINUX环境下安装RabbitMQ,并进行基本的管理操作,包括用户管理及服务控制等。此外,还详细介绍了如何通过SpringBoot框架来整合RabbitMQ,实现消息队列的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LINUX下安装MQ:

常用操作:

$ sudo chkconfig rabbitmq-server on # 添加开机启动RabbitMQ服务

$ sudo /sbin/service rabbitmq-server start # 启动服务

$ sudo /sbin/service rabbitmq-server status # 查看服务状态

$ sudo /sbin/service rabbitmq-server stop # 停止服务

查看当前所有用户 $ sudo rabbitmqctl list_users

查看默认guest用户的权限 $ sudo rabbitmqctl list_user_permissions guest

由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户 $ sudo rabbitmqctl delete_user guest

添加新用户 $ sudo rabbitmqctl add_user username password

设置用户tag $ sudo rabbitmqctl set_user_tags username administrator

赋予用户默认vhost的全部操作权限 $ sudo rabbitmqctl set_permissions -p / username "." "." ".*"

查看用户的权限 $ sudo rabbitmqctl list_user_permissions username

开启web管理接口

如果只从命令行操作RabbitMQ,多少有点不方便。幸好RabbitMQ自带了web管理界面,只需要启动插件便可以使用。

$ sudo rabbitmq-plugins enable rabbitmq_management 然后通过浏览器访问

输入用户名和密码访问web管理界面了。

配置RabbitMQ

关于RabbitMQ的配置,可以下载RabbitMQ的配置文件模板到/etc/rabbitmq/rabbitmq.config, 然后按照需求更改即可。 关于每个配置项的具体作用,可以参考官方文档。 更新配置后,别忘了重启服务哦!

开启用户远程访问

默认情况下,RabbitMQ的默认的guest用户只允许本机访问, 如果想让guest用户能够远程访问的话,只需要将配置文件中的loopback_users列表置为空即可,如下:

{loopback_users, []} 另外关于新添加的用户,直接就可以从远程访问的,如果想让新添加的用户只能本地访问,可以将用户名添加到上面的列表, 如只允许admin用户本机访问。

{loopback_users, ["admin"]} 更新配置后,别忘了重启服务哦!

记得要开放5672和15672端口,关闭防火墙、

SpringBoot整合RabbitMQ:

添加amqp的POM依赖:

org.springframework.boot

spring-boot-starter-amqp

添加rabbitMQ服务器配置:

spring.application.name = rabbitmqTest

server.port= 7001

spring.rabbitmq.host=10.0.0.29

spring.rabbitmq.port=5672

spring.rabbitmq.username=username

spring.rabbitmq.password=password

最重要的配置类:

@Configuration

public class RabbitConfig {

/**

* 队列1

* @return

*/

@Bean

public Queue queue(){

return new Queue("first");

}

/**

* 队列2

* @return

*/

@Bean

public Queue queue2(){

return new Queue("second");

}

/**

*

* topic交换器

* @return

*/

@Bean

public TopicExchange topicExchange(){

return new TopicExchange("exchange");

}

/**

* 绑定路由队列1

* @return

*/

@Bean

public Binding bindingExchangeMessage(){

return BindingBuilder.bind(queue()).to(topicExchange()).with("queue.first.*");

}

/**

* 绑定路由队列2

* @return

*/

@Bean

public Binding bindingExchangeMessage2(){

return BindingBuilder.bind(queue2()).to(topicExchange()).with("queue.second.#");

}

/**

* dlx死信路由

* @return

*/

@Bean

public TopicExchange derictExchange(){

return new TopicExchange("dtlExchange");

}

/**

* 产生死信的队列

* @return

*/

@Bean

public Queue dtlQueue(){

Map args = new HashMap<>();

//指定过期消息跳转的交换器名称

args.put("x-dead-letter-exchange","dtlExchange");

//指定跳转消息携带的roting-key

args.put("x-dead-letter-routing-key","dead.msg.aa");

return QueueBuilder.durable("deadQueue").withArguments(args).build();

}

/**

* 绑定 消费死信的队列 和死信路由

* @return

*/

@Bean

public Binding bindingDeadExchange(){

//routing-key保持一致

return BindingBuilder.bind(queue()).to(derictExchange()).with("dead.msg.#");

}

/**

* 绑定 产生死信的队列和任意一个路由

* @return

*/

@Bean

public Binding bindingProductExchange(){

return BindingBuilder.bind(dtlQueue()).to(topicExchange()).with("test.dead.#");

}

}

发送消息到队列:

@RestController

public class MqController {

@Autowired

private RabbitTemplate rabbitTemplate;

private static final String QUEUE_FIRST = "queue1";

private static final String QUEUE_SECOND = "queue2";

@RequestMapping(value = "/sendMsg" , method = RequestMethod.GET)

public void send(String name){

User user = new User();

user.setPwd("1123");

user.setUserid("admin");

if(QUEUE_FIRST.equals(name)){

rabbitTemplate.convertAndSend("exchange","queue.first.a",user);

}else if(QUEUE_SECOND.equals(name)){

rabbitTemplate.convertAndSend("exchange","queue.second.asasssa",user);

}else{

MessagePostProcessor postProcessor = new MessagePostProcessor() {

@Override

public Message postProcessMessage(Message message) throws AmqpException {

message.getMessageProperties().setContentEncoding("utf-8");

//设置消息存活时间

message.getMessageProperties().setExpiration("120000");

return message;

}

};

user.setCreateTime(new Date().getTime());

//发送消息到指定: 交换器,routing-key,消息体(支持对象),配置文件

rabbitTemplate.convertAndSend("exchange","test.dead.ok",user,postProcessor);

}

}

}

接受参数:

@Component

@RabbitListener(queues = "first")//指定队列名称

public class Recept {

@RabbitHandler

public void recept(User user){ //参数和队列里数据保持一致,如果是一个对象则必须要序列化

Long createTime = user.getCreateTime();

Long waitTime = null;

if(createTime !=null){

waitTime = new Date().getTime()-createTime;

}

System.out.println("延迟队列消费时间:"+waitTime+"ms");

// System.out.println("消费者1:"+user.getUserid()+user.getPwd());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值