1、改为单独线程池异步落库
public class G3SaveVehToDB extends WTBaseSpringBolt {
/**
* 注释内容
*/
private static final long serialVersionUID = 1L;
private final List<GnssInfo> QUEUES = new LinkedList<GnssInfo>();
private ExecutorService threadpool;
@SuppressWarnings("rawtypes")
@Override
public void prepare(Map stormConf, TopologyContext context) {
super.prepare(stormConf, context);
threadpool = Executors.newFixedThreadPool(2); // 长度为2的线程池,为了保证在处理数据的同时,数据还可以被接收
// 这里如果线程池初始化不写在这里会出错Bolt 'S-DB' contains a non-serializable field
}
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
try {
final GnssMessage msg = (GnssMessage) input.getValue(0);
VehicleMessageBody vehicleMessageBody = (VehicleMessageBody) msg
.getBody();
GnssData gnssData = (GnssData) vehicleMessageBody.getData();
GnssInfo gnss = new GnssInfo(vehicleMessageBody.getVehicleNo(),
vehicleMessageBody.getVehicleColor(), gnssData);
QUEUES.add(gnss);
if (QUEUES.size() % 200 == 0) {
threadpool.submit(new Runnable() {
@Override
public void run() {
gnssInfoManager.batchSave2(QUEUES);
QUEUES.clear();
}
});
}