|
41 | 41 | import org.apache.rocketmq.common.PlainAccessConfig;
|
42 | 42 | import org.apache.rocketmq.common.TopicConfig;
|
43 | 43 | import org.apache.rocketmq.common.message.Message;
|
| 44 | +import org.apache.rocketmq.common.message.MessageAccessor; |
44 | 45 | import org.apache.rocketmq.common.message.MessageConst;
|
45 | 46 | import org.apache.rocketmq.common.message.MessageDecoder;
|
46 | 47 | import org.apache.rocketmq.common.message.MessageExt;
|
@@ -570,6 +571,86 @@ public void onException(Throwable e) {
|
570 | 571 | done.await();
|
571 | 572 | }
|
572 | 573 |
|
| 574 | + @Test |
| 575 | + public void testPopMultiLmqMessage_async() throws Exception { |
| 576 | + final long popTime = System.currentTimeMillis(); |
| 577 | + final int invisibleTime = 10 * 1000; |
| 578 | + final String lmqTopic = MixAll.LMQ_PREFIX + "lmq1"; |
| 579 | + final String lmqTopic2 = MixAll.LMQ_PREFIX + "lmq2"; |
| 580 | + final String multiDispatch = String.join(MixAll.MULTI_DISPATCH_QUEUE_SPLITTER, lmqTopic, lmqTopic2); |
| 581 | + final String multiOffset = String.join(MixAll.MULTI_DISPATCH_QUEUE_SPLITTER, "0", "0"); |
| 582 | + doAnswer(new Answer<Void>() { |
| 583 | + @Override |
| 584 | + public Void answer(InvocationOnMock mock) throws Throwable { |
| 585 | + InvokeCallback callback = mock.getArgument(3); |
| 586 | + RemotingCommand request = mock.getArgument(1); |
| 587 | + ResponseFuture responseFuture = new ResponseFuture(null, request.getOpaque(), 3 * 1000, null, null); |
| 588 | + RemotingCommand response = RemotingCommand.createResponseCommand(PopMessageResponseHeader.class); |
| 589 | + response.setCode(ResponseCode.SUCCESS); |
| 590 | + response.setOpaque(request.getOpaque()); |
| 591 | + |
| 592 | + PopMessageResponseHeader responseHeader = (PopMessageResponseHeader) response.readCustomHeader(); |
| 593 | + responseHeader.setInvisibleTime(invisibleTime); |
| 594 | + responseHeader.setPopTime(popTime); |
| 595 | + responseHeader.setReviveQid(0); |
| 596 | + responseHeader.setRestNum(1); |
| 597 | + StringBuilder startOffsetInfo = new StringBuilder(64); |
| 598 | + ExtraInfoUtil.buildStartOffsetInfo(startOffsetInfo, topic, 0, 0L); |
| 599 | + responseHeader.setStartOffsetInfo(startOffsetInfo.toString()); |
| 600 | + StringBuilder msgOffsetInfo = new StringBuilder(64); |
| 601 | + ExtraInfoUtil.buildMsgOffsetInfo(msgOffsetInfo, topic, 0, Collections.singletonList(0L)); |
| 602 | + responseHeader.setMsgOffsetInfo(msgOffsetInfo.toString()); |
| 603 | + response.setRemark("FOUND"); |
| 604 | + response.makeCustomHeaderToNet(); |
| 605 | + |
| 606 | + MessageExt message = new MessageExt(); |
| 607 | + message.setQueueId(0); |
| 608 | + message.setFlag(0); |
| 609 | + message.setQueueOffset(10L); |
| 610 | + message.setCommitLogOffset(10000L); |
| 611 | + message.setSysFlag(0); |
| 612 | + message.setBornTimestamp(System.currentTimeMillis()); |
| 613 | + message.setBornHost(new InetSocketAddress("127.0.0.1", 10)); |
| 614 | + message.setStoreTimestamp(System.currentTimeMillis()); |
| 615 | + message.setStoreHost(new InetSocketAddress("127.0.0.1", 11)); |
| 616 | + message.setBody("body".getBytes()); |
| 617 | + message.setTopic(topic); |
| 618 | + MessageAccessor.putProperty(message, MessageConst.PROPERTY_INNER_MULTI_DISPATCH, multiDispatch); |
| 619 | + MessageAccessor.putProperty(message, MessageConst.PROPERTY_INNER_MULTI_QUEUE_OFFSET, multiOffset); |
| 620 | + response.setBody(MessageDecoder.encode(message, false)); |
| 621 | + responseFuture.setResponseCommand(response); |
| 622 | + callback.operationSucceed(responseFuture.getResponseCommand()); |
| 623 | + return null; |
| 624 | + } |
| 625 | + }).when(remotingClient).invokeAsync(anyString(), any(RemotingCommand.class), anyLong(), any(InvokeCallback.class)); |
| 626 | + final CountDownLatch done = new CountDownLatch(1); |
| 627 | + final PopMessageRequestHeader requestHeader = new PopMessageRequestHeader(); |
| 628 | + requestHeader.setTopic(lmqTopic); |
| 629 | + mqClientAPI.popMessageAsync(brokerName, brokerAddr, requestHeader, 10 * 1000, new PopCallback() { |
| 630 | + @Override |
| 631 | + public void onSuccess(PopResult popResult) { |
| 632 | + assertThat(popResult.getPopStatus()).isEqualTo(PopStatus.FOUND); |
| 633 | + assertThat(popResult.getRestNum()).isEqualTo(1); |
| 634 | + assertThat(popResult.getInvisibleTime()).isEqualTo(invisibleTime); |
| 635 | + assertThat(popResult.getPopTime()).isEqualTo(popTime); |
| 636 | + assertThat(popResult.getMsgFoundList()).size().isEqualTo(1); |
| 637 | + assertThat(popResult.getMsgFoundList().get(0).getTopic()).isEqualTo(lmqTopic); |
| 638 | + assertThat(popResult.getMsgFoundList().get(0).getProperty(MessageConst.PROPERTY_INNER_MULTI_DISPATCH)) |
| 639 | + .isEqualTo(multiDispatch); |
| 640 | + assertThat(popResult.getMsgFoundList().get(0).getProperty(MessageConst.PROPERTY_INNER_MULTI_QUEUE_OFFSET)) |
| 641 | + .isEqualTo(multiOffset); |
| 642 | + done.countDown(); |
| 643 | + } |
| 644 | + |
| 645 | + @Override |
| 646 | + public void onException(Throwable e) { |
| 647 | + Assertions.fail("want no exception but got one", e); |
| 648 | + done.countDown(); |
| 649 | + } |
| 650 | + }); |
| 651 | + done.await(); |
| 652 | + } |
| 653 | + |
573 | 654 | @Test
|
574 | 655 | public void testAckMessageAsync_Success() throws Exception {
|
575 | 656 | doAnswer(new Answer<Void>() {
|
|
0 commit comments