package org.infosec.ismp.situation.mian; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import org.infosec.ismp.situation.calculate.substep.AttackReckon; import org.infosec.ismp.situation.calculate.substep.IllicitConnectReckom; import org.infosec.ismp.situation.calculate.substep.VirusReckon; import org.infosec.ismp.situation.calculate.substep.callable.result.ResultExponential; import org.infosec.ismp.situation.manager.AcquireExponential; import org.infosec.ismp.situation.manager.SituationProcess; import org.infosec.ismp.situation.manager.UdpReceiveThread; import org.infosec.ismp.situation.model.Event; import org.infosec.ismp.situation.service.impl.SituationPipe; import org.infosec.ismp.situation.util.ConstantSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 态势服务主启动类 * @author cc * 2010-10-11 16:48:11 */ public class SituationServer { private static Logger logger = Logger.getLogger(SituationServer.class); ///先入先出队列(线程安全):这个队列用来存分组前收集到的事件。 private BlockingQueue<Event> eventQueue = new ArrayBlockingQueue<Event>(ConstantSource.CACHEFIRSTSIZE); ///先入先出队列(线程安全):这个队列用来存分组后收集到的事件。 private BlockingQueue<List<Event>> groupQueue = new ArrayBlockingQueue<List<Event>>(ConstantSource.CACHESECONDSIZE); public SituationServer() { try { init(); } catch (Exception e) { e.printStackTrace(); } } private void init() { ApplicationContext context = new ClassPathXmlApplicationContext( new String[]{ "classpath*:applicationContext-resources.xml", "classpath*:applicationContext-dao-situation.xml", "classpath*:applicationContext-service-situation.xml", "classpath*:applicationContext-situation-process-service.xml", "classpath*:applicationContext-situation-rmi.xml" }); //开启一个单一线程的有序的线程池 ExecutorService singlePool = Executors.newFixedThreadPool(1); //开启一个5-10线程的线程池 ThreadPoolExecutor execPool = new ThreadPoolExecutor(5, 25, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100)); CompletionService<ResultExponential> completionService = new ExecutorCompletionService<ResultExponential>( execPool); ///攻击事件指数计算器 AttackReckon attackReckon = (AttackReckon) context.getBean("attackReckon"); attackReckon.setCompletionService(completionService); ///病毒事件指数计算器 VirusReckon virusReckon = (VirusReckon) context.getBean("virusReckon"); virusReckon.setCompletionService(completionService); ///非法连接指数计算器 IllicitConnectReckom illicitConnectReckom = (IllicitConnectReckom) context.getBean("illicitConnectReckom"); illicitConnectReckom.setCompletionService(completionService); ///udp接收事件数据报线程。 UdpReceiveThread receiveThread = new UdpReceiveThread(eventQueue); ///启动udp接收事件数据报线程。将接收到的数据报解析成事件,并且将事件放入队列。 receiveThread.start(); ///态势处理。 SituationProcess situationProcess = (SituationProcess) context.getBean("situationProcess"); situationProcess.setQueueEvent(eventQueue); AcquireExponential aeProcess = (AcquireExponential) context.getBean("acquireExponential"); aeProcess.setCompletionService(completionService); aeProcess.setExecPool(singlePool); SituationPipe situationPipe = (SituationPipe) context.getBean("situationPipe");///保存态势值的管道 situationProcess.start();///启动调度先入先出队列(事件分组)线程。 aeProcess.start(); try { while(true){ // System.out.println("(主线程)队列大小为:" + eventQueue.size()); // System.out.println("主机态势:" + situationPipe.getMachineSituation().size()); // System.out.println("机柜态势:" + situationPipe.getMachineCabinetSituation().size()); // System.out.println("机房态势:" + situationPipe.getMachineRoomSituation().size()); // System.out.println("安全域态势:" + situationPipe.getSecurityAreaSituation().size()); // System.out.println("======================"); Thread.sleep(1000);///每一秒钟检测队列的大小。 } } catch (InterruptedException e) { e.printStackTrace(); } } /** * Author:cchang * @param args * 2010-10-11 16:48:18 */ public static void main(String[] args) { new SituationServer(); } }