当前位置: 首页 > 编程笔记 >

springboot集成rabbitMQ之对象传输的方法

邢冷勋
2023-03-14
本文向大家介绍springboot集成rabbitMQ之对象传输的方法,包括了springboot集成rabbitMQ之对象传输的方法的使用技巧和注意事项,需要的朋友参考一下

rabbitMQ的安装方法网上有很多教程,这里就不重复了。

在springboot上使用rabbitMQ传输字符串和对象,本文所给出的例子是在两个不同的项目之间进行对象和和字符串的传输。

rabbitMQ的依赖(在两个项目中一样的配置):

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

pom配置文件(在两个项目中一样的配置):

spring.application.name: demo1  //项目名
spring.rabbitmq.host: 192.168.1.111 //写自己的ip
spring.rabbitmq.port: 5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest
spring.rabbitmq.virtual-host: /
spring.rabbitmq.publisher-confirms: true
spring.rabbitmq.publisher-returns: true
spring.rabbitmq.template.mandatory: true

字符转的相互传输(本例使用的topic类型)

1>. 首先,在生产者(项目A)中写配置文件,其中生成队列queue,交换机exchange并且进行绑定binding

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author:fdh
 * @Description:
 * @Date: Create in 16:13 2017/12/22
 */
@Configuration
public class senderConfigration {
  /**
  *@Description: 新建队列 topic.messages
  *@Data:16:14 2017/12/22
  */
  @Bean(name = "messages")
  public Queue queueMessages(){
    return new Queue("topic.messages");
  }
  /**
  *@Description: 定义交换器
  *@Data:16:15 2017/12/22
  */
  @Bean
  public TopicExchange exchange(){
    return new TopicExchange("exchange");
  }
  /**
  *@Description: 交换机与消息队列进行绑定 队列messages绑定交换机with topic.messages
  *@Data:16:18 2017/12/22
  */
  @Bean
  Binding bindingExchangeMessages(@Qualifier("messages") Queue queueMessages,TopicExchange exchange){
    return BindingBuilder.bind(queueMessages).to(exchange).with("topic.messages");
  }
}

2>. 第二步(项目A),生产者把消息发送到消息队列,

/**
 * @Author:fdh
 * @Description:
 * @Date: Create in 14:15 2017/12/22
 */
@Controller
public class RabbitController {
  @Autowired
  private AmqpTemplate amqpTemplate;
  @RequestMapping("/sendss")
  public void send1(){
    amqpTemplate.convertAndSend("exchange","topic.messages","hello topic.messages RabbitMQ");
  }
}

3>. 接下来,在消费者(项目B)端写一个监听器,交换器会根据绑定的routing key(topic.messages)把生产者生产的消息放到匹配的消息队列中,监听器会监听相应的消息队列来获取路由到该消息队列上的消息。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
/**
 * @ Author:fdh
 * @ Description: 消息队列监听器
 * @ Date: Create in 14:19 2017/12/22
 */
