SpringBoot整合RabbitMQ

SpringBoot配置RabbitMQ

配置maven
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
配置文件application.yml
spring:
  rabbitmq:
    username: user_mmr #用户名
    password: 123 #密码
    host: localhost # 你要连接的RabbitMQ的host
    port: 5672 # Rabbit的port
    virtual-host: '/vhost_mmr' #virtual-host

RabbitMQ教程

以下教程都可以在RabbitMQ在github的仓库rabbitmq-tutorial中找到,具体springboot在spring-amqp模块中。在这里面要讲一下如何运行相关代码

### 打包项目
mvn clean package

### 运行项目
java -jar xxx.jar --spring.profiles.active=tut1,sender


### 下面放上相关运行命令
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=hello-world,receiver");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=hello-world,sender");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=work-queues,receiver");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=work-queues,sender");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=pub-sub,receiver");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=pub-sub,sender");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=routing,receiver");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=routing,sender");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=topics,receiver");
System.out.println("java -jar rabbit-tutorials.jar --spring.profiles.active=topics,sender");


#### 注意,该项目使用了定时任务
你需要配置允许定时调度的注解
@EnableScheduling
helloworld
@Profile({"tut1","hello-world"})
@Configuration
public class Tut1Config {
    @Bean
    public Queue hello(){
        return new Queue("hello");
    }

    @Profile("receiver")
    @Bean
    public Tut1Receiver receiver(){
        return new Tut1Receiver();
    }

    @Profile("sender")
    @Bean
    public Tut1Sender sender(){
        return new Tut1Sender();
    }

}

// 监听hello队列 Annotation that marks a method to be the target of a Rabbit message listener on the
// specified queues()或者bindings(). 
@RabbitListener(queues = "hello")
public class Tut1Receiver {
    private static final Logger logger = LoggerFactory.getLogger(Tut1Receiver.class);

    // Annotation that marks a method to be the target of a Rabbit message
 	// listener within a class that is annotated with {@link RabbitListener}
    @RabbitHandler
    public void receive(String in) {
        logger.info("[x] Received:{} ", in);
        System.out.println("[x] Received:{} "+ in);
    }
}
public class Tut1Sender {
    private final static Logger logger = LoggerFactory.getLogger(Tut1Sender.class);
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private Queue queue;

    @Scheduled(fixedDelay = 1000, initialDelay = 500)
    public void send() {
        String msg = "hello world";
        this.rabbitTemplate.convertAndSend(queue.getName(), msg);
        logger.info("[x] sent :" + msg);
        System.out.println("[x] sent :" + msg);
    }

}
// java -jar xxx.jar --spring.profiles.active=hello-world,receiver
// java -jar xxx.jar --spring.profiles.active=hello-world,sender
work-queues
@RabbitListener(queues = "tut.hello")
public class Tut2Receiver {
    private final static Logger logger = LoggerFactory.getLogger(Tut2Receiver.class);

    private final int instance;

    public Tut2Receiver(int i){
        this.instance = i;
    }

    @RabbitHandler
    public void receive(String in) throws InterruptedException{
        StopWatch watch = new StopWatch();
        watch.start();
        logger.info("instance " + this.instance+"[x] recived" + in);
        doWork(in);
        watch.stop();
        logger.info("instance " + this.instance +"[x] done");
    }

    private void doWork(String in) throws InterruptedException{
        for (char ch:in.toCharArray()){
            if(ch == '.'){
                TimeUnit.SECONDS.sleep(1);
            }
        }
    }

}

public class Tut2Sender {
    private static Logger logger = LoggerFactory.getLogger(Tut2Sender.class);
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private Queue queue;

    AtomicInteger dots = new AtomicInteger(0);
    AtomicInteger count = new AtomicInteger(0);

    @Scheduled(fixedDelay = 1000,initialDelay = 500)
    public void send(){
        StringBuilder builder = new StringBuilder("hello");
        if(dots.getAndIncrement() == 3){
            dots.set(1);
        }
        for(int i = 0;i<dots.get();i++){
            builder.append(".");
        }
        builder.append(count.incrementAndGet());
        String msg = builder.toString();
        rabbitTemplate.convertAndSend(queue.getName(),msg);
        logger.info("[x] sent {}",msg);
    }
}
@Profile({"tut2","work-queues"})
@Configuration
public class Tut2Config {
    @Bean
    public Queue hello(){
        return new Queue("tut.hello");
    }

    @Profile("receiver")
    private static class ReceiverConfig{
        @Bean
        public Tut2Receiver receiver1(){
            return new Tut2Receiver(1);
        }

        @Bean
        public Tut2Receiver receiver2(){
            return new Tut2Receiver(2);
        }

    }


    @Profile("sender")
    @Bean
    public Tut2Sender sender(){
        return new Tut2Sender();
    }

}
pub-sub
@Configuration
@Profile({"tut3","pub-sub","publish-subscribe"})
public class Tut3Config {
    @Bean
    public FanoutExchange fanout(){
        return new FanoutExchange("tut.fanout");
    }

