package com.leansoft.luxun.quickstart;
import static org.junit.Assert.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.leansoft.luxun.consumer.SimpleConsumer;
import com.leansoft.luxun.message.Message;
import com.leansoft.luxun.message.MessageList;
import com.leansoft.luxun.message.generated.CompressionCodec;
import com.leansoft.luxun.producer.Producer;
import com.leansoft.luxun.producer.ProducerConfig;
import com.leansoft.luxun.producer.ProducerData;
import com.leansoft.luxun.serializer.StringEncoder;
import com.leansoft.luxun.server.LuxunServer;
import com.leansoft.luxun.server.ServerConfig;
import com.leansoft.luxun.utils.TestUtils;
import com.leansoft.luxun.utils.Utils;
public class SimpleDemo {
private int brokerId1 = 0;
private int brokerId2 = 1;
private int port1 = 9092;
private int port2 = 9093;
private LuxunServer server1 = null;
private LuxunServer server2 = null;
private String brokerList = brokerId1 + ":localhost:" + port1 + "," + brokerId2 + ":localhost:" + port2;
private String broker1 = brokerId1 + ":localhost:" + port1;
private SimpleConsumer simpleConsumer1 = null;
private SimpleConsumer simpleConsumer2 = null;
@Before
public void setup() {
// set up 2 brokers
Properties props1 = new Properties();
props1.put("brokerid", String.valueOf(brokerId1));
props1.put("port", String.valueOf(port1));
props1.put("log.dir", TestUtils.createTempDir().getAbsolutePath());
ServerConfig config1 = new ServerConfig(props1);
server1 = new LuxunServer(config1);
server1.startup();
Properties props2 = new Properties();
props2.put("brokerid", String.valueOf(brokerId2));
props2.put("port", String.valueOf(port2));
props2.put("log.dir", TestUtils.createTempDir().getAbsolutePath());
ServerConfig config2 = new ServerConfig(props2);
server2 = new LuxunServer(config2);
server2.startup();
// set up two simple consumers
// create a consumer 1 to connect to the Luxun server running on 127.0.0.1, port 9092, socket timeout of 60 secs
simpleConsumer1 = new SimpleConsumer("127.0.0.1", port1, 60000);
// create a consumer 2 to connect to the Luxun server running on 127.0.0.1, port 9093, socket timeout of 60 secs
simpleConsumer2 = new SimpleConsumer("127.0.0.1", port2, 60000);
}
@Test
public void sendSingleMessage() throws Exception {
Properties props = new Properties();
props.put("serializer.class", StringEncoder.class.getName());
props.put("broker.list", broker1);
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
ProducerData<String, String> data = new ProducerData<String, String>("test-topic", "test-message");
producer.send(data);
producer.close(); // finish with the producer
// consume by index
List<MessageList> listOfMessageList = simpleConsumer1.consume("test-topic", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
MessageList messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals("test-message", new String(message.getBytes()));
// consume by fanout id
String fanoutId = "demo";
listOfMessageList = simpleConsumer1.consume("test-topic", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message", new String(message.getBytes()));
}
@Test
public void sendMessageWithGZIPCompression() throws Exception {
Properties props = new Properties();
props.put("serializer.class", StringEncoder.class.getName());
props.put("broker.list", broker1);
props.put("compression.codec", "1");
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
ProducerData<String, String> data = new ProducerData<String, String>("test-topic", "test-message");
producer.send(data);
producer.close(); // finish with the producer
// consume by index
List<MessageList> listOfMessageList = simpleConsumer1.consume("test-topic", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
MessageList messageList = listOfMessageList.get(0);
assertEquals(CompressionCodec.GZIP, messageList.getCompressionCodec());
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals("test-message", new String(message.getBytes()));
// consume by fanout id
String fanoutId = "demo";
listOfMessageList = simpleConsumer1.consume("test-topic", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertEquals(CompressionCodec.GZIP, messageList.getCompressionCodec());
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message", new String(message.getBytes()));
}
@Test
public void sendMessageWithAsyncProducer() throws Exception {
Properties props = new Properties();
props.put("serializer.class", StringEncoder.class.getName());
props.put("producer.type", "async");
props.put("broker.list", broker1);
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
ProducerData<String, String> data = new ProducerData<String, String>("test-topic", "test-message");
producer.send(data);
producer.close(); // finish with the producer
// consume by index
List<MessageList> listOfMessageList = simpleConsumer1.consume("test-topic", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
MessageList messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals("test-message", new String(message.getBytes()));
// consume by fanout id
String fanoutId = "demo";
listOfMessageList = simpleConsumer1.consume("test-topic", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message", new String(message.getBytes()));
}
@Test
public void sendMultipleMessages() throws Exception {
Properties props = new Properties();
props.put("serializer.class", StringEncoder.class.getName());
props.put("broker.list", broker1);
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
List<String> messages = new ArrayList<String>();
messages.add("test-message1");
messages.add("test-message2");
messages.add("test-message3");
ProducerData<String, String> data = new ProducerData<String, String>("test-topic", messages);
producer.send(data);
producer.close(); // finish with the producer
// consume by index
List<MessageList> listOfMessageList = simpleConsumer1.consume("test-topic", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
MessageList messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 3);
for(int i = 1; i <= 3; i++) {
Message message = messageList.get(i - 1);
assertEquals("test-message" + i, new String(message.getBytes()));
}
// consume by fanout id
String fanoutId = "demo";
listOfMessageList = simpleConsumer1.consume("test-topic", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 3);
for(int i = 1; i <= 3; i++) {
Message message = messageList.get(i - 1);
assertEquals("test-message" + i, new String(message.getBytes()));
}
}
@Test
public void sendMessagesToDifferentTopics() throws Exception {
Properties props = new Properties();
props.put("serializer.class", StringEncoder.class.getName());
props.put("broker.list", broker1);
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
ProducerData<String, String> data1 = new ProducerData<String, String>("test-topic1", "test-message1");
producer.send(data1);
ProducerData<String, String> data2 = new ProducerData<String, String>("test-topic2", "test-message2");
producer.send(data2);
producer.close(); // finish with the producer
// consume by index
List<MessageList> listOfMessageList = simpleConsumer1.consume("test-topic1", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
MessageList messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals("test-message1", new String(message.getBytes()));
listOfMessageList = simpleConsumer1.consume("test-topic2", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message2", new String(message.getBytes()));
// consume by fanoutId
String fanoutId = "demo";
listOfMessageList = simpleConsumer1.consume("test-topic1", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message1", new String(message.getBytes()));
listOfMessageList = simpleConsumer1.consume("test-topic2", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message2", new String(message.getBytes()));
}
@Test
public void sendMessagesWithCustomPartitioner() throws Exception {
Properties props = new Properties();
props.put("serializer.class", StringEncoder.class.getName());
props.put("broker.list", brokerList);
props.put("partitioner.class", CustomPartitioner.class.getName());
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
// will be sent to broker 1 since (the length of key % num of brokers) = 0
ProducerData<String, String> data1 = new ProducerData<String, String>("test-topic1", "key1", "test-message1");
producer.send(data1);
// will be went to broker 2 since (the length of key % num of brokers) = 1
ProducerData<String, String> data2 = new ProducerData<String, String>("test-topic2", "key11", "test-message2");
producer.send(data2);
producer.close(); // finish with the producer
// consume by index
List<MessageList> listOfMessageList = simpleConsumer1.consume("test-topic1", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
MessageList messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals("test-message1", new String(message.getBytes()));
listOfMessageList = simpleConsumer2.consume("test-topic2", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message2", new String(message.getBytes()));
// consume by fanoutId
String fanoutId = "demo";
listOfMessageList = simpleConsumer1.consume("test-topic1", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message1", new String(message.getBytes()));
listOfMessageList = simpleConsumer2.consume("test-topic2", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals("test-message2", new String(message.getBytes()));
}
@Test
public void sendMessageWithCustomEncoder() throws Exception {
Properties props = new Properties();
props.put("serializer.class", LogEventEncoder.class.getName());
props.put("broker.list", broker1);
ProducerConfig config = new ProducerConfig(props);
Producer<String, LogEvent> producer = new Producer<String, LogEvent>(config);
LogEvent logEvent = new LogEvent();
logEvent.createdTime = System.currentTimeMillis();
logEvent.hostId = "127.0.0.1";
logEvent.logLevel = LogLevel.INFO;
logEvent.message = "a test log message";
ProducerData<String, LogEvent> data = new ProducerData<String, LogEvent>("log-topic", logEvent);
producer.send(data);
producer.close(); // finish with the producer
// consume by index
LogEventDecoder decoder = new LogEventDecoder();
List<MessageList> listOfMessageList = simpleConsumer1.consume("log-topic", 0, 10000);
assertTrue(listOfMessageList.size() == 1);
MessageList messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals(logEvent, decoder.toEvent(message));
// consume by fanout id
String fanoutId = "demo";
listOfMessageList = simpleConsumer1.consume("log-topic", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 1);
messageList = listOfMessageList.get(0);
assertTrue(messageList.size() == 1);
message = messageList.get(0);
assertEquals(logEvent, decoder.toEvent(message));
}
@Test
public void consumeMessageWithDifferentFanoutId() throws Exception {
Properties props = new Properties();
props.put("serializer.class", StringEncoder.class.getName());
props.put("broker.list", broker1);
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String>(config);
for(int i = 0; i < 100; i++) {
ProducerData<String, String> data = new ProducerData<String, String>("test-topicy", "test-message" + i);
producer.send(data);
}
producer.close(); // finish with the producer
// give saving time to borker since producer is oneway async
TestUtils.sleepQuietly(1000);
// consume by different fanout id independently
String fanoutId = "group-a";
List<MessageList> listOfMessageList = simpleConsumer1.consume("test-topicy", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 100);
for(int i = 0; i < 100; i++) {
MessageList messageList = listOfMessageList.get(i);
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals("test-message" + i, new String(message.getBytes()));
}
fanoutId = "group-b";
listOfMessageList = simpleConsumer1.consume("test-topicy", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 100);
for(int i = 0; i < 100; i++) {
MessageList messageList = listOfMessageList.get(i);
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals("test-message" + i, new String(message.getBytes()));
}
fanoutId = "group-c";
listOfMessageList = simpleConsumer1.consume("test-topicy", fanoutId, 10000);
assertTrue(listOfMessageList.size() == 100);
for(int i = 0; i < 100; i++) {
MessageList messageList = listOfMessageList.get(i);
assertTrue(messageList.size() == 1);
Message message = messageList.get(0);
assertEquals("test-message" + i, new String(message.getBytes()));
}
}
@After
public void cleanup() throws Exception {
server1.close();
server2.close();
simpleConsumer1.close();
simpleConsumer2.close();
Utils.deleteDirectory(new File(server1.config.getLogDir()));
Utils.deleteDirectory(new File(server2.config.getLogDir()));
Thread.sleep(500);
}
}