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 提交,保证时效性