1,部分代码:
注意: redisDir 是配置文件传入的redis配置文件的地址
package com.dianyou.filter;
import com.dianyou.filter.action.ActionMapping;
import com.dianyou.filter.action.InterfaceKeyService;
import com.dianyou.filter.source.Resources;
import com.google.common.base.Charsets;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import org.json.JSONObject;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import static java.util.concurrent.Executors.newFixedThreadPool;
/**
* todo 第二个flume
*/
public class KafkaInterceptor_test implements Interceptor {
private static org.slf4j.Logger logger = LoggerFactory.getLogger(KafkaInterceptor_test.class);
private static final String VERSION = "1.9.4_test";
private static String redisDir;
//todo 创建初始化 线程的线程池,可以修改 (参考10-50)
private static ExecutorService threadPool = newFixedThreadPool(10);
@Override
public void initialize() {
//todo 初始化redis路径
new Resources(redisDir);
//todo 初始化,调用定时器
InterfaceKeyService.getInstance();
logger.warn("#########Flume-2:编译版本:[{}]##############", VERSION);
}
/**
* todo 最主要的处理逻辑
*/
@Override
public Event intercept(Event event) {
try {
JSONObject logJson = new JSONObject(new String(event.getBody(), Charsets.UTF_8));
//todo 数据的头部信息
Map<String, String> headers = event.getHeaders();
if (logJson != null
&& logJson.has("phoneType")
&& logJson.has("fieldUrl")
&& logJson.has("appKey")
&& logJson.has("deviceId")) {
//todo 放入指定分区的key
headers.put("key", logJson.getString("deviceId"));
//todo 检查日志,补全日志
JSONObject resultJson = ActionMapping.checkLogByActionRule(logJson);
if (resultJson != null) {
event.setBody(resultJson.toString().getByte