ITM事件直接接收并解析
之前在实施一个监控项目时。客户由于买了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事件直接接收并解析的更多相关文章
- C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
在上篇随笔<C#开发微信门户及应用(19)-微信企业号的消息发送(文本.图片.文件.语音.视频.图文消息等)>介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的.但是在回调的服务 ...
- .net mvc前台如何接收和解析后台的字典类型的数据 二分搜索算法 window.onunload中使用HTTP请求 网页关闭 OpenCvSharp尝试 简单爬虫
.net mvc前台如何接收和解析后台的字典类型的数据 很久没有写博客了,最近做了一个公司门户网站的小项目,其中接触到了一些我不会的知识点,今日事情少,便记录一下,当时想在网上搜索相关的内容,但是 ...
- 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...
- [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...
- Android 进阶学习:事件分发机制全然解析,带你从源代码的角度彻底理解(上)
http://blog.csdn.net/guolin_blog/article/details/9097463 事实上我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客開始,就零 ...
- 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 ...
- Qt+事件的接收和忽略
事件的接收与忽略的示意图如下图: 依据前面的知识,事件是可以依据情况进行接收和忽略的,事件的传播是组件层次上面的,而不是依靠类继承机制.在一个特殊的情形下,我们必须使用accept()和ignore( ...
- 【XMPP】Smack源码之消息接收与解析
XmpPullParser 鉴于xmpp协议都是以xml格式来传输,因此源码中解析协议都是用到XmpPullParser来解析xml XmpPullParser很简单,先简单介绍几个比较常用的方法 / ...
- Android事件分发机制完全解析,带你从源码的角度彻底理解
Android事件构成 在Android中,事件主要包括点按.长按.拖拽.滑动等,点按又包括单击和双击,另外还包括单指操作和多指操作.所有这些都构成了Android中的事件响应.总的来说,所有的事件都 ...
随机推荐
- Linux学习决心书
学习Linux决心计划书 我叫耿长学,来自河南省邓州市,经过老男孩教育运维班5个月学习后,我一定要达到的薪水目标是11000元,为了达到此目标我将采取如下10大行动或方案: 1.每天早上5:30-6: ...
- 一起写框架-Ioc内核容器的实现-基础功能-getBean(五)
实现的功能 1. 启动程序时,将@ComponentScan加载的类,创建对象并放在容器里面.(查看上一篇文) 2. 通过ApplicatoinContext的getBean()方法获得容器里面的对象 ...
- CentOS卸载原有旧版OPENJDK并安装SUNJDK解决方案
PS:由于图片是安装后进行截图所以出现的是1.8版本,步骤是完全正确的. 一.检测JDK 首先你要打开终端,为避免可能出现的权限问题建议直接su进入root.(PS:密码可以输入但不显示) 然后输入j ...
- Linux系列教程(二十一)——Linux的bash基本功能
上篇博客我们介绍了什么是shell,以及编写shell脚本的两种执行方式.我们知道在敲命令的时候,有很多快捷键,比如tab键能补全命令,在比如为什么我们直接敲 ll 命令能显示目录的长格式,其实这是b ...
- ios -Unity3D的EasyAR集成到已经有项目中。
近期 在做AR这一块,用EasyAR集成到iOS端,由于现在到项目已经上线,下一版本要做一个AR功能,于是迫于需求需要,自己研究和翻阅读好多集成到资料. 通过整理分出几个重要到模块,其中在这里指出Xc ...
- (二)SVN的安装
1,首先下载SVN的服务端和客户端地址如下http://subversion.apache.org/packages.html.进入网址后滚动到浏览器最底部. (因为我的系统是Windows所以我选择 ...
- ANDROID基础ACTIVITY篇之Activity的加载模式
在这之前首先让我们先了解一下什么是Task Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合.它们有潜在的前后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的A ...
- linux操作系统基础篇(四)
一.系统监控 1.TOP 命令 1) top命令的功能:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 2) 使用top命令列 ...
- java变量与内存深入了解
========================================================================================= 在我看来,学习jav ...
- 创建内部的yum源
http://www.phy.duke.edu/~rgb/General/yum_HOWTO/yum_HOWTO/yum_HOWTO.html#toc6.2 主要的步骤包括: 1.创建Reposito ...