spring cloud stream rabbitMq 生产-消费模式

原创 2018年04月17日 10:20:18

首先创建两个spring cloud项目,一个项目为生产者项目,一个项目为消费者项目

在两个项目中引入stream的包

这里使用的是rabbitMq的包

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>

然后配置文件中添加mq相关配置

spring
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

这时启动项目,启动日志中会出现类似以下日志,说明rabbitMq连接成功

Attempting to connect to: [127.0.0.1:5672]
Created new connection: rabbitConnectionFactory#28068327:0/SimpleConnection@55fbebba [delegate=amqp://guest@127.0.0.1:5672/, localPort= 51415]

现在在生产者项目中创建一个生产者

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;

import java.util.UUID;

@EnableBinding(Source.class)
public class Producer {
    @Autowired
    @Output(Source.OUTPUT)
    private MessageChannel channel;

    public void send() {
        channel.send(MessageBuilder.withPayload("22222222222" + UUID.randomUUID().toString()).build());
    }
}

在消费者项目中创建一个消费者

import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.messaging.Message;

@EnableBinding(Sink.class)
public class Consumer {
    @StreamListener(Sink.INPUT)
    public void receive(Message<String> message) {
        System.out.println("接收到MQ消息:" + JSONObject.toJSONString(message));
    }
}

这里我用的stream提供的接口,也可以自定义

public interface Sink {
  String INPUT = "input";

  @Input(Sink.INPUT)
  SubscribableChannel input();
}
public interface Source {
    String OUTPUT = "output";

    @Output("output")
    MessageChannel output();
}

复制以上两个类的代码并修改INPUT或者OUTPUT便可完成自定义接口

需要注意的是INPUT和OUTPUT的值会在配置文件中做配置,不然你会发现项目没报错,消息也发出去了,但是收不到,这里非常重要

官方文档也有说明

setting the application property spring.cloud.stream.bindings.input.destination to raw-sensor-data will cause it to read from the raw-sensor-data Kafka topic, or from a queue bound to the raw-sensor-data RabbitMQ exchange

在生产者项目配置文件中添加

spring
  cloud:
    stream:
      bindings:
        output:
          destination: my-test-channel

在消费者项目配置文件中添加

spring
  cloud:
    stream:
      bindings:
        input:
          destination: my-test-channel

这里的input和output分别对应上面的Sink.INPUT和Source.OUTPUT

在生产者项目中创建一个controller,将Producer自动注入,写一个get或post调用Producer.send

重启两个项目,调用Producer.send,这时消费者项目控制台会打印

接收到MQ消息:{"headers":{"amqp_receivedDeliveryMode":"PERSISTENT","amqp_receivedRoutingKey":"my-test-channel","amqp_receivedExchange":"my-test-channel","amqp_deliveryTag":1,"amqp_consumerQueue":"my-test-channel.anonymous.vYA2O6ZSQE-S9MOnE0ZoJQ","amqp_redelivered":false,"id":"805e7fc3-a046-e07a-edf5-def58d9c8eab","amqp_consumerTag":"amq.ctag-QwsmRKg5f0DGSp-7wbpYxQ","contentType":"text/plain","timestamp":1523930106483},"payload":"22222222222a7d24456-5b11-4c25-9270-876e7bbc556a"}

说明测试成功

这里还有一点需要注意,我之前没注意踩了个坑,在项目完全启动好之前,可能会存在加载顺序不一致,我在controller中自动注入了一个方法来调用Producer.send,结果项目启动失败,原因就是rabbitMq的相关配置还没完全初始化,把调用放在get请求方法中等项目启动完成就可以调用了





Spring Cloud Stream(消息驱动)

1、什么是Spring Cloud Stream Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它可以基于Spring Boot 来创建独立的,可用于生产...
  • jack281706
  • jack281706
  • 2017年06月26日 17:59
  • 5726

rabbitmq笔记 与 springcloudstream的交互

消费者生产者模式,基于amqp协议。 服务与rabbitmq的amqp连接基于tcp,通过信道来传递消息 消息由标签和荷载两部分组成,标签包括路由的信息,真正的消息在荷载上。 关于队列 消息最终会...
  • yyz335258
  • yyz335258
  • 2017年09月12日 15:41
  • 1739

spring-cloud-stream — Retry With the RabbitMQ Binder

A simplified diagram of how the RabbitMQ binder operates can be seen below.The RabbitMQ Binder imple...
  • kangkanglou
  • kangkanglou
  • 2017年08月01日 21:22
  • 418

Spring Cloud Stream使用细节

上篇文章我们看了Spring Cloud Stream的基本使用,小伙伴们对Spring Cloud Stream应该也有了一个基本的了解,但是上篇文章中的消息我们是从RabbitMQ的web管理页面...
  • u012702547
  • u012702547
  • 2017年12月04日 15:19
  • 2362

[翻译]Spring Cloud Stream

原文在这里1.简介Spring Cloud Stream是创建消息驱动微服务应用的框架。Spring Cloud Stream是基于spring boot创建,用来建立单独的/工业级spring应用,...
  • phyllisy
  • phyllisy
  • 2016年05月09日 14:31
  • 10420

异常解决篇:spring cloud stream rabbitMq配置错误,导致无法启动

异常信息org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name...
  • aiyaya_
  • aiyaya_
  • 2017年11月14日 13:24
  • 1261

设计模式——生产消费者模式

设计模式——生产消费者模式 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。 像图片下载加载的模型就可以参考这个...
  • u011486491
  • u011486491
  • 2017年09月05日 11:26
  • 308

SpringCloud之消息驱动的微服务Spring Cloud Stream实例

一、简介 Spring Cloud Stream是一个用来为微服务应用构建消息驱动能力的框架。它可以基于Spring Boot 来创建独立的、可用于生产的 Spring 应用程序。它通过使用 Spr...
  • smartdt
  • smartdt
  • 2018年01月16日 17:08
  • 267

spring cloud笔记 - stream初篇

Spring Cloud Stream是构建消息驱动的微服务应用程序的框架。Spring Cloud Stream基于Spring Boot建立独立的生产级Spring应用程序,并使用Spring I...
  • jsu_9207
  • jsu_9207
  • 2017年06月01日 23:13
  • 6097

RabbitMQ下的生产消费者模式与订阅发布模式

生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信。本文在总结了RabbitMQ核心概念的基础上,以“数据接入”和“事件分发”两个场景来探讨如何实现生产...
  • zwgdft
  • zwgdft
  • 2016年12月11日 16:58
  • 8898
收藏助手
不良信息举报
您举报文章:spring cloud stream rabbitMq 生产-消费模式
举报原因:
原因补充:

(最多只允许输入30个字)