Search in sources :

Example 1 with DefaultMQPullConsumer

use of org.apache.rocketmq.client.consumer.DefaultMQPullConsumer in project rocketmq-externals by apache.

the class MessageServiceImpl method queryMessageByTopic.

@Override
public List<MessageView> queryMessageByTopic(String topic, final long begin, final long end) {
    DefaultMQPullConsumer consumer = new DefaultMQPullConsumer(MixAll.TOOLS_CONSUMER_GROUP, null);
    List<MessageView> messageViewList = Lists.newArrayList();
    try {
        String subExpression = "*";
        consumer.start();
        Set<MessageQueue> mqs = consumer.fetchSubscribeMessageQueues(topic);
        for (MessageQueue mq : mqs) {
            long minOffset = consumer.searchOffset(mq, begin);
            long maxOffset = consumer.searchOffset(mq, end);
            READQ: for (long offset = minOffset; offset <= maxOffset; ) {
                try {
                    if (messageViewList.size() > 2000) {
                        break;
                    }
                    PullResult pullResult = consumer.pull(mq, subExpression, offset, 32);
                    offset = pullResult.getNextBeginOffset();
                    switch(pullResult.getPullStatus()) {
                        case FOUND:
                            List<MessageView> messageViewListByQuery = Lists.transform(pullResult.getMsgFoundList(), new Function<MessageExt, MessageView>() {

                                @Override
                                public MessageView apply(MessageExt messageExt) {
                                    messageExt.setBody(null);
                                    return MessageView.fromMessageExt(messageExt);
                                }
                            });
                            List<MessageView> filteredList = Lists.newArrayList(Iterables.filter(messageViewListByQuery, new Predicate<MessageView>() {

                                @Override
                                public boolean apply(MessageView messageView) {
                                    if (messageView.getStoreTimestamp() < begin || messageView.getStoreTimestamp() > end) {
                                        logger.info("begin={} end={} time not in range {} {}", begin, end, messageView.getStoreTimestamp(), new Date(messageView.getStoreTimestamp()).toString());
                                    }
                                    return messageView.getStoreTimestamp() >= begin && messageView.getStoreTimestamp() <= end;
                                }
                            }));
                            messageViewList.addAll(filteredList);
                            break;
                        case NO_MATCHED_MSG:
                        case NO_NEW_MSG:
                        case OFFSET_ILLEGAL:
                            break READQ;
                    }
                } catch (Exception e) {
                    break;
                }
            }
        }
        Collections.sort(messageViewList, new Comparator<MessageView>() {

            @Override
            public int compare(MessageView o1, MessageView o2) {
                if (o1.getStoreTimestamp() - o2.getStoreTimestamp() == 0) {
                    return 0;
                }
                return (o1.getStoreTimestamp() > o2.getStoreTimestamp()) ? -1 : 1;
            }
        });
        return messageViewList;
    } catch (Exception e) {
        throw Throwables.propagate(e);
    } finally {
        consumer.shutdown();
    }
}
Also used : DefaultMQPullConsumer(org.apache.rocketmq.client.consumer.DefaultMQPullConsumer) PullResult(org.apache.rocketmq.client.consumer.PullResult) Date(java.util.Date) Function(com.google.common.base.Function) MessageExt(org.apache.rocketmq.common.message.MessageExt) MessageView(org.apache.rocketmq.console.model.MessageView) MessageQueue(org.apache.rocketmq.common.message.MessageQueue) List(java.util.List)

Example 2 with DefaultMQPullConsumer

use of org.apache.rocketmq.client.consumer.DefaultMQPullConsumer in project rocketmq-externals by apache.

the class RocketMQSinkTest method testBatchEvent.

