自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 SpringBoot使用WebSocket实现服务端推送--集群实现(2)

书接上文,本文介绍了一种实现集群管理和消息传送方式。在集群模式情况下,一般是Nginx反向代理到多台Tomcat或者SLB代理到多台Tomcat的方式,怎么实现给某个人推送消息?比如WebSocket1连接到Tomcat1,但是在Tomcat2需要给WebSocket1发送消息,怎么办?一般的想法是像httpsession的集群处理方式一样,利用一个中间件Redis来保存session即可。但...

2019-07-27 19:50:19 3755

原创 cron(一)根据cron表达式计算每天有哪些执行时刻

参见http://gitee.com/xxssyyyyssxx/cron-hms 我们项目中一般会有很多的定时任务,我们怎么知道这些定时任务是否正常执行了呢?一个基本的想法是,在任务执行前保存一条记录,任务执行后更新此记录的结束时间和标记,异常的时候记录失败标记和异常信息,然后管理员每天登录的时候检查每个任务是否正常执行。如果记录与设置的执行时刻点匹配,说明任务正常执行...

2019-07-27 19:50:10 5272

原创 cron(二)根据cron表达式计算给定时间的下一个执行时间

参见http://gitee.com/xxssyyyyssxx/cron-hms书接上一篇,根据cron表达式切割计算每个域的执行点,可以计算出给定时间的下一个执行时间。思路是:1、找到所有时分秒的组合并按照时分秒排序2、给定的时分秒在以上集合之前、之后处理3、给定时时分秒在以上集合中找到一个最小的位置4、day+1循环直到找到满足月、星期的那一天public class ...

2019-07-27 19:49:56 4015 3

原创 一个通用的Json解析框架接口设计(一)-接口设计

我们项目中可能会用到许多的json框架,Fastjson、jackson、Gson、orgjson、json-lib,其实现方式各不相同,接口Api就不一样,我们想换一个json框架改动的地方就会很多。参考SLF4J的思想,我统一了json框架的调用方式。https://gitee.com/xxssyyyyssxx/json-common首先定义了顶层的json接口,可以代表jsonobj...

2019-07-27 19:48:24 3400

原创 一个通用的Json解析框架接口设计(二)- 实现

https://gitee.com/xxssyyyyssxx/Json-fastjsonhttps://gitee.com/xxssyyyyssxx/Json-orgJsonhttps://gitee.com/xxssyyyyssxx/Json-Gsonhttps://gitee.com/xxssyyyyssxx/Json-Jacksonhttps://gitee.com/xxss...

2019-07-27 19:48:00 963 1

原创 一个http请求工具类的接口化(接口设计)

https://gitee.com/xxssyyyyssxx/httpclienthttps://gitee.com/xxssyyyyssxx/httpclient-interfacing模块化处理之后的,更清晰我们项目中可能会使用很多的http请求的库,比如URLConnection、ApacheClient、OkHttp库等。每个库的操作方式都不一样,这是一个巨大的困扰。如果需要换...

2019-07-27 19:46:24 1605

原创 一个http请求工具类的接口化(多种实现)

针对上一篇文章的接口设计,提供了三种实现URLConnection、ApacheHttpClient、OkHttp3。现给出三种实现的继承树。HTTPURLConnectionApacheHttpOkHttp3首先每种实现都需要实现模板方法HttpTemplate。URLConnection:package cn.zytx.common.http.base...

2019-07-27 19:45:58 2799 4

原创 SpringBoot使用WebSocket实现服务端推送---单机实现(1)

