九.springboot+rabbitmq(文章写的比较好) 以及 java版详细例子

RabbitMq写的比较好的:https://www.cnblogs.com/vipstone/p/9275256.html

Springboot+rabbotMq的:https://blog.csdn.net/ztx114/article/details/78410727

package com.tiglle.producer.main;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Created by Administrator on 2018/7/15 0015.
 */
public class ProducerMain {

    public static void main(String[] args) throws Exception {
        fanoutExchange();

    }

    //默认交换机
    public static void defauleExchange()throws Exception {
        //通过连接工程获取连接(长连接,如果不关闭,会一直连接)
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("tiglle");
        factory.setPassword("hateyou75");
        //指定虚拟机,不指定默认为"/"这个虚拟机(TiglleHost 不等于 /TiglleHost)
        factory.setVirtualHost("TiglleHost");
        //从连接中获取信道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        /**
         *声明一个列队queue
         * 1.queue:列队名称
         * 2.durable:是否持久化
         * 3.exclusive:是否排他性:
         * 只有  首次声明它的连接 (假如为A Connection)可见,A Connection的不同通道是可见的。其他连接不可访问和声明此相同的列队
         * 如果试图在一个不同的连接中重新声明或访问(如publish,consume)该排他性队列,会得到资源被锁定的错误:ESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'DefauleQueue1'
         * 会在其连接断开的时候自动删除(A Connection连接close或者客户端程序退出了),不管这个队列是否被声明成持久性的(Durable =true)。
         * exclusive列队只能消费者声明,消费者断开就删除。(因为消费者的Connection直接和Queue通信,提供者的Connection是和Exchange通信的。)
         * 4..autoDelete:当所有消费者断开连接后,自动删除,对于持久化的列队
         * autoDelete的列队刚开始创建,没有消费者连接的时候,一直存在。一旦有消费者连接,并且所有消费者断开后,会自动删除
         * 5.
         */
        channel.queueDeclare("DefauleQueue2",true,false,true,null);
        /**
         * 1.exchange:为""的时候使用默认的交换机
         * 默认交换机为direct 类型:通过消息的routingKey,与列队和交换机的bindingKey(有些也叫做列队和交换机的routingKey)对比,相同则发送到该列队
         * 2.routingKey:消息的属性,在默认交换机中,消息的routingKey和queue的name进行比较(bindingKey为消息的名称)
         * 3.
         * 4.body:消息主体
         */
        byte[] body = "first message1".getBytes();
        /**
         * 发送消息
         * 1.exchange 列队的名称,默认direct的列队名称为""
         * 2.routingKey 路右键的名称,需要和目queue队绑定exchange的bindingKey相同
         * 3.
         * 4.消息体
         */
        channel.basicPublish("","DefauleQueue2",null,body);

        channel.close();
        connection.close();
    }


    //direct类型的交换机
    public static void directExchange() throws Exception {
        //通过连接工程获取连接(长连接,如果不关闭,会一直连接)
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("tiglle");
        factory.setPassword("hateyou75");
        //指定虚拟机,不指定默认为"/"这个虚拟机(TiglleHost 不等于 /TiglleHost)
        factory.setVirtualHost("TiglleHost");
        //从连接中获取信道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        /**
         * 声明direct类型的exchange (根据消息的routingKey和列队与交换机绑定的时候的bindingKey对比,来路由消息)
         * 1.exchange 交换机的名称
         * 2.BuiltinExchangeType 交换机的类型(枚举) direct、fanout、topic、header
         */
        channel.exchangeDeclare("direct-exchange1", BuiltinExchangeType.DIRECT);
        /**
         *声明一个列队queue
         * 1.queue:列队名称
         * 2.durable:是否持久化
         * 3.exclusive:是否排他性:
         * 只有  首次声明它的连接 (假如为A Connection)可见,A Connection的不同通道是可见的。其他连接不可访问和声明此相同的列队
         * 如果试图在一个不同的连接中重新声明或访问(如publish,consume)该排他性队列,会得到资源被锁定的错误:ESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'DefauleQueue1'
         * 会在其连接断开的时候自动删除(A Connection连接close或者客户端程序退出了),不管这个队列是否被声明成持久性的(Durable =true)。
         * exclusive列队只能消费者声明,消费者断开就删除。(因为消费者的Connection直接和Queue通信,提供者的Connection是和Exchange通信的。)
         * 4..autoDelete:当所有消费者断开连接后,自动删除,对于持久化的列队
         * autoDelete的列队刚开始创建,没有消费者连接的时候,一直存在。一旦有消费者连接,并且所有消费者断开后,会自动删除
         * 5.
         */
        channel.queueDeclare("direct-queue1",true,false,false,null);
        /**
         * 列队和交换机的绑定
         * 1. queue 列队的名称
         * 2. exchange 交换机的名称
         * 3.routingKey 绑定标识,可以叫bandingKey
         */
        channel.queueBind("direct-queue1","direct-exchange1","direct-routingkey1");

        byte[] body = "第一条消息".getBytes();
        /**
         * 发送消息
         * 1.exchange 列队的名称
         * 2.routingKey 路右键的名称,需要和目queue队绑定exchange的bindingKey相同
         * 3.
         * 4.消息体
         */
        channel.basicPublish("direct-exchange1","direct-routingkey1",null,body);

        channel.close();
        connection.close();
    }

