rabbitmq服务端消费端实例(direct和fanout模式)

  1. 配置文件
java 复制代码
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
 */
public class RabbitMQConnectionUtilLocal {
    public static Connection getConnection() throws Exception {
        // 创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        // 设置RabbitMQ主机地址
        factory.setHost("localhost");
        // 设置RabbitMQ端口
        factory.setPort(5672);
        // 设置虚拟主机、用户名和密码
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setAutomaticRecoveryEnabled(true); // 自动重连


        // 返回连接
        return factory.newConnection();
    }
}
  1. direct生产端
java 复制代码
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

public class RoutingProducer {
    private final static String EXCHANGE_NAME = "direct_exchange";

    public static void main(String[] argv) throws Exception {
        // 获取到连接
        Connection connection = RabbitMQConnectionUtil.getConnection();
        // 从连接中创建通道
        Channel channel = connection.createChannel();

        // 声明交换器
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");

        // 发送消息
        String message1 = "{\"flag\":0,\"idList\":[\"1\"]}";
        String message2 = "Info log message";
        String message3 = "Warning log message";

        channel.basicPublish(EXCHANGE_NAME, "error", null, message1.getBytes());
        System.out.println(" [x] Sent '" + message1 + "'");

        channel.basicPublish(EXCHANGE_NAME, "info", null, message2.getBytes());
        System.out.println(" [x] Sent '" + message2 + "'");

        channel.basicPublish(EXCHANGE_NAME, "warning", null, message3.getBytes());
        System.out.println(" [x] Sent '" + message3 + "'");

        // 关闭通道和连接
        channel.close();
        connection.close();
    }
}
  1. fanout生产端
java 复制代码
import com.rabbitmq.client.*;
import jzy.util.RabbitMQConnectionUtil;

public class FanoutExchangeExample {
    private static final String EXCHANGE_NAME = "20250917test1";

    public static void main(String[] argv) throws Exception {
        Connection connection = RabbitMQConnectionUtilLocal.getConnection();
        Channel channel = connection.createChannel();

        // 声明Fanout类型的交换器,第三个参数是持久化标记
        channel.exchangeDeclare(EXCHANGE_NAME, "fanout",true);

        // 创建队列并绑定到交换器
        String queueName = channel.queueDeclare().getQueue();
        channel.queueBind(queueName, EXCHANGE_NAME, "");

        // 发送消息
        String message = "This is a log message";
        channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));
        System.out.println(" [x] Sent '" + message + "'");

        channel.close();
        connection.close();
    }
}
  1. 消费端
java 复制代码
package jzy.util;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.rabbitmq.client.*;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

public class RabbitMQConsumer {
//    private final static String EXCHANGE_NAME = "direct_exchange";
//    private final static String QUEUE_NAME = "error_log_queue";

    private final static String EXCHANGE_NAME = "position_exchange";
    private final static String QUEUE_NAME = "LZF0101_queue";

    public static void main(String[] argv) throws Exception {
        // 获取到连接
        Connection connection = RabbitMQConnectionUtil.getConnection();
        // 从连接中创建通道
        Channel channel = connection.createChannel();

        // 声明队列
        channel.queueDeclare(QUEUE_NAME, false, false, false, null);
        // 绑定队列到交换器,并指定路由键
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "LZF0101_topic");

        // 定义队列的消费者
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws java.io.IOException {
                String message = new String(body, "UTF-8");
                JSONObject jsonObject = JsonUtil.getJsonToBean(replaceNbspWithSpace(message), JSONObject.class);
                try {
                    switch (jsonObject.getStr("flag")) {
                     
                        default:
                            break;
                    }
                } catch (Exception e) {
               
                    throw new RuntimeException(e);
                }
                System.out.println(" [x] Received  Log: '" + message + "'");
            }
        };

        // 监听队列
        channel.basicConsume(QUEUE_NAME, true, consumer);
    }

    /**
     * 正则过滤生产端信息特殊符号,过滤 NBSP
     */
    public static String replaceNbspWithSpace(String str) {
        if (str == null) {
            return null;
        }
        return str.replaceAll("\\u00A0", " ");
    }
}
相关推荐
斯班奇的好朋友阿法法4 小时前
rabbitmq的多交换机(扇出为例)监听实现
分布式·rabbitmq·ruby
没有bug.的程序员4 小时前
分布式架构未来趋势:从云原生到智能边缘的演进之路
java·分布式·微服务·云原生·架构·分布式系统
武话不港14 小时前
RabbitMQ异常,handleDelivery方法异常
分布式·消息队列·rabbitmq
^Moon^9 小时前
CycloneDDS:跨主机多进程通信全解析
c++·分布式·dds
长安城没有风13 小时前
从入门到精通【Redis】Redis 典型应⽤ --- 分布式锁
数据库·redis·分布式
爬山算法16 小时前
Redis(69)Redis分布式锁的优点和缺点是什么?
数据库·redis·分布式
virtuousOne1 天前
Kafka基础
分布式·kafka
虫小宝1 天前
Java分布式架构下的电商返利APP技术选型与架构设计实践
java·分布式·架构
007php0071 天前
百度面试题解析:Zookeeper、ArrayList、生产者消费者模型及多线程(二)
java·分布式·zookeeper·云原生·职场和发展·eureka·java-zookeeper