/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.rocketmq.test.util; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import org.apache.log4j.Logger; import org.apache.rocketmq.test.listener.AbstractListener; import static com.google.common.truth.Truth.assertThat; public class MQWait { private static Logger logger = Logger.getLogger(MQWait.class); public static boolean waitConsumeAll(int timeoutMills, Collection<Object> allSendMsgs, AbstractListener... listeners) { boolean recvAll = false; long startTime = System.currentTimeMillis(); Collection<Object> noDupMsgs = new ArrayList<Object>(); while (!recvAll) { if ((System.currentTimeMillis() - startTime) < timeoutMills) { noDupMsgs.clear(); try { for (AbstractListener listener : listeners) { Collection<Object> recvMsgs = Collections .synchronizedCollection(listener.getAllUndupMsgBody()); noDupMsgs.addAll(VerifyUtils.getFilterdMessage(allSendMsgs, recvMsgs)); } } catch (Exception e) { e.printStackTrace(); } try { assertThat(noDupMsgs).containsAllIn(allSendMsgs); recvAll = true; break; } catch (Throwable e) { } TestUtil.waitForMonment(500); } else { logger.error(String.format( "timeout but still not receive all messages,expectSize[%s],realSize[%s]", allSendMsgs.size(), noDupMsgs.size())); break; } } return recvAll; } public static void setCondition(Condition condition, int waitTimeMills, int intervalMills) { long startTime = System.currentTimeMillis(); while (!condition.meetCondition()) { if (System.currentTimeMillis() - startTime > waitTimeMills) { logger.error("time out,but contidion still not meet!"); break; } else { TestUtil.waitForMonment(intervalMills); } } } public static void main(String args[]) { long start = System.currentTimeMillis(); MQWait.setCondition(new Condition() { int i = 0; public boolean meetCondition() { i++; return i == 100; } }, 10 * 1000, 200); } }