    //topic类型的交换机
    public static void topicExchange() throws Exception {
        //通过连接工程获取连接(长连接,如果不关闭,会一直连接)
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("tiglle");
        factory.setPassword("hateyou75");
        //指定虚拟机,不指定默认为"/"这个虚拟机(TiglleHost 不等于 /TiglleHost)
        factory.setVirtualHost("TiglleHost");
        //从连接中获取信道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        /**
         * 声明topic类型的exchange (相当于有通配符 * 一个单词  #0个或多个单词,用 . 隔开的direct交换机) 注意是单词不是字母
         * 1.exchange 交换机的名称
         * 2.BuiltinExchangeType 交换机的类型(枚举) direct、fanout、topic、header
         */
        channel.exchangeDeclare("topic-exchange1", BuiltinExchangeType.TOPIC);

        /**
         *声明一个列队queue
         * 1.queue:列队名称
         * 2.durable:是否持久化
         * 3.exclusive:是否排他性:
         * 只有  首次声明它的连接 (假如为A Connection)可见,A Connection的不同通道是可见的。其他连接不可访问和声明此相同的列队
         * 如果试图在一个不同的连接中重新声明或访问(如publish,consume)该排他性队列,会得到资源被锁定的错误:ESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'DefauleQueue1'
         * 会在其连接断开的时候自动删除(A Connection连接close或者客户端程序退出了),不管这个队列是否被声明成持久性的(Durable =true)。
         * exclusive列队只能消费者声明,消费者断开就删除。(因为消费者的Connection直接和Queue通信,提供者的Connection是和Exchange通信的。)
         * 4..autoDelete:当所有消费者断开连接后,自动删除,对于持久化的列队
         * autoDelete的列队刚开始创建,没有消费者连接的时候,一直存在。一旦有消费者连接,并且所有消费者断开后,会自动删除
         * 5.
         */
        channel.queueDeclare("topic.queue1",true,false,false,null);
        /**
         * 列队和交换机的绑定
         * 1. queue 列队的名称
         * 2. exchange 交换机的名称
         * 3.routingKey 绑定标识,可以叫bandingKey,可以使用通配符 * 一个单词  #  0个或多个单词,用 . 隔开
         */
        channel.queueBind("topic.queue1","topic-exchange1","topic.routingkey.*");

        byte[] body = "第一条消息".getBytes();
        /**
         * 发送消息
         * 1.exchange 列队的名称
         * 2.routingKey 路右键的名称,需要和目queue队绑定exchange的bindingKey相同
         * 3.
         * 4.消息体
         */
        channel.basicPublish("topic-exchange1","topic.routingkey.test",null,body);//(此处可以通配topic.routingkey.*  ,*为一个单词)
        channel.basicPublish("topic-exchange1","topic.routingkey.test.nihao",null,body);//(此处不能通配topic.routingkey.*  ,因为有多个单词)

        channel.close();
        connection.close();
    }

    //fanout类型的交换机
    public static void fanoutExchange() throws Exception {
        //通过连接工程获取连接(长连接,如果不关闭,会一直连接)
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("tiglle");
        factory.setPassword("hateyou75");
        //指定虚拟机,不指定默认为"/"这个虚拟机(TiglleHost 不等于 /TiglleHost)
        factory.setVirtualHost("TiglleHost");
        //从连接中获取信道
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();

        /**
         * 声明fanout类型的exchange 发送给所有绑定的列队,忽略bindingKey
         * 1.exchange 交换机的名称
         * 2.BuiltinExchangeType 交换机的类型(枚举) direct、fanout、topic、header
         */
        channel.exchangeDeclare("fanout-exchange1", BuiltinExchangeType.FANOUT);

        /**
         *声明一个列队queue
         * 1.queue:列队名称
         * 2.durable:是否持久化
         * 3.exclusive:是否排他性:
         * 只有  首次声明它的连接 (假如为A Connection)可见,A Connection的不同通道是可见的。其他连接不可访问和声明此相同的列队
         * 如果试图在一个不同的连接中重新声明或访问(如publish,consume)该排他性队列,会得到资源被锁定的错误:ESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'DefauleQueue1'
         * 会在其连接断开的时候自动删除(A Connection连接close或者客户端程序退出了),不管这个队列是否被声明成持久性的(Durable =true)。
         * exclusive列队只能消费者声明,消费者断开就删除。(因为消费者的Connection直接和Queue通信,提供者的Connection是和Exchange通信的。)
         * 4..autoDelete:当所有消费者断开连接后,自动删除,对于持久化的列队
         * autoDelete的列队刚开始创建,没有消费者连接的时候,一直存在。一旦有消费者连接,并且所有消费者断开后,会自动删除
         * 5.
         */
        channel.queueDeclare("fanout-queue1",true,false,false,null);
        channel.queueDeclare("fanout-queue2",true,false,false,null);

        /**
         * 列队和交换机的绑定
         * 1. queue 列队的名称
         * 2. exchange 交换机的名称
         * 3.routingKey 绑定标识,可以叫bandingKey,可以使用通配符 * 一个单词  #  0个或多个单词,用 . 隔开
         */
        channel.queueBind("fanout-queue1","fanout-exchange1","DoNotUse1");
        channel.queueBind("fanout-queue2","fanout-exchange1","DoNotUse2");


        byte[] body = "第一条消息".getBytes();
        /**
         * 发送消息
         * 1.exchange 列队的名称
         * 2.routingKey 路右键的名称,需要和目queue队绑定exchange的bindingKey相同
         * 3.
         * 4.消息体
         */
        channel.basicPublish("fanout-exchange1","DoNotUse1",null,body);

        channel.close();
        connection.close();
    }








}
以下是一个基于Spring BootRabbitMQ集群的完整示例: 1. 首先,需要在pom.xml文件中添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 然后,在application.yml文件中添加以下RabbitMQ配置: ``` spring: rabbitmq: addresses: server1:5672,server2:5672 # RabbitMQ集群地址 username: guest # RabbitMQ用户名 password: guest # RabbitMQ密码 virtual-host: / # RabbitMQ虚拟主机 ``` 3. 创建一个RabbitMQ配置类,如下所示: ``` @Configuration public class RabbitMQConfig { @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setAddresses("server1:5672,server2:5672"); connectionFactory.setUsername("guest"); connectionFactory.setPassword("guest"); connectionFactory.setVirtualHost("/"); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory()); rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); return rabbitTemplate; } } ``` 4. 创建一个消息发送端,如下所示: ``` @Component public class MessageSender { @Autowired private RabbitTemplate rabbitTemplate; public void send(String message) { rabbitTemplate.convertAndSend("exchange", "routingKey", message); } } ``` 5. 创建一个消息接收端,如下所示: ``` @Component public class MessageReceiver { @RabbitListener(queues = "queue") public void receive(String message) { System.out.println("Received message: " + message); } } ``` 6. 最后,启动多个应用程序实例,并尝试发送和接收消息,以测试RabbitMQ集群是否正常工作。 注意:本示例中的exchange、routingKey和queue名称可以根据实际情况进行更改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值