之前在实施一个监控项目时。客户由于买了IBM的小机。当前就赠送了TIVOLI的系统监控软件一套,客户也在他们的生产环境中部署了ITM的监控。由于没有购买IBM的netcool,无法集中管理告警事件,请要求我们直接把ITM的告警接受过来处理,当前我研究了一个ITM与netcool的接口eif,发现它是通过socket实现的,而且数据是文件格式,所以当时就开发了一个程序从ITM中直接接收事件,好东东要分享嘛,发给大家參考。实用的能够拿过去使用。

TECSocketServer.java,程序的主方法类,启动本地port接收ITM的告警事件。

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.concurrent.LinkedBlockingQueue;



import org.apache.log4j.Logger;



/**

 * TECSocketServer採集TEMS转发过来的事件信息。

 *

 * @author James Gao

 * @since iMon 2.0 2011-11-6

 */

public class TECSocketServer extends Thread {



    /**

     * 绑定本地网络port。接收TEC发送过来的事件。

*/

    private ServerSocket ss;



    /**

     * 是否执行。

*/

    boolean runFlag = false;



    /**

     * 缓存数据的队列的数据结构.

     */

    LinkedBlockingQueue queue;

    /**

     * 日志记录。

*/

    static final Logger logger = Logger

            .getLogger(TECSocketServer.class);



    TECEventParser eventParser;



    private TECEventCachedHandler handler;

    private int port;



    /**

     * 默认事件缓存1000000条。

     */

    private static final int EVNET_CACHE_SIZE = 1000000;



    public TECSocketServer(int port, int eventCacheSize) {

        // netcoolEventHandler = new TECEventCachedHandler();

        this.eventParser = new TECEventParser(",");

        this.port = port;



        if (eventCacheSize <= 1000) {

            this.queue = new LinkedBlockingQueue(EVNET_CACHE_SIZE);

        } else {

            this.queue = new LinkedBlockingQueue(eventCacheSize);



        }

    }



    /**

     * 须要在线程里启动绑定本地port的服务,这样便于在后台执行。

     */

    public void run() {

        try {



            ss = new ServerSocket(port);



            while (runFlag) {

                // 得到client连接

                Socket socket = ss.accept();

                socket.setKeepAlive(true);

                // 启动接收服务

                CollectorWork work = new CollectorWork(socket);

                work.start();



            }

        } catch (Exception e) {

            logger.error(e.getMessage(), e);

        } finally {

            if (ss != null) {

                try {

                    ss.close();

                } catch (IOException e) {



                }

            }

        }



    }



    /**

     * 启动採集服务

     *

     * @param eventParser事件解析

     */

    public void startCollectServer() {

        runFlag = true;



        handler = new TECEventCachedHandler(this, eventParser);

        handler.setDaemon(true);

        handler.start();

        logger.info("启动TEC事件处理线程完成。

");



        // 绑定本地网络port。開始接收TEMS转发过来的事件。

        this.start();

        logger.info("TEC接收TEMS转发事件服务启动完成。");

    }



    public void stopCollectServer() {

        runFlag = false;

        try {

            ss.close();

        } catch (Exception ex) {

            logger.error(ex.getMessage(), ex);

        }



        try {

            handler.interrupt();

        } catch (Exception ex) {

        }

        logger.info("TEC接收TEMS转发事件服务关闭。释放绑定port。");

    }



    /**

     * 事件接收线程

     *

     */

    class CollectorWork extends Thread {

        private BufferedReader in;

        private Socket socket;



        public CollectorWork() {



        }



        public CollectorWork(Socket socket) {

            this.socket = socket;

        }



        public void run() {



            try {



                // 15分钟内无事件则关闭client

                socket.setSoTimeout(15 * 60 * 1000);

                logger.info("*******************************************************************");

                logger.info("A TEMS client come in:" + socket);

                logger.info("*******************************************************************");

                StringBuffer sb = new StringBuffer();

//                String event = null;

                in = new BufferedReader(new InputStreamReader(

                        socket.getInputStream()));

                String line = "";

                boolean endflag = false;

                while (runFlag && (line = in.readLine()) != null) {

                    line = line.trim();

                    System.out.println(line);

                    System.out.println();

                    if (line.equals(""))

                        continue;



                    // tems转发过来的每条事件以Start开头

                    if (line.startsWith("<START>")&&line.endsWith("END")) {

                        endflag = true;

                    

                        sb = new StringBuffer();

                        // sb.append(line).append(";");

                        sb.append(line);

                        

                    }

//                    // SocketGateway转发过来的每条事件以End开头

//                    if (line.indexOf("end") == 0) {

//                        endflag = true;

//

//                    }

//                    if (!endflag) {

//                        if (event != null) {

//                            sb.append(line);

//                        }

//                    }



                    if (endflag) {

                        logger.info("**********receives data==*************"

                                + sb.toString());

                        // 放入缓存队件中。

queue.put(sb.toString());

                    }



                }

            } catch (Exception e) {

                logger.info(e.getMessage(), e);

            } finally {

                try {

                    if (in != null) {

                        in.close();

                    }

                } catch (IOException e) {

                    logger.info(e.getMessage(), e);

                }

                try {

                    if (socket != null) {

                        socket.close();

                    }

                } catch (IOException e) {

                    logger.info(e.getMessage(), e);

                }

            }

        }

    }



    

    public static void main(String[] args){

        TECSocketServer server = new TECSocketServer(5529,100000);

        server.startCollectServer();

    }

}

TECEventCachedHandler.java

import java.util.HashMap;



/**

 *

 * 针对TEC发送过来的事件进行缓存队列。并从缓存队列中取出并解析使事件成为标准化事件后进行处理。

*

 * @author James Gao,create on 2010-2-9

 * @version v1.0

 */

class TECEventCachedHandler extends Thread {

    /**

     *

     */

    private final TECSocketServer tecSocketServer;

    private TECEventParser parseHandler;



    public TECEventCachedHandler(TECSocketServer tecSocketServer, TECEventParser parseHandler) {

        this.tecSocketServer = tecSocketServer;

        this.parseHandler = parseHandler;

    }



    public void run() {



        while (this.tecSocketServer.runFlag) {



            String data = null;

            try {

                // 从缓存队列中取出进行处理。

data = (String) this.tecSocketServer.queue.take();



                if (TECSocketServer.logger.isDebugEnabled()) {

                    TECSocketServer.logger.debug("Take a event data from CacheQueue,data=["

                            + data.toString() + "]");

                }



                HashMap eventMap = parseHandler

                        .parserStr( data);

                if (TECSocketServer.logger.isDebugEnabled()) {

                    TECSocketServer.logger.debug("Process completely.");

                }

            } catch (InterruptedException ex) {

                TECSocketServer.logger.warn("Read data from cache queue error ,cause : "

                        + ex.getMessage(), ex);

            } catch (Exception ex) {

                TECSocketServer.logger.warn("Process event data fail, data=[" + data

                        + "],cause by: " + ex.getMessage(), ex);

            }

        }

    }



}

TECEventParser.java主要用来解析文本为数组。

import java.util.HashMap;



import org.apache.log4j.Logger;



/**

 * 事件解析处理

 *

 * @author James Gao, 2011-11-6

 * @since SOP iMon 2.0

 */

public class TECEventParser {



    private static final Logger logger = Logger

            .getLogger(TECEventParser.class);



    private String separator;



    public TECEventParser(String separator) {

        this.separator = separator;

    }



    /**

     * 解析组合字符串

     *

     * @param initStr

     */

    HashMap mapForData = new HashMap();

    public HashMap parserStr(String initStr) {

        long t1 = System.currentTimeMillis();

        String event = initStr;

        HashMap mapForValue = new HashMap();

        if (initStr != null && !initStr.equals("")) {

            for(int a,b=0,c,d,i=0;i<initStr.length();i=d ){

                

                a = initStr.indexOf("='");

                b = initStr.indexOf("';");

                c = initStr.indexOf(";");

                String x = initStr.substring(c+1, b+1);

                System.out.println(x);

                if(!"".equals(x)&&(x!=null)){

                    int e = x.indexOf("='");

                    String key = x.substring(0, e);

                    System.out.println(key);

                    String firstValue = x.substring(e+2, x.length());

                    String lastValue = firstValue.substring(0, firstValue.length()-1);

                    if(lastValue.equals("")){

                        lastValue ="no value";

                    }

                    System.out.println(lastValue);

                    if(key!=null&&!"".equals(key)&&key.equals("source")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("sub_source")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("severity")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("cms_hostname")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("situation_name")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("situation_fullname")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("situation_displayitem")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("situation_origin")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("situation_time")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("situation_group")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("situation_status")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("origin")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("hostname")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("master_reset_flag")){

                        mapForValue.put(key, lastValue);

                    }

                    else if(key!=null&&!"".equals(key)&&key.equals("integration_type")){

                        mapForValue.put(key, lastValue);

                    }

                    else{

                        mapForValue.put(key, lastValue);

                    }

                    

                    

                    

                }

                System.out.println("~~~~~~~~~~");

                String x1 = initStr.substring(a+2, b);

//                System.out.println(x1);

                String x2 = initStr.substring(b+1, initStr.length());

                if(x2.indexOf("END")==1){

                    break;

                }

                c = x2.indexOf("';");

                String x3 = x2.substring(1, c+1);

                initStr =x2;

                d =(initStr.length())-b;

                

            }

        } else {

            logger.info("接收到的原始数据 initStr is NULL");

        }

        long t4 = System.currentTimeMillis();

        logger.info("解析告警" + event + "耗时:" + (t4 - t1) + "ms");

        return mapForValue;

    }





}

ITM事件直接接收并解析的更多相关文章

  1. C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密

    在上篇随笔<C#开发微信门户及应用(19)-微信企业号的消息发送(文本.图片.文件.语音.视频.图文消息等)>介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的.但是在回调的服务 ...

  2. .net mvc前台如何接收和解析后台的字典类型的数据 二分搜索算法 window.onunload中使用HTTP请求 网页关闭 OpenCvSharp尝试 简单爬虫

    .net mvc前台如何接收和解析后台的字典类型的数据   很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是 ...

  3. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  4. [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...

  5. Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)

    http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...

  6. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(二十九):推送avro格式数据到topic,并使用spark structured streaming接收topic解析avro数据

    推送avro格式数据到topic 源代码:https://github.com/Neuw84/structured-streaming-avro-demo/blob/master/src/main/j ...

  7. Qt+事件的接收和忽略

    事件的接收与忽略的示意图如下图: 依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制.在一个特殊的情形下,我们必须使用accept()和ignore( ...

  8. 【XMPP】Smack源码之消息接收与解析

    XmpPullParser 鉴于xmpp协议都是以xml格式来传输,因此源码中解析协议都是用到XmpPullParser来解析xml XmpPullParser很简单,先简单介绍几个比较常用的方法 / ...

  9. Android事件分发机制完全解析,带你从源码的角度彻底理解

    Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...

随机推荐

  1. JavaScript之数组五大迭代方法总结

    ES5定义了五个迭代方法,每个方法都接收两个参数:要在每一项上运行的函数和运行该函数的作用域对象(可选的),作用域对象将影响this的值.传入这些方法中的函数会接收三个参数:数组的项的值.该项在数组中 ...

  2. Python 简单的天气预报

    轻巧的树莓派一直是大家的热爱,在上面开发一些小东西让我们很有成就感,而在linux下,python能使麻烦的操作变得简单,而树莓派功耗还很低,相结合,完美! 1,直接进入正题,一般在linux或树莓派 ...

  3. linux平台搭建postfix邮件服务器

    一,搭建邮件服务器前准备如下: Centos 7.2 64位Postfix-2.8.12.tar.gz Postfix MTA(邮件传输代理)Dovecot-2.1.8.tar.gz IMAP 和 P ...

  4. A computer hardware platform abstraction - part.1

    intro Nowdays every electronic computer is based on  Boole Algebra and Sequential Logic,So my post w ...

  5. Maven3 快速入门

    Maven3 快速入门 Maven 是目前大型项目构建的必备知识.本章会通过介绍 Maven 的作用,Maven 的基本语法,以及搭建企业级项目架构来快速入门 Maven .前两部分是理论知识只需要了 ...

  6. postman 时间戳和加密

    在使用postman进行接口测试的时候,对于有些接口字段需要时间戳加密,这个时候我们就遇到2个问题,其一是接口中的时间戳如何得到?其二就是对于现在常用的md5加密操作如何在postman中使用代码实现 ...

  7. java 之 建造者模式(大话设计模式)

    建造者模式,在笔者看来比较试用于,定制一个业务流程,而流程的细节又不尽相同,每个细节又必不可少,这时应考虑使用建造者模式. 大话设计模式-类图 先看下笔者写的一个简单的例子. /** * 所有建造过程 ...

  8. 【转】npm包管理器那些事

    原文链接:http://www.cnblogs.com/shuoer/p/7782125.html npm包管理器那些事! 今天和朋友针对npm包全局安装和本地项目安装这个梗展开的激烈的讨论,故此做一 ...

  9. Javascript-数值运算 保留小数点位数,并对最后一位小数各种取整方法

    今天遇到Javascript数值运算的坑,说到底,还是用得少啊.得多用多敲代码多遇坑. 先介绍以下三个Javascript number取整运算方法. Math.floor() 对一个数退一取整 例: ...

  10. Handlebars 和 angularjs 之间的区别

    handlebarsjs算不上框架,只是一种js模板引擎,是模板库,模板库的主要作用是:你想要生成某一大片有一定规律的界面,比如商品详情,不同商品之间差的只是名称,价格,图片,介绍这些,但是结构一样的 ...