一般storm的open是作为配置加载项的,但是在实际的操作中也可以在open中从Kafka拉取数据,在nextTuple发送数据,这样减少了nextTuple中的资源消耗。这种方法的使用和线程相关,目前只能通过队列实现,用map等结构测试失败。
public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
/*加载配置*/
initData();
}
/**
* 初始化数据
*/
private void initData() {
new Thread(() -> putDataInQueue()).start();
}
/**
* 获取kafka数据放入队列中
*/
private void putDataInQueue() {
/*kafka配置初始化,创建消费者*/
while (true) {
if (isStart) {
/*设置Kafka的回滚时间*/
for (//遍历回滚数据) {
String value = record.value();
if (StringUtils.isNotBlank(value)) {
boolean b_in = false;
while (true) {
try {
//核心代码,放进队列中,目前就队列能用,其他方式测试不行
b_in = queue.offer(input, 1, TimeUnit.MILLISECONDS);
if (b_in) {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} else {
LOGGER.debug("正在初始化,未获取数据");
}
}
}
public void nextTuple() {
long start = System.currentTimeMillis();
if (!isStart) {
isStart = true;
}
try {
KKSEntity value = queue.take();
handMsg(value);
} catch (InterruptedException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
LOGGER.info("获取数据,处理发送耗时:-->" + (end - start));
}