RabbitMQ部分API详解(含demo)

RabbitMQ部分API详解(含demo)

demo配置文件rabbitmq.properties

host=192.168.221.138
port=5672
username=guest
password=guest

读取配置文件内容

public class RabbitConfig {
    public static String host ;
    public static int port ;
    public static String username;
    public static String password ;

    static{
        try {
            ClassLoader classLoader=RabbitConfig.class.getClassLoader();
            InputStream is=classLoader.getResourceAsStream("rabbitmq.properties");
            Properties properties=new Properties();
            properties.load(is);
            host = properties.getProperty("host");
            port = Integer.parseInt(properties.getProperty("port"));
            username =properties.getProperty("username");
            password =properties.getProperty("password");
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

创建连接工厂

public class RabbitUtil {
    public static Connection GetRabbitConnection() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(RabbitConfig.host);
        factory.setPort(RabbitConfig.port);
        factory.setUsername(RabbitConfig.username);
        factory.setPassword(RabbitConfig.password);
        Connection connection = null;
        try {
            connection = factory.newConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }
}

创建provider

public class FanoutProvider {

    public static void main(String[] args) throws Exception {
        // 创建一个连接
        Connection connection = RabbitUtil.GetRabbitConnection();
        // 创建通道
        Channel channel = connection.createChannel();
        //声明exchange
        //exchange:exchange名称
        //type:exchange类型
        //durable:exchange是否持久化(不代表消息持久化)
        //autoDelete:已经没有消费者了,服务器是否可以删除该Exchange
        //exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,Map<String, Object> arguments)
        channel.exchangeDeclare("zx_fanout", BuiltinExchangeType.FANOUT, true,false,null);

        //声明queue
        //queue:queue名称
        //durable:queue是否持久化
        //exclusive:是否为当前连接的专用队列,在连接断开后,会自动删除该队列
        //autodelete:当没有任何消费者使用时,自动删除该队列
        //queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments)
        channel.queueDeclare("zx_queue_f1", true, false, false, null);
        channel.queueDeclare("zx_queue_f2", true, false, false, null);
        channel.queueDeclare("zx_queue_f3", true, false, false, null);

        //queue:queue名称
        //exchange:exchange名称
        //routingKey:路由键;用来绑定queue和exchange
        //queueBind(String queue, String exchange, String routingKey)
        channel.queueBind("zx_queue_f1","zx_fanout","");
        channel.queueBind("zx_queue_f2","zx_fanout","");
        channel.queueBind("zx_queue_f3","zx_fanout","");

        //开启confirm机制
        // (即rabbitmq-server收到生产端的消息,会给生产端发送一个确认,如果没法送确认,生产端重新发送消息到server中)
        channel.confirmSelect();

        for (int i = 1 ; i <= 100 ;i++){
            String message = "fanout:广播的第 "+ i +" 条消息";

            //exchange
            //routingKey:路由键
            //mandatory:true=如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,那么会调用basic.return方法将消息返还给生产者。false=出现上述情形broker会直接将消息扔掉
            //immediate:true=如果exchange在将消息route到queue(s)时发现对应的queue上没有消费者,那么这条消息不会放入队列中。false=当与消息routeKey关联的所有queue(一个或多个)都没有消费者时,该消息会通过basic.return方法返还给生产者。
            //BasicProperties:消息的基本属性,例如路由头等(MessageProperties.PERSISTENT_TEXT_PLAIN:消息的持久化)
            //basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)
            channel.basicPublish("zx_fanout","",false,false,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("utf-8"));
            System.out.println(message);
        }

        // 关闭连接
        channel.close();
        connection.close();
    }
}

创建consumer

public class Consumer1 {
    public static void main(String[] args) throws Exception {
        // 创建一个连接
        Connection conn = RabbitUtil.GetRabbitConnection();
        // 创建通道
        Channel channel = conn.createChannel();
        //声明exchange
        //exchange:exchange名称
        //type:exchange类型
        //durable:exchange是否持久化(不代表消息持久化)
        //autoDelete:已经没有消费者了,服务器是否可以删除该Exchange
        //exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,Map<String, Object> arguments)
        channel.exchangeDeclare("zx_fanout", BuiltinExchangeType.FANOUT,true,false,null);

        //声明queue
        //queue:queue名称
        //durable:queue是否持久化
        //exclusive:是否为当前连接的专用队列,在连接断开后,会自动删除该队列
        //autodelete:当没有任何消费者使用时,自动删除该队列
        //queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,Map<String, Object> arguments)
        channel.queueDeclare("zx_queue_f1", true, false, false, null);

        //queue:queue名称
        //exchange:exchange名称
        //routingKey:路由键;用来绑定queue和exchange
        //queueBind(String queue, String exchange, String routingKey)
        channel.queueBind("zx_queue_f1","zx_fanout","");
        
        //uack的消息最多有几条
        channel.basicQos(200);

        //消息消费
        //queue:绑定队列名称
        //autoAck:是否自动ack,如果不自动ack,需要使用channel.ack、channel.nack、channel.basicReject 进行消息应答
        //basicConsume(String queue, boolean autoAck, Consumer callback)
        channel.basicConsume("zx_queue_f1",false,new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                try {
                    String message = new String(body,"utf-8");
                    System.out.println(Consumer1.class.getSimpleName()+"--接收消息--"+message);
                } catch (UnsupportedEncodingException e) {

                    //deliveryTag:该消息的唯一ID
                    //multiple:是否批量. true:将一次性拒绝所有小于deliveryTag的消息。
                    //requeue:被拒绝的是否重新入队列
                    //channel.basicNack(long deliveryTag, boolean multiple, boolean requeue);
                    channel.basicNack(envelope.getDeliveryTag(),false,true);

                    //deliveryTag:该消息的index
                    //requeue:被拒绝的是否重新入队列
                    //channel.basicReject(delivery.getEnvelope().getDeliveryTag(), false);
                    //channel.basicNack 与 channel.basicReject 的区别在于basicNack可以拒绝多条消息,而basicReject一次只能拒绝一条消息
                } finally {

                    //basicAck(long deliveryTag, boolean multiple)
                    //deliveryTag:该消息的唯一ID
                    //multiple:是否批量.true:将一次性ack所有小于deliveryTag的消息。
                    channel.basicAck(envelope.getDeliveryTag(), false);
                }
            }
        });
    }
}

demo的github地址

https://github.com/AndeZhaoX/rabbitmq-test.git

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 夏季,一个神奇的季节。它可以让百花盛开,让树木成荫,让天气瞬间东边日出西边雨。当然,还有,让大街上人们的衣...
    岚月看海阅读 214评论 0 1
  • 嗨,我们又见面了,我是你们的老朋友——丹丹妈咪,一枚专注分享育儿知识的宝妈。今天想和大家聊聊啥呢?请继续往下看噢。...
    爱笑宝妈欧丹丹阅读 492评论 0 0
  • 明知道你不会找我 还是忍不住看手机
    欢欢_5726阅读 157评论 0 1
  • 繁花似锦, 不及一叶的你。 似水流年, 载不走, 你年华的老去。 每一丝纹路, 每一寸叶的 肌肤, 耐得住 时光蹉...
    俗知者阅读 283评论 0 4