package org.flume; import com.hazelcast.client.HazelcastClient; import com.hazelcast.client.config.ClientConfig; import com.hazelcast.core.HazelcastInstance; import org.apache.flume.Context; import org.apache.flume.Event; import org.apache.flume.EventDeliveryException; import org.apache.flume.PollableSource; import org.apache.flume.conf.Configurable; import org.apache.flume.event.EventBuilder; import org.apache.flume.source.AbstractSource; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; /** * @author keyki */ public class HazelcastQueueSource extends AbstractSource implements Configurable, PollableSource { private BlockingQueue<String> distributedQueue; private HazelcastInstance hazelcastClient; private String queueName; private String serverIP; private String userName; private String userPwd; @Override public void configure(Context context) { queueName = context.getString("queueName"); serverIP = context.getString("servers"); userName = context.getString("user"); userPwd = context.getString("password"); } @Override public synchronized void start() { ClientConfig clientConfig = new ClientConfig(); clientConfig.getGroupConfig().setName(userName).setPassword(userPwd); clientConfig.addAddress(serverIP); hazelcastClient = HazelcastClient.newHazelcastClient(clientConfig); distributedQueue = hazelcastClient.getQueue(queueName); } @Override public synchronized void stop() { hazelcastClient.shutdown(); } @Override public Status process() throws EventDeliveryException { Status status = Status.READY; try { String msg = distributedQueue.poll(1000, TimeUnit.MILLISECONDS); if (msg == null) { return Status.BACKOFF; } Event event = EventBuilder.withBody(msg.getBytes()); getChannelProcessor().processEvent(event); } catch (InterruptedException e) { status = Status.BACKOFF; } return status; } }