package com.taobao.meta.test; import static org.junit.Assert.assertEquals; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; import com.taobao.metamorphosis.Message; import com.taobao.metamorphosis.client.consumer.MessageListener; /** * meta���ɲ���_OneProducerOneConsumer * * @author gongyangyu(gongyangyu@taobao.com) * */ public class MesageSetRollbackOnlyTest extends BaseMetaTest { private final String topic = "meta-test"; @Test(timeout = 60000) public void sendConsume() throws Exception { this.createProducer(); this.producer.publish(this.topic); // �����߱���ָ������ this.createConsumer("group1"); try { // ������Ϣ int count = 5; for (int i = 0; i < count; i++) { this.sendMessage(1, "hello" + i, this.topic); } final ConcurrentHashMap<String, AtomicInteger> counterMap = new ConcurrentHashMap<String, AtomicInteger>(); final AtomicInteger total = new AtomicInteger(); // ���Ľ�����Ϣ����֤������ȷ this.consumer.subscribe(this.topic, 1024, new MessageListener() { public void recieveMessages(Message message) throws InterruptedException { String body = new String(message.getData()); AtomicInteger counter = counterMap.get(body); if (counter == null) { counter = new AtomicInteger(0); AtomicInteger oldCounter = counterMap.putIfAbsent(body, counter); if (oldCounter != null) { counter = oldCounter; } } if (counter.incrementAndGet() <= 2) { message.setRollbackOnly(); } total.incrementAndGet(); } public Executor getExecutor() { // TODO Auto-generated method stub return null; } }).completeSubscribe(); while (total.get() < 3 * count) { Thread.sleep(1000); System.out.println("���յ�" + total.get() + "��Ϣ"); } Thread.sleep(5000); assertEquals(count, counterMap.size()); assertEquals(15, total.get()); for (Map.Entry<String, AtomicInteger> entry : counterMap.entrySet()) { assertEquals(3, entry.getValue().get()); } } finally { this.producer.shutdown(); this.consumer.shutdown(); } } }