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

结果如下:

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

(0)

相关推荐

  • springboot整合rabbitmq的示例代码

    概述 RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,或者简单地将作业队列以便让分布式服务器进行处理. 它现实了AMQP协议,并且遵循Mozilla Public License开源协议,它支持多种语言,可以方便的和spring集成. 消息队列使用消息将应用程序连接起来,这些消息通过像RabbitMQ这样的消息代理服务器在应用程序之间路由. 基本概念 Broker 用来处理数据的消息队列服务器实体 vhost 由RabbitMQ服务器创建的虚拟消息

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

    rabbitMQ的安装方法网上有很多教程,这里就不重复了. 在springboot上使用rabbitMQ传输字符串和对象,本文所给出的例子是在两个不同的项目之间进行对象和和字符串的传输. rabbitMQ的依赖(在两个项目中一样的配置): <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId>

  • SpringBoot集成EasyExcel实现Excel导入的方法

    第一次正式的写文章进行分享,如果文章中有什么问题,欢迎大家在文末的群内反馈. 一.背景 为什么会用Easyexcel来做Excel上传 平时项目中经常使用EasyExcel从本地读取Excel中的数据,还有一个前端页面对需要处理的数据进行一些配置(如:Excel所在的文件夹,Excel的文件名,以及Sheet列名.处理数据需要的某些参数),由于每次都是读取的本地的文件,我就在想,如果某一天需要通过前端上传excel给我,让我来进行处理我又应该怎么办呢?我怎么才能在尽量少修改代码的前提下实现这个功

  • SpringBoot集成RabbitMQ和概念介绍

    目录 一.RabbitMQ介绍 二.相关概念 三.简单使用 1.配置pom包 2.配置文件 3.队列配置 4.发送者 5.接收者 6.测试 四.高级使用 1.Topic Exchange 2.Fanout Exchange 一.RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性. 高可用性等方面表现不俗.RabbitMQ主要是为了实现系统之间的双向解耦而实现的.当生产者大量产生数据时,消

  • springboot集成redis存对象乱码的问题及解决

    目录 springboot集成redis存对象乱码 话不多说上代码 可以考虑使用StringRedisTemplete 解决redis乱码问题 直接添加一个配置类就行了 springboot集成redis存对象乱码 其实本质上不算是一种乱码,只是序列化之后存储的东西而已,当我们使用RedisTemplete存储对象,时,如果该对象没有被序列化则会报错,序列化之后得到的不是自己想要的数据,为了解决这种方法,我们可以使用 StringRedisTemplete 话不多说上代码 默认使用rediste

  • springboot集成druid连接池配置的方法

    在开发项目中如果数据库选型为mysql,很大概率下连接池会使用druid 这里介绍springboot集成durid springboot : 2.1.9 druid : 1.1.10 案例地址 github地址 springboot集成druid配置 需要引入的pom <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactI

  • SpringBoot集成Redis实现消息队列的方法

    list 原理说明 Redis 的 list 是按照插入顺序排序的字符串链表. 如图所示,可以通过 lpush 和 rpop 或者 rpush 和 lpop 实现消息队列. 1 lpush 和 rpop 2 rpush 和 lpop 消息队列功能实现 引入 Redis 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data

  • Springboot集成RabbitMQ死信队列的实现

    目录 关于死信队列 什么样的消息会进入死信队列? 场景分析 代码实现 场景模拟 生产者 消费者,设置死信队列监听 关于死信队列 在大多数的MQ中间件中,都有死信队列的概念.死信队列同其他的队列一样都是普通的队列.在RabbitMQ中并没有特定的"死信队列"类型,而是通过配置,将其实现. 当我们在创建一个业务的交换机和队列的时候,可以配置参数,指明另一个队列为当前队列的死信队列,在RabbitMQ中,死信队列(严格的说应该是死信交换机)被称为DLX Exchange.当消息"死

  • SpringBoot集成JWT实现登陆验证的方法详解

    1:首先,我们需要在项目中导入两个依赖: <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.10.3</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifa

  • SpringBoot集成RabbitMQ实现用户注册的示例代码

    上一篇已经介绍了什么是rabbitmq以及和springboot集成方法,也介绍了springboot集成邮件的方式,不了解的可以先看以前写的文章. 三者集成 上一篇springboot集成邮件注册的已经介绍了,本篇文章基于这个介绍,我们只需要修改下面几处即可完成3者集成. 实现步骤 添加rabbitmq依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring

  • SpringBoot集成Redisson实现分布式锁的方法示例

    上篇 <SpringBoot 集成 redis 分布式锁优化>对死锁的问题进行了优化,今天介绍的是 redis 官方推荐使用的 Redisson ,Redisson 架设在 redis 基础上的 Java 驻内存数据网格(In-Memory Data Grid),基于NIO的 Netty 框架上,利用了 redis 键值数据库.功能非常强大,解决了很多分布式架构中的问题. Github的wiki地址: https://github.com/redisson/redisson/wiki 官方文档

随机推荐