使用 Spring Cloud Stream之rabbitMQ,简单快速上手

1.依赖:

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

定义一个接口:

package van.client.rabbit;

import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.SubscribableChannel;

/**
 * @author Van
 * @date 2020/4/11 - 11:53
 */
public interface RabbitClient {
    @Input("MyMessage")
    SubscribableChannel input();
    @Output("MyMessage")
    MessageChannel output();
}

3.定义一个接收者

package van.client.rabbit;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.stereotype.Component;

/**
 * @author Van
 * @date 2020/4/11 - 11:55
 */
@Component
@EnableBinding(RabbitClient.class)
@Slf4j
public class StreamReceiver {
    @StreamListener("MyMessage")
    public void message(Object msg){
        log.info("receive message:{}",msg);
    }
}

4.使用接口发送消息

package van.client.controller;

import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import van.client.rabbit.RabbitClient;

import javax.annotation.Resource;

/**
 * @author Van
 * @date 2020/4/11 - 12:01
 */
@RestController
@RequestMapping("/rabbit")
public class RabbitController {
@Resource
    private RabbitClient rabbitClient;
@RequestMapping("/msg")
    public void msg(){
    String msg="rabbit message";
    rabbitClient.output().send(MessageBuilder.withPayload(msg).build());
}
}

启动项目,访问localhost:8080/rabbit/msg
会看到:
在这里插入图片描述

其他:

1**.集群环境下:**
当开启多个此项目时,会相应的建立多个名为MyMessage的队列,而且发送一次消息,所有队列都会收到消息,这当然不是想要的结果。如何做到发送一次消息,只让一个项目收到?

在配置文件加入:spring.cloud.stream.bindings.MyMessage.group=client

相当于给所有的集群都归为一个组,他们共享一个名为client的queue。
当发送一个消息的时候只会有一个项目收到。
在这里插入图片描述
2.若发送的msg是一个java object,并且我想在queue中看到积累的消息。
不做任何处理的话,在queue中看到的是一个不知道什么鬼的字符串(用base64加密过的),那么我想看到一个序列化的java object该怎么办呢?

在配置文件中加入:
spring.cloud.stream.bindings.MyMessage.content-type=application/json

注意MyMessage这里都是自定义的,其实写成啥都可以。

如果receiver想再发条消息,代表已经消息确认,可以加@SentTo()

进阶可以看:这篇博客

发布了56 篇原创文章 · 获赞 1 · 访问量 1509

猜你喜欢

转载自blog.csdn.net/weixin_44841849/article/details/105450384
今日推荐