@Component
public class Receiver {
 @RabbitListener(queues = "topic.messages")
  public void process2(String str1) throws ClassNotFoundException{
    System.out.println("messages :"+str1);
    System.out.println(Thread.currentThread().getName()+"接收到来自topic.message队列的消息: "+str1); 
  }

这样,一个简单的字符串的传输便写好了,下面打开刚才定义的mapping: 192.168.1.111:8080/sendss

在消费者端的console窗口便会看到打印的消息

以上就是一个简单的传输字符串的例子了。

2. 下面重点介绍一下消费者和生产者之间对象的传输。

对象的传输,要现在生产者(A)中进行序列化,即把对象转化为字节数组进行传输,在消费者中,再把转化的字节数组反序列化为对象。序列化和反序列化的方法很多,这里采用的是java的Serializable 接口

1>. 在生产者(项目A)和消费者(项目B)的项目中创建实体类。

!注意!:新建实体类Boy.java 该实体类在项目A、B中的位置,必须一致,即包名必须一致,在本项目中,Boy.java 在项目A、B中都是: import com.fengdonghao.shiro.bean.Boy;

实体类也要一致。

package com.fengdonghao.shiro.bean;
import javax.persistence.*;
import java.io.Serializable;
/**
 * @Author:fdh
 * @Description:
 * @Date:Create in11:14 2017/12/16
 */
@Entity
public class Boy implements Serializable{
  private static final long serialVersionUID=1L;
  @Id
  @GeneratedValue
  private int id;
  private String name;
  private int age;
  @Override
  public String toString() {
    return "Boy{" +
        "age=" + age +
        ", id=" + id +
        ", name='" + name + '\'' +
        '}';
  }
//此处省略getter 和setter 方法
}

2>. 在生产者(A)中配置 消息队列,交换器,并进行绑定binding,和在 例子1中的第一步是一样的

3>. 在生产者(A)中的RabbitController.java 中另写一个mapping,如下

@RequestMapping("/send")
  public void sendMessage() {
    Boy boy= new Boy();
    boy.setName("tim");
    boy.setAge(11);
    System.out.println(boy);
    //以下是序列化操作
    //Write Obj to File
    ObjectOutputStream oos = null;
    try {
      oos = new ObjectOutputStream(new FileOutputStream(new File("E:\\WebPackage\\a.txt")));//把序列化之后的字节数组暂时存放在该目录下
      oos.writeObject(boy);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      IOUtils.closeQuietly(oos);
    }
    rabbitMQService.send("对象已序列化");

4>. 在消费者(B)中对字节数组进行反序列化。

在Receiver中,重新编写例1重点的监听器

@RabbitListener(queues = "topic.messages")
  public void process2(String str1) {
    System.out.println(Thread.currentThread().getName()+"接收到来自topic.message队列的消息: "+str1+" 并进行反序列化");
    File file = new File("E:\\WebPackage\\a.txt");//消费者和生产者中路径要保持一致,才能读取文件,进行解析
    ObjectInputStream ois = null;
    try {
      ois = new ObjectInputStream(new FileInputStream(file));
      Boy newUser = (Boy) ois.readObject();
      System.out.println("反序列之后:"+newUser);
      System.out.println("反序列之后getname:"+newUser.getName());
      System.out.println("反序列之后getAge"+newUser.getAge());
    } catch (IOException e) {
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } finally {
      IOUtils.closeQuietly(ois);
      try {
        FileUtils.forceDelete(file);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    System.out.println("messages :"+str1);
  }

验证mapping: ip:8080/send

结果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 问题内容: 您能否简单地解释一下Transfer对象和Domain对象之间的区别?如果您可以举一个Java示例,那就太好了。 问题答案: DTO没有任何逻辑。他们只有字段(州)。在将数据从一个层/子系统传输到另一层/子系统时使用它们 域对象可以具有逻辑(取决于您使用的是域驱动设计还是贫乏的数据模型),并且它们通常与数据库结构相关。 如果使用贫乏的数据模型(即您的域对象没有任何逻辑),则DTO和域对

  • 本文向大家介绍Spring Boot系列教程之7步集成RabbitMQ的方法,包括了Spring Boot系列教程之7步集成RabbitMQ的方法的使用技巧和注意事项,需要的朋友参考一下 前言 RabbitMQ是一种我们经常使用的消息中间件,RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现

  • 本文向大家介绍SpringBoot集成SpringMVC的方法示例,包括了SpringBoot集成SpringMVC的方法示例的使用技巧和注意事项,需要的朋友参考一下 Spring MVC是一款优秀的、基于MVC思想的应用框架,它是Spring的一个子框架。是当前最优秀的MVC框架。 Spring Boot整合Spring MVC只需在pom.xml中引入 配置Spring MVC applica

  • 本文向大家介绍SpringBoot系列教程之dubbo和Zookeeper集成方法,包括了SpringBoot系列教程之dubbo和Zookeeper集成方法的使用技巧和注意事项,需要的朋友参考一下 今日学习新的内容:dubbo   dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡

  • 本文向大家介绍详解SpringBoot之集成Spring AOP,包括了详解SpringBoot之集成Spring AOP的使用技巧和注意事项,需要的朋友参考一下 在开始之前,我们先把需要的jar包添加到工程里。新增Maven依赖如下:  接下来,我们进入正题。这里的涉及的通知类型有:前置通知、后置最终通知、后置返回通知、后置异常通知、环绕通知,下面我们就具体的来看一下怎么在SpringBoot中

  • 本文向大家介绍Springboot中集成Swagger2框架的方法,包括了Springboot中集成Swagger2框架的方法的使用技巧和注意事项,需要的朋友参考一下 摘要:在项目开发中,往往期望做到前后端分离,也就是后端开发人员往往需要输出大量的服务接口,接口的提供方无论是是Java还是PHP等语言,往往会要花费一定的精力去写接口文档,比如A接口的地址、需要传递参数情况、返回值的JSON数据格式