自定义Source
FLume Source 有PollableSource和EventDrivenSource,启动Source时会判断
EventDrivenSourceRunner
EventDrivenSourceRunner启动后调用source的start()就完了,自定义Event类型Source时,实现 EventDrivenSource接口即可
PollableSourceRunner
Pollable类型的Source启动后会起一个新的线程,一直调用Source的process()方法. 这个方法可以返回Status.READY或Status.BACKOFF,如果返回READY,这次调用就结束,如果返回BACKOFF,则表示遇到了问题或者没有数据等异常情形,这时PollingRunner就会sleep一段时间
测试程序
定义了2个source,一个Event类型,一个Pollable类型,都是每过一段时间打印helloworld
agent.sources = mySource1 mySource2
agent.channels = memoryChannel
agent.sinks = loggerSink
agent.sources.mySource1.type = com.endless.flume.MyPollableSource
agent.sources.mySource1.message = pollable
agent.sources.mySource1.channels = memoryChannel
agent.sources.mySource2.type = com.endless.flume.MyEventSource
agent.sources.mySource2.message = event
agent.sources.mySource2.period = 3
agent.sources.mySource2.channels = memoryChannel
agent.channels.memoryChannel.type = memory
agent.sinks.loggerSink.type = logger
agent.sinks.loggerSink.channel = memoryChannel
public class MyEventSource extends AbstractSource implements EventDrivenSource,
Configurable {
private static final Logger logger = LoggerFactory.getLogger(MyEventSource.class);
private String message = "helloworld";
private int period = 1;
private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void configure(Context context) {
//读取配置文件中lines配置的值
logger.info("MyEventSource reading context..");
message=context.getString("message");
period=context.getInteger("period");
}
@Override
public synchronized void start() {
logger.info("MyEventSource start");
while(true){
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("time", formatter.format(new Date()));
getChannelProcessor().processEvent(
EventBuilder.withBody(message, Charset.forName("UTF-8"), headers));
try {
TimeUnit.SECONDS.sleep(period);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public synchronized void stop() {
logger.info("MyEventSource stop");
}
}
public class MyPollableSource extends AbstractSource implements Configurable, PollableSource {
private static final Logger logger = LoggerFactory.getLogger(MyPollableSource.class);
private String message = "helloworld";
private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private boolean status=true;
@Override
public Status process() throws EventDeliveryException {
status=!status;//测试用,模拟每秒1次消息
if(status)
return Status.BACKOFF;
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("time", formatter.format(new Date()));
getChannelProcessor().processEvent(
EventBuilder.withBody(message, Charset.forName("UTF-8"), headers));
return Status.READY;
}
@Override
public void configure(Context context) {
//读取配置文件中lines配置的值
logger.info("MyPollableSource reading context..");
message=context.getString("message");
}
@Override
public long getBackOffSleepIncrement() {
return 1000; //每次返回BACKOFF sleep 1秒
}
@Override
public long getMaxBackOffSleepInterval() {
return 10000; //返回BACKOFF 最多sleep 10 秒
}
}