SpringBoot2实现访问RabbitMQ镜像集群

SpringBoot2实现访问RabbitMQ镜像集群

本文主要记录基于SpringBoot2实现对RabbitMQ镜像集群的访问,直接访问RabbitMQ的服务器基本一致,只需要修改配置文件。

RabbitMQ集群简要说明

  1. TCP代理负载均衡的地址和监听端口端口
    192.168.132.143:5672

  2. MQ节点一
    192.168.132.137:5672

  3. MQ节点二
    192.168.132.139:5672

代码片段

Maven依赖:pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ictpaas</groupId>
    <artifactId>rabbitmq-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rabbitmq-test</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

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

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件:application.properties

# rabbitmq
# rabbitmq服务器地址
# 镜像集群模式填写TCP代理的地址和监听的端口
# 非集群模式下,填写MQ服务器的地址和端口
spring.rabbitmq.addresses=192.168.132.143:5672
# rabbitmq的用户名和密码
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# rabbitmq服务器的虚拟主机名,可以在后台管理系统上查看和新建
spring.rabbitmq.virtual-host=/test
# 连接超时
spring.rabbitmq.connection-timeout=15000

# rabbitmq-producer
# 允许ConfirmCallback
spring.rabbitmq.publisher-confirms=true
# 允许ReturnCallback
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true

# rabbitmq-consumer
# 并发数
spring.rabbitmq.listener.simple.concurrency=1
# 最大并发数
spring.rabbitmq.listener.simple.max-concurrency=5
# 签收模式,手动
spring.rabbitmq.listener.simple.acknowledge-mode=manual
# 限流, 避免同时处理大量消息导致服务器 down 机, 根据线程数来决定
spring.rabbitmq.listener.simple.prefetch=1

生产者:RabbitmqProducerService.java

生产者需要主动调用。

package com.ictpaas.rabbitmqtest.service;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;

@Service
public class RabbitmqProducerService {

    @Resource
    private RabbitTemplate rabbitTemplate;

    RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
        @Override
        public void confirm(CorrelationData correlationData, boolean isAck, String cause) {
            System.out.println(correlationData);
            System.out.println("ack: " + isAck);
            if (!isAck) {
                System.err.println(cause);
            }
        }
    };

    RabbitTemplate.ReturnCallback returnCallback = new RabbitTemplate.ReturnCallback() {
        @Override
        public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
            System.out.println("code: " + replyCode + ", text: " + replyText);
            System.out.println("exchange: " + exchange + ", routingKey: " + routingKey);
            System.out.println(message);
        }
    };

    public void sendMsg(String msg) {
        CorrelationData cd = new CorrelationData("id" + new Date().getTime());
        rabbitTemplate.setConfirmCallback(confirmCallback);
        rabbitTemplate.setReturnCallback(returnCallback);
        rabbitTemplate.convertAndSend("test-exchange", "routingkey-test", msg, cd);
    }

}

消费者:RabbitmqConsumerService.java

消费者端是监听器,不需要主动调用,程序运行起来以后会自动监听绑定的RabbitMQ队列。

package com.ictpaas.rabbitmqtest.service;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.Map;

@Service
public class RabbitmqConsumerService {

    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(value = "test-queue", durable = "true"),
                    exchange = @Exchange(value = "test-exchange", durable = "true", type = "topic"),
                    key = "routingkey-test"
            )
    )
    @RabbitHandler
    public void testConsumer(@Payload String msg, Channel channel, @Headers Map<String, Object> headers) {
        System.out.println(msg);
        Long tag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
        try {
            // false表示不批量接收,只接收当前消息
            channel.basicAck(tag, false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

启动类:RabbitmqTestApplication.java

package com.ictpaas.rabbitmqtest;

import com.ictpaas.rabbitmqtest.service.RabbitmqProducerService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@SpringBootApplication
@RestController
public class RabbitmqTestApplication {

    @Resource
    private RabbitmqProducerService rabbitmqProducerService;

    public static void main(String[] args) {
        SpringApplication.run(RabbitmqTestApplication.class, args);
    }

    @GetMapping("/rabbitmq/{msg}")
    public String test(@PathVariable(name = "msg") String msg) {
    	// 调用生产者,发布消息
        rabbitmqProducerService.sendMsg(msg);
        return "SUCCESS";
    }

}

猜你喜欢

转载自blog.csdn.net/z_junyu/article/details/88842912
今日推荐