RabbitMQ整合SpringBoot

本文介绍如何通过Spring Boot实现RabbitMQ消息队列的生产者与消费者应用,包括配置依赖、设置交换机和队列,以及消息的发送与接收。

包结构

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

生产者配置文件:

#端口号
server:
  port: 8080

spring:
  rabbitmq:
    username: admin
    password: admin
    #虚拟主机   默认为 /
    virtual-host: /
    host: 192.168.xxx.xxx
    port: xxxx

消费者配置文件:

配置文件

#端口号
server:
  port: 8848

spring:
  rabbitmq:
    username: admin
    password: admin
    #虚拟主机   默认为 /
    virtual-host: /
    host: 192.168.xxx.xxx
    port: xxxx

RabbitMQSpringBoot的整合中 我们选择使用配置类的方法来把交换机和队列 创建出来

这个配置类可以放在 生产者中 也可以放在消费者里面 当然 如果你想保险一点也可以都写上一个配置类

我习惯把配置类写在消费者中 下面我就把代码放上

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfiguration {
    //1.创建交换机
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("order_system_exchange",true,false);
    }
    //2.创建队列
    //商家队列
    @Bean
    public Queue queueBusiness(){
        return new Queue("queue.business",true);
    }
    //订单系统队列
    @Bean
    public Queue queueOrder(){
        return new Queue("queue.order",true);
    }
    //3.交换机绑定队列
    //绑定商家队列
    @Bean
    public Binding busBinding(){
        return BindingBuilder.bind(queueBusiness()).to(directExchange()).with("bus");
    }
	//绑定订单系统队列
    @Bean
    public Binding ordertBinding(){
        return BindingBuilder.bind(queueOrder()).to(directExchange()).with("order");
    }

}

生产者

@Service
public class OrderService {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void creatorder(OrderCreateVO orderCreateVO){
        //向消息队列发送消息
        //订单消息
        //创建一个用于传递信息的对象
        OrderMessageDTO orderMessageDTO = new OrderMessageDTO();
        //订单的id
        orderMessageDTO.setOrderId(orderPO.getId());
        //商品的id
        orderMessageDTO.setProductId(orderPO.getProductId());
        //用户id
        orderMessageDTO.setAccountId(orderCreateVO.getAccountId());
        //交换机
        String eachangeName = "order_system_exchange";
        //路由
        String routingKey = "bus";
        //发送消息
        String s = JSON.toJSONString(orderMessageDTO);//转为JOSN
        rabbitTemplate.convertAndSend(eachangeName,routingKey,s);
        System.out.println("发送消息-----------------------》");
    }
}

消费者

@Service
@RabbitListener(queues = "queue.business")
public class OrderMessagesService {

    ObjectMapper objectMapper = new ObjectMapper();
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @RabbitHandler
    public void reviceMessages(String message) throws JsonProcessingException {
        System.out.println("商家收到消息----------->"+message);
        //把收到的消息(json)转成对象
        OrderMessageDTO orderMessageDTO = objectMapper.readValue(message, OrderMessageDTO.class);
        //查询商品是否可用
        
        //查询商家是否还营业
        
        //判断商品是否可用&判断商家是否还在营业
        
        //把响应消息发送给订单系统
        //交换机
        String eachangeName = "order_system_exchange";
        //路由
        String routingKey = "order";
        rabbitTemplate.convertAndSend(eachangeName,routingKey,"商家返回消息");
    }
}

上面两个类就是 生产者把一个订单的消息发送给商家 商家确认以后再把确认以后的消息传给订单系统

订单系统接收商家发送的消息

@Service
@RabbitListener(queues = "queue.order")
public class BusinessMessageService {
    @RabbitHandler
    public void BusinessMessage(String message){
        System.out.println("----------->"+message);
    }
}
内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度和16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值