[![star](https://gitee.com/xxssyyyyssxx/websocket-springboot-starter/badge/star.svg?theme=dark)](https://gitee.com/xxssyyyyssxx/websocket-springboot-starter/stargazers)最近开发中需要实现服务端的推送,经过一段时间的资料查询最终锁...

2018-10-14 15:07:47 816

原创 一个处理SQL语句多条件添加的工具类

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。我们写SQL语句的时候,有时候查询条件非常多,并且可能有可能没有,如果手动拼写,可能由于疏忽少写空格,关键字等,并且添加条件的时候可能需要写大量的判断语句,非常不好。我写了一个工具类,很适合处理这种情况。源码如下。i...

2018-04-28 16:19:34 1098 1

原创 wait、notify、join和保护性暂停模式

wait和notify是Object的方法,前者用于让运行的线程阻塞进入TIMED_WAITING模式,后者用于通知相同锁对象阻塞的线程继续运行。一般地使用模式为:Object lock = new Object();function1(){ syncronized(lock){ while(条件不满足){ lock.wait(); } TODO other things... }}function2(

2020-07-18 21:46:15 53

原创 关于nginx的重定向问题

nginx作为反向代理服务器的时候,如果端口设置的特殊,在重定向的时候可能遇到问题。但是都可以通过设置Host来解决,可以重定向到你想要的任何位置(ip和端口)。proxy_set_header Host $host:$server_port;nginx使用alias命令进行静态页面转发的时候,如果是.../xxxx1/xxxx2这种会被重定向到.../xxxx1/xxxx2/,nginx运行在8080,防火墙出口是80,重定向的时候就出现问题。它重定向到了nginx的8080端口。因为

2020-06-04 19:38:02 166

原创 复制目录初探

复制一个目录,这个目录如果有很多子项,可能会耗费大量的时间,并且不可控(你不知道复制了哪些,还剩哪些)。以下的脚本解决这个问题,每复制一个文件或者文件夹,就记录下来,这样如果一次没有复制完,还可以重启脚本继续复制。SRC=/data/temp/srcDEST=/data/tmp/destLOGFILE=/data/script/cplog.logEXISTS=`cat $LOGFILE`function cpfileordir(){ tmpdir=$1 if [[ "$EXISTS

2020-05-25 10:26:26 57

原创 数据库+缓存的正确姿势

项目规模或者并发访问量较小的时候,使用数据库就可以满足查询的需要。当并发量逐渐增大的时候,数据库可能就扛不住访问压力了。这个时候可以加入缓存提高查询速度,但是加入缓存是一项比较有技术含量的工作,如果姿势不对,可能造成数据不一致或者不起作用的问题。一般的套路都是,先查缓存,缓存中没有则去查数据库,将数据放入缓存并返回。伪代码就是: public Object get(Object param){ Object o = getFromCache(param); i

2020-05-13 10:57:06 101

原创 List遍历的正确方式

对于List一般有两种实现方式,一种基于数组,如ArrayList;一种基于链表,如LinkedList。查看其类定义,有一个非常明显的区别,就是ArrayList实现了一个特殊的接口RandomAccess。该接口是一个标记接口,指示集合类是否具备随机访问能力,什么是随机访问能力呢,就是get(i)的时间复杂度。如果实现了RandomAccess接口,get(i)的时间复杂度一般就很小,遍历的时...

2020-04-17 10:27:57 68

转载 使用logrotate来管理日志

日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题。除此之外,处理一个单个的庞大日志文件也常常是件十分棘手的事。logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/foo日志文...

2020-04-07 10:52:42 111

原创 Redhat安装mysql-5.7.29.tar.gz

安装rpm包方便但是不好修改配置文件,一般修改了启动有问题,所以采用安装tar.gz的方式。1.查看以前的mysql# rpm -qa|grep -i mysql2.如果有先删除# rpm -ev mysql-community-libs-5.7.26-1.el6.x86_64 --nodeps# rpm -ev mysql-community-server-5.7.26-1.el6.x...

2020-04-02 11:33:53 159

原创 tomcat8.0.30升级为8.5.51注意事项

最近由于爆发了Apache Tomcat AJP协议任意文件下载和任意文件包含可导致远程命令执行的漏洞,tomcat8系列的需要升级至8.5.51.升级注意几个问题:bin/catalina.sh我们是通过在执行环境配置env来区别不同环境的,所以需要在bin/catalina.sh中添加-Denv=prod代表正式环境。另外性能优化相关的都在这个文件中配置。从原8.0.30复制过来...

2020-02-27 13:55:10 3966 7

原创 使用CORS解决跨域问题

后端接口和前端分离的时候,很多情况下会遇到跨域问题。这是浏览器的同源策略导致的,同源策略是为了Web安全提出的,说的是两个不同源的网址默认是不能请求对方的接口的。不同源包含:协议(http|https)、ip/域名、端口之一不同就是不同源。不同源的网页请求接口都要遵循浏览器的同源策略。 解决跨域问题有两种方案,都需要服务端支持才可以。 一种是JSON...

2020-02-21 17:58:25 262

原创 关于Java.clone方法和Cloneable接口

关于Cloneable和clone方法的认识: 1.Cloneable接口是一个标记接口,没有clone方法,clone方法是在Object类中的,并且是protected的 2.一般地需要实现Cloneable和重写clone方法,并将修饰符改为public 3.如果没有实现Cloneable接口,调用clone方法就会抛出CloneNotSupportedException异常...

2020-02-17 21:11:56 64

原创 切面定义可配置化及重复注解

项目https://gitee.com/xxssyyyyssxx/validation在这两个方面进行了探讨。1.切面自定义一般地,切面都是这样定义的,由于@Pointcut无法通过${}注入,所以这个类很难框架化,都需要在业务方法中写,比较麻烦,下面记录一种可以配置此值的方式。@Aspect@Componentclass ParamValidateAspect implemen...

2020-02-10 21:08:54 157

原创 Linux swap

1.Swap在Linux和UNIX系统上都有一个SWAP分区,该分区,例似于于Windows系统上的虚拟内存。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,临时转移到SWAP上,供当前运行的程序提供物理内存空间,当程序需要再访问被转移到了SWAP空间上的数据时,再从SWAP中恢复到物理内存中。从此工作原理不难看出来,SWAP要有,但是尽量不要使用,使用了就会发生内存...

2019-12-24 16:18:24 50

原创 利用JdbcTemplate实现mysql批量保存

mysql批量保存或者更新可以极大地减少网络调用,提升性能。批量保存是将多条数据组装成 insert into xxx (xx,yy) values (xx1,yy1),(xx2,yy2)的方式。批量更新是将多条数据组装成update xx set t=t1,g=g1 where s1=1;update xx set t=t2,g=g2 where s1=2;的方式。JdbcTemp...

2019-12-23 18:27:02 151

原创 关于树形结构、扁平化、子级的通用做法

树形结构是典型的递归结构,常见于代码中,但是代码比较通用,所以记之备忘。实现方式有多种,此仅仅是一种比较好理解的方式,不适合于数据量太大的情况,如果数据量太大,请使用分批次查询的方式。形成一个树形结构大部分情况下是基于一张表,然后通过一个字段parent_id指向其父级id即可。CREATE TABLE `some_model` ( `id` int(11) NOT NULL AUT...

2019-12-12 17:14:40 166

原创 如何优雅地保证程序不退出?

首先提两个问题:springboot应用程序只在main方法中调用SpringApplication.run(xx),程序就运行起来了,他为什么能保持住不退出? quartz程序为什么能一直运行不退出?我们为了让程序保持不退出,一般使用Thread.sleep方法,或者使用一个while无限循环,但是总感觉不太优雅。参考springboot和tomcat的源码写了一个小工具,可以优雅地实现...

2019-11-01 09:39:55 156

原创 如果mysql的自增主键达到最大值会发生什么?

如果mysql的自增主键达到最大值会发生什么?比如主键类型设为int,其最大值为:2147483647,如果此时我们再往其中写入数据,就会发生异常:Duplicate entry '2147483647' for key 'PRIMARY'也即写不进去了。如果发生了这种情况,应该是设计架构就有问题。并且当数据达到千万上亿级别,查询将变得奇慢无比,也是不可取的。在设计架构...

2019-10-25 09:56:57 1527 2

原创 NFS网络的搭建和迁移

以前的NFS服务器在192.168.0.50${oldserverip},在新机器192.168.0.100${newserverip}上安装NFS服务,迁移数据到新主机上,然后启动NFS服务,其他的客户端全部重新挂载到新的NFS网络。保持挂载目录和以前完全一样:以前的服务端挂载点/data/nfs ${dir_s},为了保持一致,新的服务端挂载点设置一样/data/nfs ${...

2019-10-18 11:55:49 70

原创 vsftpd 安装过程记录

使用yum安装,执行安装命令:yum install -y vsftpd安装FTP服务器创建FTP用户和FTP的目录,并修改FTP目录的权限给FTP用户创建用户:重置密码:创建FTP目录:授权FTP目录权限给camera用户:修改目录用户组执行权限:进入/etc/vsftpd目录下vi编辑user_list白名单文件,是允许访问 FTP 服务器的用户列表只允许c...

2019-10-11 17:21:25 58

原创 记录定时任务迁移xxl-job的过程和理解

一般定时任务使用的是基于quartz或者spring-scheduler的,能够满足大部分的开发需求。但是像手动执行一次,执行情况监测,进程阻塞停止等维护需求就显得无能为力了。无意间在gitee.com上发现了一个很好满足以上需求的项目,来自许雪里开源的一个轻量级分布式任务调度平台xxl-job。gitee地址:https://gitee.com/xuxueli0323/xxl-...

2019-10-08 16:14:19 572

原创 关于类初始化的一个诡异问题

圣思园张龙老师关于类加载器的一个例子。这个打印的是1,1这个打印的是1,0造成以上的区别的原因就在于:类加载的时候先准备(静态变量赋默认值),然后初始化(赋值或者静态代码块),实例化。类的初始化只有在以下六种情况(主动使用)才会发生:创建类的实例,并且不影响子类的初始化 访问某个类或者接口的静态变量或者赋值 访问类的静态方法 反射,比如Class.fo...

2019-09-29 15:19:06 47

原创 服务端参数校验(二):SpringMVC项目的参数校验

项目参见:https://gitee.com/xxssyyyyssxx/validationcompile "top.jfunc.validation:validation-core:1.0.1"compile "top.jfunc.validation:validation-spring:1.0.1"上文提供了参数校验工具,但是如果我们把参数校验跟正常业务逻辑放一起,势必会严重影...

2019-09-28 19:25:17 45

原创 服务端参数校验(一):校验工具

项目参见:https://gitee.com/xxssyyyyssxx/validationcompile "top.jfunc.validation:validation-core:1.0.1"compile "top.jfunc.validation:validation-spring:1.0.1"all input is evil!!服务端参数校验是保证数据一致性和避免脏...

2019-09-28 19:10:44 146

原创 基于Jenkins+Git+Gradle实现自动打包部署

下载地址:https://jenkins.io/zh/download/jenkins依赖Java,所以首先配置好java环境。建议下载 xxx.war,使用java -jar的方式来启动,其中java -jar可以写到脚本中,做到一键启动。jenkins的默认配置和工作目录运行在~/.jenkins目录下,可以通过设置环境变量 JENKINS_HOME 来改变。jenkins的默认运...

2019-09-18 10:18:51 1433 1

转载 POI操作ppt,合并,转图片

引入POIcompile group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.0' compile group: 'batik', name: 'batik-bridge', version: '1.6-1' compile group: 'org.apache.xmlgraphics', name: 'batik-a...

2019-09-11 10:19:57 484

翻译 ElasticSearch初步学习

本文来自 《Elasticsearch: 权威指南》https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.htmlElasticSearch安装与基本使用安装去下载版本https://www.elastic.co/downloads/elasticsearch解压之后cd elasticse...

2019-09-06 17:30:24 90

原创 Nginx获取自定义header

想要获取自定义header,必须开启下划线支持 underscores_in_headers on;可以配置在http或者server中。参考 http://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers。因为默认Nginx是不支持下划线的,貌似是http协议的问题,Apache同样有这个问题。开启...

2019-09-04 17:43:32 965

原创 通过Ipv6连接数据库的几项注意

0.首先主机【包括客户机和服务器】要支持ipv6 ping6 -I eth0 IPV6_ADDRESS 可以判断连通性 由于在ping本地的ipv6地址时,需要指定一个用来发送数据包的网络界面,所以需要添加-I参数1.mysql监听IPV6 配置文件配置 bind_address = :: [或者IPV6地址] 或者不绑定就可以监听v4和v6 n...

2019-08-29 09:03:51 480

原创 关于mysql的delete和主从同步问题

mysql的delete并不会真正删除磁盘空间,而只是标记相应的区域,在合适的时候还可以再利用。如果要真正腾出磁盘空间,还必须使用optimize table xxx进行磁盘碎片处理,但是这个命令会在相应的库下产生一个很大的#sql-xxx文件(增长速度特别快,根据清理的表的大小),所以不能等磁盘已经快满了才想起来清理,正所谓天晴修屋顶。optimize命令会锁表,一般根据table的增长速度和删...

2019-08-09 09:46:29 692

原创 Base64的编解码

Base64编码是将字节数组编码为可以打印的字符数组,解码是将Base64的字符数组还原为原字节数组。1.8之前,我们一般可以使用 sun.misc.BASE64Encoder和sun.misc.BASE64Decoder来进行Base64的编解码,但是这个API是sun公司的专用API,可能在未来发行版中删除,一般在IDE中都有警告或者报错,编译的时候也会警告。所以我们一般还会使用apache...

2019-07-31 11:35:14 237

转载 css的3种布局方式

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。1.文档流布局方式,这是最基本的布局方式,就是按照文档顺序一个一个地显示,块元素独占一行,内联元素共享一行。2.浮动布局方式,某个元素浮动之后,其后面的元素就当其不存在而占用其原来的地方,按照原来文档流布局方式布局。...

2019-07-27 20:01:24 4209 2

转载 JDBC:大数据量插入的三种方法比较

测试的会后使用Oracle,MySQL效果不是很明显向Oracle 的 customers 数据表中插入 10 万条记录测试如何插入, 用时最短.@Test public void testBatch(){ Connection connection = null; PreparedStatement preparedStatement = ...

2019-07-27 20:01:17 5592 1

提示
确定要删除当前文章?
取消 删除