@Test
public void testBatchEvent() throws MQClientException, InterruptedException, EventDeliveryException, RemotingException, MQBrokerException, UnsupportedEncodingException {
    /*
        start sink
         */
    Context context = new Context();
    context.put(NAME_SERVER_CONFIG, nameServer);
    context.put(TAG_CONFIG, tag);
    context.put(BATCH_SIZE_CONFIG, String.valueOf(batchSize));
    RocketMQSink sink = new RocketMQSink();
    Configurables.configure(sink, context);
    MemoryChannel channel = new MemoryChannel();
    Configurables.configure(channel, context);
    sink.setChannel(channel);
    sink.start();
    /*
        mock flume source
         */
    Map<String, String> msgs = new HashMap<>();
    Transaction tx = channel.getTransaction();
    tx.begin();
    int sendNum = 0;
    for (int i = 0; i < batchSize; i++) {
        String sendMsg = "\"Hello RocketMQ\"" + "," + DateFormatUtils.format(new Date(), "yyyy-MM-DD hh:mm:ss:SSSS");
        Event event = EventBuilder.withBody(sendMsg.getBytes(), null);
        channel.put(event);
        log.info("publish message : {}", sendMsg);
        String[] sendMsgKv = sendMsg.split(",");
        msgs.put(sendMsgKv[1], sendMsgKv[0]);
        sendNum++;
        Thread.sleep(10);
    }
    log.info("send message num={}", sendNum);
    tx.commit();
    tx.close();
    Sink.Status status = sink.process();
    if (status == Sink.Status.BACKOFF) {
        fail("Error");
    }
    sink.stop();
    /*
        consumer message
         */
    consumer = new DefaultMQPullConsumer(consumerGroup);
    consumer.setNamesrvAddr(nameServer);
    consumer.setMessageModel(MessageModel.valueOf("BROADCASTING"));
    consumer.registerMessageQueueListener(TOPIC_DEFAULT, null);
    consumer.start();
    int receiveNum = 0;
    String receiveMsg = null;
    Set<MessageQueue> queues = consumer.fetchSubscribeMessageQueues(TOPIC_DEFAULT);
    for (MessageQueue queue : queues) {
        long offset = getMessageQueueOffset(queue);
        PullResult pullResult = consumer.pull(queue, tag, offset, batchSize);
        if (pullResult.getPullStatus() == PullStatus.FOUND) {
            for (MessageExt message : pullResult.getMsgFoundList()) {
                byte[] body = message.getBody();
                receiveMsg = new String(body, "UTF-8");
                String[] receiveMsgKv = receiveMsg.split(",");
                msgs.remove(receiveMsgKv[1]);
                log.info("receive message : {}", receiveMsg);
                receiveNum++;
            }
            long nextBeginOffset = pullResult.getNextBeginOffset();
            putMessageQueueOffset(queue, nextBeginOffset);
        }
    }
    log.info("receive message num={}", receiveNum);
    /*
        wait for processQueueTable init
         */
    Thread.sleep(1000);
    consumer.shutdown();
    assertEquals(msgs.size(), 0);
}
Also used : Context(org.apache.flume.Context) MemoryChannel(org.apache.flume.channel.MemoryChannel) HashMap(java.util.HashMap) Date(java.util.Date) DefaultMQPullConsumer(org.apache.rocketmq.client.consumer.DefaultMQPullConsumer) PullResult(org.apache.rocketmq.client.consumer.PullResult) MessageExt(org.apache.rocketmq.common.message.MessageExt) Transaction(org.apache.flume.Transaction) Sink(org.apache.flume.Sink) MessageQueue(org.apache.rocketmq.common.message.MessageQueue) Event(org.apache.flume.Event) Test(org.junit.Test)

Example 3 with DefaultMQPullConsumer

use of org.apache.rocketmq.client.consumer.DefaultMQPullConsumer in project rocketmq-externals by apache.

the class RocketMQSource method doStart.

@Override
protected void doStart() throws FlumeException {
    consumer = new DefaultMQPullConsumer(consumerGroup);
    consumer.setNamesrvAddr(nameServer);
    consumer.setMessageModel(MessageModel.valueOf(messageModel));
    consumer.registerMessageQueueListener(topic, null);
    try {
        consumer.start();
    } catch (MQClientException e) {
        log.error("RocketMQ consumer start failed", e);
        throw new FlumeException("Failed to start RocketMQ consumer", e);
    }
    sourceCounter.start();
}
Also used : FlumeException(org.apache.flume.FlumeException) DefaultMQPullConsumer(org.apache.rocketmq.client.consumer.DefaultMQPullConsumer) MQClientException(org.apache.rocketmq.client.exception.MQClientException)

Example 4 with DefaultMQPullConsumer

use of org.apache.rocketmq.client.consumer.DefaultMQPullConsumer in project rocketmq-externals by apache.

the class RocketMQSinkTest method testEvent.

