rabbitmq整理

hello world 入门

1.引入依赖

<dependency>
		<groupId>com.rabbitmq</groupId>
		<artifactId>amqp-client</artifactId>
		<version>5.7.3</version>
</dependency>

2.生产者 produce

    public void produce(){
        //创建连接工程
        ConnectionFactory connectionFactory=new ConnectionFactory();
        connectionFactory.setHost("localhost");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("cui");
        connectionFactory.setPassword("123456");
      try {
            //创建连接
            Connection connection = connectionFactory.newConnection();

            //创建通道  所有的rabbitmq的操作都在这里执行
            Channel channel = connection.createChannel();
            //创建exchange
            //第一个参数 exchange  交换器
            //第二个参数 type      类型  direct
            //第三个参数 exclusive   是否排外
            //第四个参数 autoDelete  是否自动删除
            //第五个参数 arguments   队列中的消息什么时候会自动被删除
            channel.exchangeDeclare("cui","direct",false,false,null);

        try {
            channel.confirmSelect();
            //开启事物
            //channel.txSelect();
           //channel.queueDeclare("ccc", false, false, false, null);
            //消息持久化 1: 非持久化 2:持久化
            AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties.Builder();
            properties.deliveryMode(2);
            int i=0;
            for (int a = 0; a < 6000; a++) {
                //发送消息
                channel.basicPublish("cui", "ccc", null, ("hello  consumer" + a).getBytes());
               if (channel.waitForConfirms()) {
                   System.out.println("消息发布成功");
               }
                i++;
            }
            //事物提交
            //channel.txCommit();
            //发送持久化消息
            // channel.basicPublish("","cuis",properties.build(),"hello  consumer".getBytes());
            //System.out.println(System.currentTimeMillis());
            System.out.println("send message: " + "hello  consumer");
            channel.close();
        }catch (Exception e){
            //  事物回滚
          //  channel.txRollback();
        }
          connection.close();
      }catch (Exception e1){
          e1.printStackTrace();
      }
    }

关于创建队列 channel.queueDeclare()中的五个参数

1.queue: 队列名称
2.durable:是否持久化.队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库
3.exclusive:是否排外.
两个作用:
一:当连接关闭时connection.close()该队列是否会自动删除;
二:该队列是否是私有的private,如果不是排外的,可以使用两个消费者都访问同一个队列,没有任何问题,如果是排外的,会对当前队列加锁,其他通道channel是不能访问的,如果强制访问会报异常:
4. autoDelete:是否自动删除,当最后一个消费者断开连接之后队列是否自动被删除,可以通过RabbitMQ Management,查看某个队列的消费者数量,当consumers = 0时队列就会自动删除。
5. arguments :队列中的消息什么时候会自动被删除?
6. Message TTL(x-message-ttl):设置队列中的所有消息的生存周期(统一为整个队列的所有消息设置生命周期), 也可以在发布消息的时候单独为某个消息指定剩余生存时间,单位毫秒, 类似于redis中的ttl,生存时间到了,消息会被从队里中删除,注意是消息被删除,而不是队列被删除, 特性Features=TTL, 单独为某条消息设置过期时间

AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties().builder().expiration(“6000”);
channel.basicPublish(EXCHANGE_NAME, "", properties.build(), message.getBytes("UTF-8"));

Auto Expire(x-expires): 当队列在指定的时间没有被访问(consume, basicGet, queueDeclare…)就会被删除,Features=Exp
Max Length(x-max-length): 限定队列的消息的最大值长度,超过指定长度将会把最早的几条删除掉, 类似于mongodb中的固定集合,例如保存最新的100条消息, Feature=Lim

Max Length Bytes(x-max-length-bytes): 限定队列最大占用的空间大小, 一般受限于内存、磁盘的大小, Features=Lim B

Dead letter exchange(x-dead-letter-exchange): 当队列消息长度大于最大长度、或者过期的等,将从队列中删除的消息推送到指定的交换机中去而不是丢弃掉,Features=DLX

Dead letter routing key(x-dead-letter-routing-key):将删除的消息推送到指定交换机的指定路由键的队列中去, Feature=DLK

Maximum priority(x-max-priority):优先级队列,声明队列时先定义最大优先级值(定义最大值一般不要太大),在发布消息的时候指定该消息的优先级, 优先级更高(数值更大的)的消息先被消费,

Lazy mode(x-queue-mode=lazy): Lazy Queues: 先将消息保存到磁盘上,不放在内存中,当消费者开始消费的时候才加载到内存中

2.消费者consumer

 //创建连接工程
        ConnectionFactory connectionFactory=new ConnectionFactory();
        connectionFactory.setHost("localhost");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("cui");
        connectionFactory.setPassword("123456");

        Connection connection = connectionFactory.newConnection();
        //创建通道channel 
        Channel channel = connection.createChannel();
         //声明队列
        channel.queueDeclare("cuis",false,false,false,null);
        while (true) {
        //创建消费者
            Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag,
                                           Envelope envelope,
                                           AMQP.BasicProperties properties,
                                           byte[] body) throws IOException {
                    String msg = new String(body, "utf-8");
                    System.out.println(msg);
                }
            };
            
            channel.basicConsume("cuis",false,consumer);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值