@Configuration public class LogConsumerThreadConfig { private final LogConsumerThread logConsumerThread; public LogConsumerThreadConfig(LogConsumerThread logConsumerThread){ this.logConsumerThread = logConsumerThread; new Thread(logConsumerThread,"logThread-1").start(); new Thread(logConsumerThread,"logThread-2").start(); new Thread(logConsumerThread,"logThread-3").start(); new Thread(logConsumerThread,"logThread-4").start(); new Thread(logConsumerThread,"logThread-5").start(); }
}
@Component public class logQueue { private Queue logQueue = new ArrayBlockingQueue(100000); public Object pollImQueue(){ return imQueue.poll(); } public void addQueue(RetransmitBodyDTO imDataHubDTO){ imQueue.add(imDataHubDTO); } }
//多线程读取队列数据,发到datahub
@Component public class LogConsumerThread implements Runnable{ private final Logger log = LoggerFactory.getLogger(LogConsumerThread.class); private final LogQueue logQueue; private LogProducer logProducer = null; private final DataCombinationSeiviceImpl dataCombinationSeivice; public final MTCAliyunMnsProperties mtcAliyunMnsProperties; public LogConsumerThread(LogQueue logQueue, MTCAliyunMnsProperties mtcAliyunMnsProperties, @Value("${spring.application.name}") String appName, DataCombinationSeiviceImpl dataCombinationSeivice){ this.logQueue = logQueue; this.mtcAliyunMnsProperties = mtcAliyunMnsProperties; this.dataCombinationSeivice = dataCombinationSeivice; logProducer = new LogProducer(mtcAliyunMnsProperties.getAccessKeyId(),mtcAliyunMnsProperties.getAccessKeySecret(),mtcAliyunMnsProperties.getEndPoint(),mtcAliyunMnsProperties.getQueuePrefix(),appName); } @Override public void run() { while (true){ try { Message message = (Message) logQueue.pollLogQueue(); if (null == message) { Thread.sleep(4000L); } else { // this.logProducer.saveLog(message); //先转换格式再把队列发过来的消息读出来save到datahub com.esenyun.mns.dto.Message msg = JsonUtil.stringToObject(message.getMessageBody(),Message.class); dataCombinationSeivice.save(msg); } }catch (Exception e){
如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态,调用interrupt()方法可以使线程退出wait join sleep方法! try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace();
Thread.currentThread().interrupt();} } } }}