@Test
public void testEvent() throws MQClientException, InterruptedException, EventDeliveryException, RemotingException, MQBrokerException, UnsupportedEncodingException {
    /*
        start sink
         */
    Context context = new Context();
    context.put(NAME_SERVER_CONFIG, nameServer);
    context.put(TAG_CONFIG, tag);
    RocketMQSink sink = new RocketMQSink();
    Configurables.configure(sink, context);
    MemoryChannel channel = new MemoryChannel();
    Configurables.configure(channel, context);
    sink.setChannel(channel);
    sink.start();
    /*
        mock flume source
         */
    String sendMsg = "\"Hello RocketMQ\"" + "," + DateFormatUtils.format(new Date(), "yyyy-MM-DD hh:mm:ss");
    Transaction tx = channel.getTransaction();
    tx.begin();
    Event event = EventBuilder.withBody(sendMsg.getBytes(), null);
    channel.put(event);
    tx.commit();
    tx.close();
    log.info("publish message : {}", sendMsg);
    Sink.Status status = sink.process();
    if (status == Sink.Status.BACKOFF) {
        fail("Error");
    }
    sink.stop();
    /*
        consumer message
         */
    consumer = new DefaultMQPullConsumer(consumerGroup);
    consumer.setNamesrvAddr(nameServer);
    consumer.setMessageModel(MessageModel.valueOf("BROADCASTING"));
    consumer.registerMessageQueueListener(TOPIC_DEFAULT, null);
    consumer.start();
    String receiveMsg = null;
    Set<MessageQueue> queues = consumer.fetchSubscribeMessageQueues(TOPIC_DEFAULT);
    for (MessageQueue queue : queues) {
        long offset = getMessageQueueOffset(queue);
        PullResult pullResult = consumer.pull(queue, tag, offset, 32);
        if (pullResult.getPullStatus() == PullStatus.FOUND) {
            for (MessageExt message : pullResult.getMsgFoundList()) {
                byte[] body = message.getBody();
                receiveMsg = new String(body, "UTF-8");
                log.info("receive message : {}", receiveMsg);
            }
            long nextBeginOffset = pullResult.getNextBeginOffset();
            putMessageQueueOffset(queue, nextBeginOffset);
        }
    }
    /*
        wait for processQueueTable init
         */
    Thread.sleep(1000);
    consumer.shutdown();
    assertEquals(sendMsg, receiveMsg);
}
Also used : Context(org.apache.flume.Context) MemoryChannel(org.apache.flume.channel.MemoryChannel) Date(java.util.Date) DefaultMQPullConsumer(org.apache.rocketmq.client.consumer.DefaultMQPullConsumer) PullResult(org.apache.rocketmq.client.consumer.PullResult) MessageExt(org.apache.rocketmq.common.message.MessageExt) Transaction(org.apache.flume.Transaction) Sink(org.apache.flume.Sink) MessageQueue(org.apache.rocketmq.common.message.MessageQueue) Event(org.apache.flume.Event) Test(org.junit.Test)

Example 5 with DefaultMQPullConsumer

use of org.apache.rocketmq.client.consumer.DefaultMQPullConsumer in project rocketmq-externals by apache.

the class BinlogPositionManager method initPositionFromMqTail.

private void initPositionFromMqTail() throws Exception {
    DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("BINLOG_CONSUMER_GROUP");
    consumer.setNamesrvAddr(config.mqNamesrvAddr);
    consumer.setMessageModel(MessageModel.valueOf("BROADCASTING"));
    consumer.start();
    Set<MessageQueue> queues = consumer.fetchSubscribeMessageQueues(config.mqTopic);
    MessageQueue queue = queues.iterator().next();
    if (queue != null) {
        Long offset = consumer.maxOffset(queue);
        if (offset > 0)
            offset--;
        PullResult pullResult = consumer.pull(queue, "*", offset, 100);
        if (pullResult.getPullStatus() == PullStatus.FOUND) {
            MessageExt msg = pullResult.getMsgFoundList().get(0);
            String json = new String(msg.getBody(), "UTF-8");
            JSONObject js = JSON.parseObject(json);
            binlogFilename = (String) js.get("binlogFilename");
            nextPosition = js.getLong("nextPosition");
        }
    }
}
Also used : MessageExt(org.apache.rocketmq.common.message.MessageExt) MessageQueue(org.apache.rocketmq.common.message.MessageQueue) JSONObject(com.alibaba.fastjson.JSONObject) DefaultMQPullConsumer(org.apache.rocketmq.client.consumer.DefaultMQPullConsumer) PullResult(org.apache.rocketmq.client.consumer.PullResult)

Aggregations

DefaultMQPullConsumer (org.apache.rocketmq.client.consumer.DefaultMQPullConsumer)5 PullResult (org.apache.rocketmq.client.consumer.PullResult)4 MessageExt (org.apache.rocketmq.common.message.MessageExt)4 MessageQueue (org.apache.rocketmq.common.message.MessageQueue)4 Date (java.util.Date)3 Context (org.apache.flume.Context)2 Event (org.apache.flume.Event)2 Sink (org.apache.flume.Sink)2 Transaction (org.apache.flume.Transaction)2 MemoryChannel (org.apache.flume.channel.MemoryChannel)2 Test (org.junit.Test)2 JSONObject (com.alibaba.fastjson.JSONObject)1 Function (com.google.common.base.Function)1 HashMap (java.util.HashMap)1 List (java.util.List)1 FlumeException (org.apache.flume.FlumeException)1 MQClientException (org.apache.rocketmq.client.exception.MQClientException)1 MessageView (org.apache.rocketmq.console.model.MessageView)1