rabbitMq 批量消费(pull 拉取模式 )

rabbitMq 批量消费(pull 拉取模式 )

maven 依赖



        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.6</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.13</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.0.0</version>
        </dependency>
            
            <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

批量消费


import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.GetResponse;
import lombok.extern.slf4j.Slf4j;

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

/**
 * @Author: craywen
 * @Date: 2020/7/20 15:30
 */
@Slf4j
public class GetMsgConsumer {
    
    

    public static void main(String[] args)
        throws IOException, TimeoutException, InterruptedException {
    
    
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("192.168.11.56");
        factory.setUsername("admin");
        factory.setPassword("admin");
        factory.setVirtualHost("/");

        Connection connection = factory.newConnection();
        final Channel channel = connection.createChannel();
       // channel.exchangeDeclare(GetMsgProducer.EXCHANGE_NAME, BuiltinExchangeType.DIRECT);

        String queueName = "push:news";
        //第二个参数是否持久化
        channel.queueDeclare(queueName, true, false, false, null);
        //channel.queueBind(queueName, GetMsgProducer.EXCHANGE_NAME, "error");*/
        List<String> stringList=new LinkedList<>();
        long start=System.currentTimeMillis();
        long end =0L;
        while(true) {
    
    
            GetResponse getResponse = channel.basicGet(queueName, true);
            start=System.currentTimeMillis();
            if (null != getResponse) {
    
    
                 end =System.currentTimeMillis();
                String s = new String(getResponse.getBody(), "utf-8");
                //log.info("get message, routingKey: {}, message: {}", getResponse.getEnvelope().getRoutingKey(),s );
                stringList.add(s);
            }
            if(stringList.size()%10==0){
    
    
                warehousing(stringList);
                stringList.clear();
            }
            //如果时间大于10s 并且list 的数据小于10 提交 保证时效性
            //System.out.println("--start---"+start+"--end---"+end+"-------------------"+(end-start)+"----size---"+stringList.size());
            if(((start-end)>10000) && (stringList.size()>0||stringList.size()<10)){
    
    
                warehousing(stringList);
                stringList.clear();
            }
        }
    }

    /**
     * 模拟批量入库
     * @param stringList
     */
    public static void warehousing(List<String> stringList){
    
    
        for (String s : stringList) {
    
    
            System.out.println("{} -消费数据----"+s);
        }
    }
}

#效果 主要是为了优化 连zoomkeeper solr 集群时间,单条插入耗时长改用batch 模式

  • list 容量小于10 的时候并且队列无数据时间吵过10s 提交,保证时效性
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38893133/article/details/107465480