package com.taobao.meta.test;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
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;
import com.taobao.metamorphosis.client.producer.PartitionSelector;
import com.taobao.metamorphosis.cluster.Partition;
import com.taobao.metamorphosis.exception.MetaClientException;
/**
* ����������
*
* @author boyan(boyan@taobao.com)
* @date 2011-9-2
*
*/
public class TransactionConsumerTest extends BaseMetaTest {
final String topic = "meta-test";
final int maxSize = 1024 * 1024;
@Test
public void testTxConsumeRollback() throws Exception {
try {
this.producer = this.sessionFactory.createProducer(new PartitionSelector() {
public Partition getPartition(final String topic, final List<Partition> partitions,
final Message message) throws MetaClientException {
return partitions.get(0);
}
});
this.createConsumer("tx-consumer-test");
final AtomicInteger counter = new AtomicInteger(0);
final int sentCount = 5;
final List<Message> msgList1 = new ArrayList<Message>();
final List<Message> msgList2 = new ArrayList<Message>();
this.consumer.subscribe(this.topic, this.maxSize, new MessageListener() {
public void recieveMessages(final Message message) {
System.out.println("�յ���Ϣ:" + new String(message.getData()));
message.getPartition().setAutoAck(false);
// 5���ع�
final int count = counter.incrementAndGet();
if (count <= sentCount) {
msgList1.add(message);
}
else {
msgList2.add(message);
}
if (count == sentCount) {
System.out.println("�յ�" + count + "����Ϣ���ع�");
message.getPartition().rollback();
}
else if (count == 10) {
// 10��,ack
System.out.println("�յ�" + count + "����Ϣ��ȷ��");
message.getPartition().ack();
}
}
public Executor getExecutor() {
// TODO Auto-generated method stub
return null;
}
}).completeSubscribe();
this.producer.publish(this.topic);
for (int i = 0; i < sentCount; i++) {
if (!this.producer.sendMessage(new Message(this.topic, String.valueOf(i).getBytes())).isSuccess()) {
throw new RuntimeException("Send message failed");
}
}
while (counter.get() < 2 * sentCount) {
Thread.sleep(1000);
}
Thread.sleep(2000);
assertEquals(sentCount * 2, counter.get());
assertEquals(msgList1, msgList2);
}
finally {
this.producer.shutdown();
this.consumer.shutdown();
}
}
}