Skip to content

Instantly share code, notes, and snippets.

Logstash+Redis+Elasticsearch+Kibana日志监控报警系统

@(服务监控)[logstash|Elasticsearch|kibana]

工具介绍

Logstash:用于收集、处理、传输日志数据。
Redis:用于实时标识和传输日志数据。
Elasticsearch:用于实时查询和解析数据。
Kibana:用于数据可视化。

工作流程

Hessian序列化Hibernate的延迟加载Set等集合问题

将原有的RMI服务调用的权限控制系统改写成Hession服务调用时,遇到了LazyInitializationException异常。此权限系统用的是ORM框架,分析产生此问题的原因是Hessian序列化对象时,此对象中包含Hibernate的集合映射,此时Hibernate的session已经关闭。<br / > 解决方法
针对Hibernate的PersistentCollection订制一个Serializer。
实现: 继承AbastractSerializer,重写WriteObject方法,再重写SerializerFactory,当对Hibernate 集合进行序列化的时候,使用定制化的序列化Class。

import com.caucho.hessian.io.AbstractHessianOutput;
import com.caucho.hessian.io.AbstractSerializer;

import com.caucho.hessian.io.CollectionSerializer;

Spring事务自身调用

####场景 对象调用自身具有事务传播的方法,同时使事务有效。 ####解决方法 使用AopContext.currentProxy()获取此类的AOP代理对象,用代理对象调用自身方法。注意,使用此解决方式,在spring配置文件的aop配置要添加expose-proxy="true"。 ####代码实现 Spring相关配置:<aop:aspectj-autoproxy proxy-target- expose-proxy="true"/> ####业务代码 在deliverItemAsyncCallback方法中调用deliverCallBackBusiness方法,并且使其事务有效。

Mybatis动态生成表字段

mybatis中一个属性:statementType。
这个属性的作用是告诉mybatis我们写的这个sql到底是预编译(PRESTATEMENT)还是非预编译(STATEMENT)的。
有什么区别呢?如果是预编译的,那么系统在初始化时就会读取这段sql代码,将指定的实体类中的字段替换了类似#{}这样的语句,就是形成了类似这样的语句:

select * from tableName where code=? 

Hession超时控制

设置hession调用超时的配置如下(默认为20秒,可根据业务场景自己调整):

<bean id="gateConfigFacade" class="org.springframework.remoting.caucho.HessianProxyFactoryBean" lazy-init="true" >
    <property name="serviceUrl" value="${mvn.config.url}/gateConfigFacade" />
    <property name="serviceInterface" value="com.changyou.npt.config.facade.gate.GateConfigFacade" />
    <property name="proxyFactory">
        <bean class="com.caucho.hessian.client.HessianProxyFactory" p:hessian2Request="true" p:readTimeout="20000" p:connectTimeout="20000" p:hessian2Reply="true" />

Apache+PHP+Nagios安装

由于用户权限的限制,所以采用手动编译,如果具有root权限的话可以直接下载XAMPP包 ####编译Apache Httpd 去官网下载安装包、解压
容易产生的问题是配置的时候提示缺少APR、APR-UTIL、PCRE 的lib,这个要手动下载,最新的httpd-2.4.10,直接将下载解压后的APR、APR-UTIL 分别放到httpd-2.4.10(源包)的srclib的apr、apr-util下,编译pcre到指定位置,然后再编译httpd,如下:

./configuration --prefix=/home/.../httpd-2.4.10 --with-pcre=/home/.../pcre/

####编译PHP

Check_mysql_health安装

wget包,解压,安装
####出现的问题 DBI.pm找不到
解决方式:执行perl进行安装

perl -MCPAN -e shell

install DBI

OOZIE JOB僵死问题

通过oozie job -kill XXXX,无法将其杀死,然后将oozie重新启动,重启之后发现该workflow仍然僵死,显示处于running状态,猜想应该是oozie所对应的数据库中存有该wf的状态信息,于是想去数据库中将此wf的信息删除,进入数据库中发现无法查询数据库表,原来是表被lock,原因找到,于是重启mysql服务,再重启oozie,一切ok
重启hadoop job
重启oozie
hadoop-daemons.sh start jobtracker

启动脚本 脚本说明

start-all.sh 启动所有的Hadoop守护进程。包括NameNode、 Secondary NameNode、DataNode、JobTracker、 TaskTrack

BeanUtils.copyProperties方法问题

之前使用流式build模式来创建bean对象,但是在使用BeanUtils.copyProperties方法时出现异常。
查看此方法的源码发现,此方法会对源对象和目的对象做一次可读可写判断:

getPropertyUtils().isReadable(orig, name) && getPropertyUtils().isWriteable(dest, name)

如果操作的对象不符合JAVA BEAN规范,就会返回false.

Integer反序列化后遇到的比较问题

情景回放:
定义了一个不变量 Integer TYPE = 1;
使用Mybatis查询出一个整形对象TYPE_1,TYPE_1的值也是1, TYPE == TYPE_1 是返回true的。
当加入redis缓存,从缓存中获取TYPE_1,TYPE_1的值也是1,但是TYPE == TYPE_1返回false。


在说此问题之前,先看下面代码: