
java
文章平均质量分 67
项哥
热爱技术
展开
-
字体子集化实践探索
字体子集话subsetFont原创 2024-12-12 16:41:40 · 588 阅读 · 0 评论 -
camunda数据运维
camunda实例版本迁移原创 2023-02-08 20:50:56 · 255 阅读 · 0 评论 -
Cat导致内存不足原因分析
Cat导致内存不足原创 2022-12-22 19:44:35 · 786 阅读 · 1 评论 -
常见生产环境问题及排查方法
常见生产问题原创 2022-09-17 12:57:04 · 2283 阅读 · 0 评论 -
java版CRC16计算redis的key槽点
背景Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内,计算公式:slot=CRC16(key)&16383。redis的key如果是数字自增,例如group01, group02, group03是否会全部落在相邻的点槽点上,从而打到同一台redis机器上?结论java的hash算法,对group01, group02, group03这种得到的hash值是相邻的redis用的是CRC16算法,对group01, group02, group03原创 2022-05-26 17:34:08 · 1061 阅读 · 0 评论 -
Spring Devtools源码解析
看别人的源码解析自己不上手的话其实并没有真正掌握源码官方使用说明使用文档中文翻译源码在Spring boot项目中Spring Devtools 源码初步解析核心流程1.spring.factories中定义了很多需要被初始化的类,程序启动的时候会扫描spring.factories并注册事件监听者RestartApplicationListener# Application Initializersorg.springframework.context.ApplicationContext原创 2022-05-10 10:20:16 · 759 阅读 · 0 评论 -
Springloaded源码解析
spring-loaded Spring官方的热更新agentSpring Loaded allows you to add/modify/delete methods/fields/constructors评价使用asm进行字节增强,速度较快,但是字节增强的代码比较难懂,可以将增强后的类保存下来反编译查看增强的结果不依赖于DCEVM,可以直接在开发的jdk中使用自己实现的类更新监控,一个类只能监控一个文件,不能监控自定义目录,如果想要实现远程热部署不是很理想,没有使用nio系统文件监控,自己启原创 2022-05-08 17:49:51 · 1952 阅读 · 0 评论 -
HotswapAgent源码解析
HotwapAgentJava unlimited redefinition of classes at runtime使用方法按照github和官网说明操作即可, 依赖于DCEVM如果自定义监控外部文件,需要将hotswap-agent.properties添加到src/main/resources中,并且配置extraClasspath属性源码解析评价代码非常优雅,没有一个过长的类,每一个类源码都值得学习字节码操作使用的是javassit, 可以非常直观的在某个方法的前面或者后面插原创 2022-05-06 22:56:38 · 2572 阅读 · 5 评论 -
spring boot websocket服务当做跳板机实现远程jvm remote debug
功能本地IDE可以通过连接B端管理系统实现对远程线上java服务进行调试背景很多时候线上服务出现了故障,希望能够对线上服务器进行本地调试。jrdwp实现了这个功能,原理其实很简单:本地IDE(tcp连接)本地jrdwp client(用tcp协议和ide通信,websocket和远端nginx通信)远端ngiinx(代理websocket)远端jrdwp server (提供websocket服务,并且用tcp和远端java服务通信)远端java服务然而没有权限接触公司的ngin原创 2022-03-12 13:22:37 · 2392 阅读 · 0 评论 -
将thrift生成的对象转换为简洁json
thrift生成的对象输出为清洁版的json原创 2021-12-07 17:03:07 · 2272 阅读 · 0 评论 -
Spring懒加载妙用
开启 Spring 全局 bean 懒加载的好处可以加快启动速度,当服务依赖很多的时候,增速非常明显。服务启动时不用考虑依赖,不需要满足所有的依赖就可以启动服务建议 在 test, qa, dev 等环境酌情开启,在自己本机调试测试时可以只测试部分功能,只需要保证需要测试的功能依赖满足即可生产环境一般不建议开启本机单元测试的时候使用全局懒加载和 @mock 结合开启 Spring 全局 bean 懒加载的坏处屏蔽了启动时对 bean 的依赖检查,当 bean 不满足生成条件的时候需要等待原创 2021-09-29 12:10:49 · 819 阅读 · 0 评论 -
hive-jdbc的默认超时时间被mysql超时时间覆盖
现象hive-jdbc.2.1.1版本在循环遍历查询数据,并且同时处理发现偶尔会出现SocketException异常,推测异常是由于超时导致的,结果验证果然超时时间被设置为了mysql的30sError retrieving next rowjava.sql.SQLException: Error retrieving next row at org.apache.hive.jdbc.HiveQueryResultSet.next(HiveQueryResultSet.java:3原创 2021-07-13 20:51:30 · 5679 阅读 · 0 评论 -
LANG环境变量导致Ansj分词不生效
现象有一台生产环境Ansj分词词库没有生效,jar包一模一样,并且日志也已经将字典加载了排查先确定是否 jar 包有问题,拷贝一模一样的包,size 也一模一样,问题还是存在jdk 版本有差异,安装一模一样的 jdk 版本,问题还是存在export -p 查看不同机器的环境变量差异,发现分词出问题的机器 LANG=“C”,分词正常机器LANG=“en_US.UTF-8”,于是 export LANG="en_US.UTF-8" 再来重启程序,发现分词正常了,确定就是环境变量导致查看/etc/p原创 2021-07-13 10:43:13 · 187 阅读 · 0 评论 -
ThreadPoolExecutor核心线程数和RocketMQ消费线程调整
背景Rocketmq 消费者在高峰期希望手动减少消费线程数,通过DefaultMQPushConsumer.updateCorePoolSize方法可以调用内部的ThreadPoolExecutor.setCorePoolSize设置多线程核心线程数。那么是否能够通过调整参数动态调整Rocketmq消费者呢。结论和实现方案可以通过调整核心线程数减少RocketMQ 消费线程数先挂起消费者consumer.suspend()然后休眠至少1分钟以上,等任务全部消费完成,1分钟是基于Consume原创 2021-07-09 17:05:05 · 3548 阅读 · 0 评论 -
mongodb埋点监控的坑
背景公司中间件团队使用了 com.mongodb.event.CommandListener 来对mongodb 打点监控。当我们使用 RocketMQ 调用 mongodb 保存数据的时候没有看到任何异常产生。在我们将 RocketMQ 改用中间件代理,产生了大量的DuplicateKeyException日志,一度怀疑是否中间件的 RocketMQ 代理有问题, 分析源码没有。分析原因消费消息的时候,异常如果自己不捕获打印的话,会被ConsumeMessageConcurrentlyServi原创 2021-04-28 10:28:08 · 585 阅读 · 0 评论 -
IDEA 中 Thrift 生成的类引用异常问题解决
现象解决方案先编译整个工程mvn -DskipTests clean package将 thrift 生成的目录标记为 Mark Directory as --> Generated Sources Root如果做了上述步骤以后问题解决了,这一步可以不用进行由于 idea 默认的类大小是 2500(2.5m),导致无法导入包打开 idea 的 help->edit custom properties创建一个 idea.properties,追加:ide原创 2021-04-01 11:01:43 · 2351 阅读 · 1 评论 -
spring-cloud-netflix-hystrix的/acutor/hystrix.stream错误UT005023
错误现象UT005023: Exception handling request to /actuator/hystrix.streamgithub上的issue解决方案查看github代码发现在master分支上已经将这个问题修复,但是当前maven中央仓库最新jar包1.5.18中并没有修复。解决方案: 自己打一个jar包覆盖掉原来的jar包我是自己打了包一个1.5.19版本的jar包放到公司私有的maven仓库<dependency> <groupId>原创 2021-03-18 12:00:34 · 7210 阅读 · 0 评论 -
Groovy动态编译类存储及其使用
目的业务规则是动态变化的,使用Groovy动态脚本实现。1.0版本并发不高,每次都是动态编译解析2.0版本现象:并发量大的时候CPU使用率特别高, 所有的方法执行速度都变的很慢原因:动态编译对CPU性能要求较高解决方案:将每次编译的脚本缓存下来3.0版本现象:第一次加载的时候如果规则特别多,打开速度会很慢解决方案:方案1. 提前预热,确保规则都被编译保存在缓存中了方案2. 创建规则的时候就编译保存为.class文件,使用的时候直接加载远程目录的.class文件4.0版本待实现(业原创 2021-03-05 12:40:22 · 1860 阅读 · 3 评论 -
ES客户端由5.6.12升级到7.10
TransportClient替换为RestHighLevelClientSearchRequestBuilder替换为SearchSourceBuilder原来searchRequestBuilder的所有动作都需要去掉动词, 例如searchRequestBuild.addAggregation需要修改为searchSourceBuilder.aggregation,searchRequestBuild.setSize需要修改为searchSourceBuilder.size等等发起请求修改原原创 2021-02-25 18:09:30 · 869 阅读 · 3 评论 -
OutOfMemory自动重启程序
OutOfMemory以后程序已经假死,无法再提供服务,最好的做法是dump内存,发送警告,然后重启服务我的方案:利用at命令延迟启动但有一个问题,at最多支持分钟操作,也就是说要1分钟以后才能启动,我的业务允许接受1分钟的延迟,总比收到警告然后等到人工去启动要好一点。 -XX:OnOutOfMemoryError="at -f /data/deploy/start.sh now +1 minutes;kill -9 %p;"at命令的安装和启动yum -y install atsystemc原创 2021-01-14 12:23:37 · 1283 阅读 · 0 评论 -
Mybatis Plus使用笔记
mysql关键字在实体字段加上@TableFiled显示写出数据库字段,并且需要加一对反斜杠 /** * 来源 */ @TableField(value = "`from`") @ApiModelProperty(value = "来源") private String from;动态表名在PaginationInterceptor插件中可以实现动态表名,有两种方法从MetaObject对象中得到入参,官方demo没有介绍如何从MetaObject中得到入参来决定表名后缀原创 2020-08-16 11:08:09 · 911 阅读 · 0 评论 -
Ribbon使用笔记和问题
老的客户端是用服务端依赖swagger-codegen-maven-plugin在打包的时候自动生成的,服务接口调用本质上是用的restTemplate切换为微服务以后,只需要在restTemplate上面加一个@LoadBalanced注解即可根据服务名调用遇到的问题1.provider并发不足,会进入熔断短路状态:Hystrix circuit short-circuited and is OPENconsumer会一直重试,可能会让provider奔溃,所以consumer应该在provi.原创 2020-07-24 15:40:56 · 722 阅读 · 0 评论 -
Feign使用笔记和问题解决
Feign让客户端调用变得非常简单使用添加maven依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>增加注解@EnableFeignClients注意***@EnableFeignClients注解原创 2020-07-17 09:30:03 · 1551 阅读 · 2 评论 -
Jackson使用笔记
使用Mybatis-plus的JacksonTypeHandler无法反序列化List<Bean>模拟JacksonTypeHandler类写了自定义ListTypeHandler来解析,目前需要给每个List<Bean>都写一个继承自ListTypeHandler的ListBeanTypeHandlerListTypeHandler类如下:import com.baomidou.mybatisplus.core.toolkit.Assert;import com.baomi原创 2020-07-07 14:38:15 · 1361 阅读 · 0 评论 -
LAMP和SAML
老外用LAMP存储用户账号,SAML做权限认证,以前都没听说过,记录一下入门LAMP建议看博客LDAP概念和原理介绍Spring LDAP的使用,使用spring ldap非常简单SAML建议看博客SAML2.0, 有一个包括sp和idp的demo,demo在idea下运行找不到静态配置我在博客的下面有评论如何修改此外可以参考spring-boot-security-saml-samplespring-security-saml官方docjava-saml, 老外写的一个sp工具,最开始研原创 2020-07-01 09:38:59 · 154 阅读 · 0 评论 -
Spring boot问题及其解决
自定义WebMvcRegistrations无效现象:问题出现在一个由spring-mvc老工程改造成spring boot项目中,在Application.java类中通过@ImportResource(“classpath:applicationContext-*.xml”)把xml的配置实例化,下面的自定义webmvc注入器无效 @Bean public WebMvcReg...原创 2020-05-06 16:34:54 · 2164 阅读 · 0 评论 -
java特殊符号处理
java去掉特殊符号文章有很多,这里汇总一下1.利用guaua去掉所有不可见字符com.google.common.base.CharMatcher.INVISIBLE.removeFrom(str);2.需要对字符串做情感分析,只保留中文英文和常见符号即可String reg = "[^\\u4e00-\\u9fa5a-zA-Z .,\"?!:'。,!“‘]";str.replace...原创 2020-04-03 15:10:25 · 2392 阅读 · 0 评论 -
k-means聚类对评价内容进行归类
应用场景有很多评价内容,对评价内容进行聚类,得到每个类别的关键可以用python的scikit-learn或者mahout,得到聚类结果都只能作为参考,最终结果仍然用人工定义python方案1.准备足够多的的评论样本,最好1万+2.对每个评价内容用jieba分词,这一步最重要,自建特定行业词库分词效果最好3.scikit-learn的方法得到所有样本的tf-idf矩阵4.拟定一个聚类...原创 2019-08-08 18:19:20 · 3428 阅读 · 0 评论 -
Groovy学习笔记
Scala适用于需要高性能的多线程环境,Groovy适用于DSL、测试、快速开发等在脚本中解析脚本 evaluate(expression) Eval.me(expression) Eval.x(param1,expression) Eval.xy(param1,param2,expression) Eval.xyz(param1,param2,param3,expression) ...原创 2018-03-30 15:42:36 · 541 阅读 · 0 评论 -
Spring Cloud使用心得
spring cloud使用心得笔记原创 2017-01-06 20:42:46 · 3627 阅读 · 0 评论 -
Spring-boot快速开发
一键生成Spring-boot系统: jeecg-boot单元测试模板类package com;import lombok.extern.slf4j.Slf4j;import org.junit.FixMethodOrder;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners....原创 2019-06-20 16:09:16 · 407 阅读 · 0 评论 -
生成离线报告-java将白色背景透明和裁减掉白色背景部分
生成离线报告的一种方式用puppeteer(node服务)打开网页生成图片,然后将图片替换到PPT的模板中。有一个问题是生成的图片会有很多空白部分,所以要用java将白色背景透明化, 一种方式是将图片的白色背景透明,另一种方式是将图片的白色背景部分剪裁掉。PPT模板图片事先根据固定尺寸大小建好的,如果替换的图片大小不一致就可能导致图片拉伸变形最终采用生成离线报告的方案创建图片目录pup...原创 2019-05-10 15:00:13 · 808 阅读 · 0 评论 -
spring-boot工程打包成jar包如何启动执行一次任务后就退出
spring-boot工程打包成了jar包的服务如何在执行单次任务就结束?思路一: 先启动工程,再mvc调用一次请求执行结束再内部结束进程思路二: 工程启动完成执行完任务以后立马结束import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import or...原创 2019-04-25 15:43:21 · 1917 阅读 · 3 评论 -
Spring Boot集成kafka笔记
kafka官网 http://kafka.apache.org/quickstartKafkaOffsetMonitor 开源web管理界面spring-kafka当前稳定版本是1.2.0..RELEASE http://docs.spring.io/spring-kafka/docs/1.2.0.RELEASE/reference/html/_introduction.html ...原创 2017-04-18 19:09:18 · 23411 阅读 · 5 评论 -
HttpClient 发送 HTTP、HTTPS 请求的简单封装
原文地址:http://blog.youkuaiyun.com/happylee6688/article/details/47148227原文post请求我没有修改了,get按照post的写法请求https是失败的//import org.apache.commons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.ht转载 2016-06-06 15:40:56 · 3610 阅读 · 2 评论 -
HTTPS研究
https的研究笔记原创 2017-04-11 16:43:03 · 735 阅读 · 0 评论 -
Java调用Webservice
网上查找资料总结有以下实现方式1)使用命令生成接口和实体类,如wsimport -p . -keep http://localhost:8080/hello?wsdl,直接调取接口使用,但是生成了一大堆文件2)xfire,后续版本cxf,个人建议使用,兼容大多数3)axis,后续版本axis2,调用webservice感觉兼容性差,但是用来发布webservice感觉很方便,axis2原创 2017-03-13 10:44:31 · 597 阅读 · 0 评论 -
jclasslib,javaasist-修改.class字节码
修改字节码有jclasslib、javassist、 asm等jclasslib修改常量很简单,但是修改方法好像行不通javassist:修改方法特别简单,值得一试asm:听说要学习指令jclasslib的使用具体如何使用请参照原文:http://blog.youkuaiyun.com/hexin373/article/details/6669813github官方地址:http...原创 2017-03-01 13:51:27 · 4531 阅读 · 2 评论 -
Mybatis参数变量替换流程
记录mybatis参数变量替换流程原创 2016-12-20 09:10:10 · 7265 阅读 · 0 评论 -
软件开发中遇到的问题
记录软件开发中遇到的问题和错误原创 2016-05-31 16:41:35 · 3640 阅读 · 0 评论