领导需要做一个大数据采集功能,使用thrift RPC 架构进行跨语言通信,先期只做服务端的接收报文,然后发往下游kafka,
因为考虑到需要附加控制模块,告警模块功能,综合考虑搭建一个web工程。
1、技术调研阶段写了个thrift server端,模拟客户端发送报文,压力测试,单机tps能达到一万三
2、既然要放到web工程中,需要将thrift 集成到spring中,这里我直接用spring配置中初始化方法init-method加载启动thrift server(后来遇到个问题,thirft server 是线程堵塞的,主线程启动会影响web服务的启动,所以init方法中单独开启了一个线程来启动),初始化消费线程一定要放在server.serve()方法之前执行,因为thrift server开启时时阻塞其他线程的运行(其实运行起来后面就不会影响了)
这也导致了我的习惯性思维认为后面出现的问题:队列消费线程不起效果,一直以为是thrift server 开启堵塞后面所有的线程运行,纠结了很久,后来找到了原因(队列是全局变量,中间有new了一个新对象,导致新队列一直没有数据,所以不会进行消费逻辑)
3、由于公司有很多环境,为了避免配置文件来回切换,需要在pom.xml中加配置来根据不同的环境打不同的包,但log4j是不用替换的,下图画红线部分忘记加了,导致编译的时候target下没有生成log4j文件,所以一直打不了日志,这边踩了一个坑!
4、报文收发解析功能写完后,本地启tomcat测试没问题,由于公司服务器用的jboss,所以开始用jboss启动测试,第一次用jboss启动过程中遇到很多问题:
一、jboss启动直接报错,
显示我的spring配置文件无法实例化加载bean,百度很多jboss相关的信息太少了,
后来无意中发现一条帖子,tomcat项目迁移到jboss后出现的问题,豁然开朗,又踩了两个坑:
jboss启动,web.xml加载spring配置文件需要绝对名称,不能:spring-*.xml,读取properties配置文件jboss启动识别
不了getClassLoader().getResource,要换通用方法
二、终于解决可以正常启动了,但是jboss控制台不打印详细日志,这可咋办嘞?查了相关资料,
原因是JBoss WildFly 8 自带了日志功能,其中包含了log4j。
解决办法:
第一步:在standalone\configuration\standalone.xml 中找到如下配置信息
<profile>
<subsystem xmlns="urn:jboss:domain:logging:2.0">
<console-handler name="CONSOLE">
<level name="INFO"/>
<formatter>
<named-formatter name="COLOR-PATTERN"/>
</formatter>
</console-handler>
在<subsystem xmlns="urn:jboss:domain:logging:2.0">下面添加 <use-deployment-logging-config value="false"/>
第二步:在Web应用下添加WEB-INF/classes/jboss-deployment-structure.xml 部署文件,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure
xmlns="urn:jboss:deployment-structure:1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<deployment>
<exclusions>
<module name="org.apache.log4j"></module>
</exclusions>
</deployment>
</jboss-deployment-structure>
重新启动JBoss WildFly 8,日志按WEB-INF/classes/log4j.properties 中自定义的格式输出了。
接着控制台打印信息中文乱码了,参考别人博客成功解决:
https://blog.csdn.net/nan_cheung/article/details/79337273
三、终于没问题了,开心的发布,本地发报文,kafka发送失败,拿别人的工具类单发居然成功,肯定是我的topic,key,msg三个参数有问题,debug一下...饿的各神啊...真想打死自己,配置文件居然多了个双引号。就此问题全部解决,感觉有点累,晚上不想加班,下班就跑路...