    @Profile("receiver")
    private static class ReceiverConfig{
        @Bean
        public Queue autoDeleteQueue1(){
            return new AnonymousQueue();
        }

        @Bean
        public Queue autoDeleteQueue2(){
            return new AnonymousQueue();
        }

        // 这个地方可能注册不成功
        @Bean
        public Binding binding1(FanoutExchange fanout,Queue autoDeleteQueue1){
            return BindingBuilder.bind(autoDeleteQueue1).to(fanout);
        }

        @Bean
        public Binding binding2(FanoutExchange fanout,Queue autoDeleteQueue2){
            return BindingBuilder.bind(autoDeleteQueue2).to(fanout);
        }

        @Bean
        public Tut3Receiver receiver(){
            return new Tut3Receiver();
        }
    }

    @Profile("sender")
    @Bean
    public Tut3Sender sender(){
        return new Tut3Sender();
    }

}
public class Tut3Receiver {

    @RabbitListener(queues = "#{autoDeleteQueue1.name}")
    public void receive1(String in) throws InterruptedException{
        receive(in,1);
    }

    @RabbitListener(queues = "#{autoDeleteQueue2.name}")
    public void receive2(String in) throws InterruptedException{
        receive(in,2);
    }


    public void receive(String in,int receiver) throws InterruptedException{
        StopWatch watch = new StopWatch();
        watch.start();
        System.out.println("instance " + receiver + "[x] Received" + in);
        doWork(in);
        watch.stop();
        System.out.println("instance" + receiver + "[x] Done in" + watch.getTotalTimeSeconds()+"s");
    }

    private void doWork(String in) throws InterruptedException{
        for(char ch: in.toCharArray()){
            if(ch == '.'){
                TimeUnit.SECONDS.sleep(1);
            }
        }
    }

}
public class Tut3Sender {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private FanoutExchange fanout;

    AtomicInteger dots = new AtomicInteger(0);

    AtomicInteger count = new AtomicInteger(0);

    @Scheduled(fixedDelay = 1000,initialDelay = 500)
    public void send(){
        StringBuilder builder = new StringBuilder("hello");
        if(dots.getAndIncrement() == 3){
            dots.set(1);
        }
        for(int i = 0;i < dots.get();i++){
            builder.append(".");
        }
        builder.append(count.incrementAndGet());
        String message = builder.toString();
        rabbitTemplate.convertAndSend(fanout.getName(),"",message);
        System.out.println("[x] sent" +message);
    }

}

direct
@Profile({"tut4","routing"})
@Configuration
public class Tut4Config {
    // 设置exchange
    @Bean
    public DirectExchange direct(){
        return new DirectExchange("tut.direct");
    }

    @Profile("receiver")
    private static class ReceiverConfig{
        // 创建两个匿名Queue  an anonymous, non-durable, exclusive, auto-delete queue
        @Bean
        public Queue autoDeleteQueue1(){
            return new AnonymousQueue();
        }

        @Bean
        public Queue autoDeleteQueue2(){
            return new AnonymousQueue();
        }

        // 绑定相关数据
        @Bean
        public Binding binding1a(DirectExchange directExchange,Queue autoDeleteQueue1){
            return BindingBuilder.bind(autoDeleteQueue1).to(directExchange).with("orange");
        }

        @Bean
        public Binding binding1b(DirectExchange directExchange,Queue autoDeleteQueue1){
            return BindingBuilder.bind(autoDeleteQueue1).to(directExchange).with("black");
        }


        @Bean
        public Binding binding2a(DirectExchange directExchange,Queue autoDeleteQueue2){
            return BindingBuilder.bind(autoDeleteQueue2).to(directExchange).with("green");
        }

        @Bean
        public Binding binding2b(DirectExchange direct,Queue autoDeleteQueue2){
            return BindingBuilder.bind(autoDeleteQueue2).to(direct).with("black");
        }

        //
        @Bean
        public Tut4Receiver receiver(){
            return new Tut4Receiver();
        }
    }

    @Profile("sender")
    @Bean
    public Tut4Sender sender(){
        return new Tut4Sender();
    }
    
}

public class Tut4Receiver {
    @RabbitListener(queues = "#{autoDeleteQueue1.name}")
    public void receive1(String in) throws InterruptedException{
        receive(in,1);
    }

    @RabbitListener(queues = "#{autoDeleteQueue2.name}")
    public void receive2(String in) throws InterruptedException{
        receive(in,2);
    }

    public void receive(String in,int receiver) throws InterruptedException{
        StopWatch watch = new StopWatch();
        watch.start();
        System.out.println("instance " + receiver+"[x] received ' " + in+ "'");
        doWork(in);
        watch.stop();
        System.out.println("instance "+ receiver+"[x] Done in" + watch.getTotalTimeSeconds()+"s");
    }

    private void doWork(String in) throws InterruptedException{
        for(char ch: in.toCharArray()){
            if(ch == '.'){
                TimeUnit.SECONDS.sleep(1);
            }
        }
    }
}
public class Tut4Sender {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private DirectExchange directExchange;

    AtomicInteger index = new AtomicInteger(0);

    AtomicInteger count = new AtomicInteger(0);

    private final String[] keys = {"orange", "black", "green"};

    @Scheduled(fixedDelay = 1000, initialDelay = 500)
    public void send() {
        StringBuilder builder = new StringBuilder("Hello to ");
        if (this.index.incrementAndGet() == 3) {
            this.index.set(0);
        }
        String key = keys[this.index.get()];
        builder.append(key).append(' ');
        builder.append(this.count.incrementAndGet());
        String message = builder.toString();
        rabbitTemplate.convertAndSend(directExchange.getName(), key, message);
        System.out.println("[X] sent '" + message + "'");
    }
}
topic
@Profile({"tut5","topics"})
@Configuration
public class Tut5Config {

    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("tut.topic");
    }

    @Profile("receiver")
    private static class ReceiverConfig{
        @Bean
        public Tut5Receiver receiver(){
            return new Tut5Receiver();
        }

        @Bean
        public Queue autoDeleteQueue1(){
            return new AnonymousQueue();
        }

        @Bean
        public Queue autoDeleteQueue2(){
            return new AnonymousQueue();
        }

        @Bean
        public Binding binding1a(TopicExchange topicExchange,Queue autoDeleteQueue1){
            return BindingBuilder.bind(autoDeleteQueue1).to(topicExchange).with("*.orange.*");
        }

        @Bean
        public Binding binding1b(TopicExchange topicExchange,Queue autoDeleteQueue1){
            return BindingBuilder.bind(autoDeleteQueue1).to(topicExchange).with("*.*.rabbit");
        }

        @Bean
        public Binding binding2a(TopicExchange topic,Queue autoDeleteQueue2){
            return BindingBuilder.bind(autoDeleteQueue2).to(topic).with("lazy.#");
        }

    }

    @Profile("sender")
    @Bean
    public Tut5Sender sender(){
        return new Tut5Sender();
    }


}

public class Tut5Receiver {
    @RabbitListener(queues = "#{autoDeleteQueue1.name}")
    public void receive1(String in) throws InterruptedException {
        receive(in, 1);
    }

    @RabbitListener(queues = "#{autoDeleteQueue2.name}")
    public void receive2(String in) throws InterruptedException {
        receive(in, 2);
    }


    public void receive(String in, int receiver) throws InterruptedException {
        StopWatch watch = new StopWatch();
        watch.start();
        System.out.println("instance " + receiver + " [X] received ' " + in + " '");
        doWork(in);
        watch.stop();
        System.out.println("instance " + receiver + " [X] Done in" + watch.getTotalTimeSeconds() +"s");
    }

    private void doWork(String in) throws InterruptedException{
        for(char ch : in.toCharArray()){
            if(ch == '.'){
                TimeUnit.SECONDS.sleep(1);
            }
        }
    }

}
public class Tut5Sender {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private TopicExchange topicExchange;

    AtomicInteger index = new AtomicInteger(0);

    AtomicInteger count = new AtomicInteger(0);

    private final String[] keys = {"quick.orange.rabbit", "lazy.orange.elephant", "quick.orange.fox",
            "lazy.brown.fox", "lazy.pink.rabbit", "quick.brown.fox"};
    @Scheduled(fixedDelay = 1000,initialDelay = 500)
    public void send(){
        StringBuilder builder = new StringBuilder("Hello to ");
        if(this.index.incrementAndGet() == keys.length){
            this.index.set(0);
        }
        String key = keys[this.index.get()];
        builder.append(key).append(" ");
        builder.append(this.count.incrementAndGet());
        String message = builder.toString();
        rabbitTemplate.convertAndSend(topicExchange.getName(),key,message);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot框架可以很容易地与RabbitMQ进行集成。为了实现这个目标,你需要在项目的依赖项中添加两个关键的依赖项。首先,你需要添加spring-boot-starter-amqp依赖项,它提供了与RabbitMQ进行通信的必要类和方法。其次,你还需要添加spring-boot-starter-web依赖项,以便在项目中使用Web功能。 在你的项目中创建两个Spring Boot应用程序,一个是RabbitMQ的生产者,另一个是消费者。通过这两个应用程序,你可以实现消息的发送和接收。生产者应用程序负责将消息发送到RabbitMQ的消息队列,而消费者应用程序则负责从队列中接收并处理消息。这样,你就可以实现基于RabbitMQ的消息传递系统。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot整合RabbitMQ](https://blog.csdn.net/K_kzj_K/article/details/106642250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Springboot 整合RabbitMq ,用心看完这一篇就够了](https://blog.csdn.net/qq_35387940/article/details/100514134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [undefined](undefined)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值