|
| 1 | +# Compaction Topic |
| 2 | + |
| 3 | +## 使用方式 |
| 4 | +### 创建compaction topic |
| 5 | +```shell |
| 6 | +$ bin/mqadmin updateTopic -w 8 -r 8 -a +delete.policy=COMPACTION -n localhost:9876 -t ctopic -c DefaultCluster |
| 7 | +create topic to 127.0.0.1:10911 success. |
| 8 | +TopicConfig [topicName=ctopic, readQueueNums=8, writeQueueNums=8, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false, attributes={+delete.policy=COMPACTION}] |
| 9 | +``` |
| 10 | +### 生产数据 |
| 11 | +与普通消息一样 |
| 12 | +```java |
| 13 | +DefaultMQProducer producer = new DefaultMQProducer("CompactionTestGroup"); |
| 14 | +producer.setNamesrvAddr("localhost:9876"); |
| 15 | +producer.start(); |
| 16 | + |
| 17 | +String topic = "ctopic"; |
| 18 | +String tag = "tag1"; |
| 19 | +String key = "key1"; |
| 20 | +Message msg = new Message(topic, tag, key, "bodys"getBytes(StandardCharsets.UTF_8)); |
| 21 | +SendResult sendResult = producer.send(msg, (mqs, message, shardingKey) -> { |
| 22 | + int select = Math.abs(shardingKey.hashCode()); |
| 23 | + if (select < 0) { |
| 24 | + select = 0; |
| 25 | + } |
| 26 | + return mqs.get(select % mqs.size()); |
| 27 | +}, key); |
| 28 | + |
| 29 | +System.out.printf("%s%n", sendResult); |
| 30 | +``` |
| 31 | +### 消费数据 |
| 32 | +消费offset与compaction之前保持不变,如果指定offset消费,当指定的offset不存在时,返回后面最近的一条数据 |
| 33 | +在compaction场景下,大部分消费都是从0开始消费完整的数据 |
| 34 | +```java |
| 35 | +DefaultLitePullConsumer consumer = new DefaultLitePullConsumer("compactionTestGroup"); |
| 36 | +consumer.setNamesrvAddr("localhost:9876"); |
| 37 | +consumer.setPullThreadNums(4); |
| 38 | +consumer.start(); |
| 39 | + |
| 40 | +Collection<MessageQueue> messageQueueList = consumer.fetchMessageQueues("ctopic"); |
| 41 | +consumer.assign(messageQueueList); |
| 42 | +messageQueueList.forEach(mq -> { |
| 43 | + try { |
| 44 | + consumer.seekToBegin(mq); |
| 45 | + } catch (MQClientException e) { |
| 46 | + e.printStackTrace(); |
| 47 | + } |
| 48 | +}); |
| 49 | + |
| 50 | +Map<String, byte[]> kvStore = Maps.newHashMap(); |
| 51 | +while (true) { |
| 52 | + List<MessageExt> msgList = consumer.poll(1000); |
| 53 | + if (msgList != null) { |
| 54 | + msgList.forEach(msg -> kvStore.put(msg.getKeys(), msg.getBody())); |
| 55 | + } |
| 56 | +} |
| 57 | + |
| 58 | +//use the kvStore |
| 59 | +``` |
0 commit comments