自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

GAMELOFT9----纸上得来终觉浅,绝知此事要躬行

记性不好,这是一个有趣的灵魂写的文字

原创 虚拟数字键盘

虚拟数字键盘 背景 移动端的浏览器中,input元素的自动聚焦并弹起系统键盘很难做到统一,一是IOS系统下的浏览器,非真实的用户交互,是无法弹起系统键盘的,通过js模拟也不行。二是某些浏览器下,input的输入光标会没有,使得用户体验不佳。 目标 1、进入页面时就自动聚焦到input上...

2019-01-18 16:01:21 567 0

原创 简单好用的api mock工具

        在前后端人员的协作开发中,如果你是后端开发人员,想模拟前端调用,可以使用PostMan发送请求,如果是你是前端人员,可能需要使用一些js框架来拦截请求,模拟后台返回报文。如果你不熟悉这些框架,又懒得去学的话,这里推荐一个简单好用的api mock工具。   使用方法 1、下载工...

2018-08-10 11:14:13 6677 5

原创 基于layui2.x的通用后台管理系统

一、概述 之前的spring集成系列文章中spring集成shiro权限控制一文最后提到了通用的mvc框架和前后端分离方案。在准备前后端分离方案demo的时候,纠结于选择哪个前端框架。对于后端开发人员来说,Angular和Vue都过于专业化了,需要额外的精力去学习。这个时候刚好看到了lay...

2018-01-15 09:58:36 51178 74

原创 聊聊synchronized关键字

接触java并发编程,用得最早最多的大概就是这个synchronized关键字了,synchronized是基于jvm实现的,不同于juc包的实现。发现想要讲好synchronized,并不容易。这里权当作抛砖引玉了。 synchronized基本用法 synchronized关键字可用于修饰...

2020-04-21 22:03:17 61 0

原创 Mybatis插件机制探究及延伸思考

文章目录前言使用原理分析延伸思考1-关于plugin方法2-责任链?基于jdk动态代理的双向责任链总结 前言 Mybatis提供了插件机制,可以让我们介入到底层执行的一些流程,例如SQL执行前打印下SQL语句。这里的插件,在mybatis里面实际上是拦截器。在深入探究之前,先看看如何使用,然后再分...

2020-04-16 18:38:06 57 0

原创 利用JRebel进行远程热部署调试

一、背景 我的工作中有些页面调试十分麻烦,例如一个支付页面,调试遇到的难点就有: 1、工程依赖了Apollo,如果要本地调试,需要本地添加Apollo的相关Java参数。 2、进入到支付页面前需要对用户做OAUTH,有个回调地址需要在微信端配置,但是只能配一个地址。如果本地要能正...

2020-03-06 16:24:31 148 0

原创 RocketMQ Consumer如何获取并维护消费进度?

背景 Cosumer消费消息,一般是如下几个步骤:发送获取消息请求,查找消息,消息过滤,负载均衡,消息处理,回发确认。限于篇幅,这篇文章主要介绍Consumer是如何发送获取消息请求的,以及RocketMQ基于长轮询的推模式实现。由于以上几个步骤都是紧密相连的,可能会出现互相穿插。 从何处开始...

2020-01-21 11:43:49 402 0

原创 RocketMQ Consumer如何订阅消息的?

在配置Consumer的时候,通常会有这么一行代码: /** * 订阅指定topic下所有消息<br> * 注意:一个consumer对象可以订阅多个topic */ consumer.subscribe("test_url", &q...

2020-01-10 15:52:48 535 0

原创 RocketMQ如何构建ComsumerQueue的?

前言 RocketMQ的消息都是按照先来后到,顺序的存储在CommitLog中的,而消费者通常只关心某个Topic下的消息。顺序的查找CommitLog肯定是不现实的,我们可以构建一个索引文件,里面存放着某个Topic下面所有消息在CommitLog中的位置,这样消费者获取消息的时候,只需要先查...

2020-01-02 12:28:50 426 4

原创 Netty在RocketMQ中的应用----编解码

编解码 NettyEvent派发 连接管理 流量控制

2019-12-11 09:11:24 71 0

原创 关于pre换行的一点探究

背景 换行是很常见的需求,一般word-break搭配overflow属性就可以很轻松的实现,例如: <html lang="zh"><head> <style type="text/css"> .log_w...

2019-12-05 10:49:35 50 0

原创 避免360浏览器极速模式自动填充表单

问题 在表单里面有API密钥和证书密钥两个字段,刚好一个type=text,一个type=password,360以为是登录用户名和密码字段,进行了自动填充,如下所示: 解决方案 网上解决方案有很多,有的可行,有的不行。我试了好几种,现记录下成功的这一种。方法就是:将被自动填充的type...

2019-11-27 16:03:12 88 0

原创 Netty在RocketMQ中的应用----服务端

RocketMQ中角色有Producer、Comsumer、Broker和NameServer,它们之间的通讯是通过Netty实现的。在之前的文章RocketMQ是如何通讯的?中,对RocketMQt通讯进行了一些介绍,但是底层Netty的细节涉及的比较少,这一篇将作为其中的一个补充。 服务端启...

2019-11-06 15:52:19 121 0

原创 Netty在RocketMQ中的应用----客户端

RocketMQ中角色有Producer、Comsumer、Broker和NameServer,它们之间的通讯是通过Netty实现的。在之前的文章RocketMQ是如何通讯的?中,对RocketMQt通讯进行了一些介绍,但是底层Netty的细节涉及的比较少,这一篇将作为一个补充。 Netty客户...

2019-11-06 10:41:27 278 1

原创 微信支付宝页面点击返回后关闭

需求背景 在支付完成页面后,如果用户点击返回按钮,会返回到继续支付的页面。既然已经完成支付了,那么在用户点击返回按钮之后,就可以关闭页面了,这才是合理的做法。所以我们的目的就是,监听用户的页面返回事件,然后关闭页面。 监听返回事件 js里面有一个popstate事件,当页面返回时会触发这样一...

2019-10-30 15:51:32 112 0

原创 window.name跨域通讯小坑一记

工作中有这么一个需求,在支付完成之后,延迟3秒跳转到商户的广告页面。在广告页面通过返回按钮,可以再次返回到支付完成的详情页面,但此时延迟3秒后不会再次跳转到商户广告页面。 很明显,需要存一个标记,表示是否已经跳转过了。当时觉得window.name应该就可以胜任这个任务。 window.nam...

2019-09-17 15:51:30 79 0

原创 RocketMQ消息存储结构简介--CommitLog

RocketMQ消息存储是整个系统的核心,直接决定着吞吐性能和高可用性。RocketMQ存储消息并没有借助oracle、mysql等关系型数据库,而是直接操作文件。借助java NIO的力量,使得I/O性能十分高。当消息来的时候,顺序写入CommitLog。为了Consumer消费消息的时候,能够...

2019-09-09 15:25:33 741 0

原创 RocketMQ发送消息如何选择消息队列?

Producer发送消息的主要流程是验证消息---->查找Topic路由---->选择消息队列—>发送消息。验证消息没什么好说的,很简单。Topic路由的获取和保存、发送消息,之前的文章都有部分涉及,就不再赘述。这里我们对消息队列的选择做一个简单的展开。 首先,要澄清一个误会。...

2019-09-04 15:40:42 429 0

原创 ByteBuffer介绍

为什么会在RocketMQ系列里面参杂一篇ByteBuffer的文章呢?因为RocketMQ存储消息,是存储在文件中的,而且刚好使用的是ByteBuffer。这个属于Java NIO的内容,用到的比较少,如果像我一样没有相关的知识做铺垫,强行看RocketMQ消息存储相关的代码会比较头疼。为了减少...

2019-08-30 15:25:39 229 0

原创 Producer如何获取Topic路由信息

Producer要发送Message,肯定需要先知道Topic路由信息,这样才能找到提供Topic服务的Broker master结点并发送Message。之前的文章Topic是如何创建和保存的,我们知道了Topic在Broker保存了一份,然后Broker定期向NameSrv注册Broker信息...

2019-08-27 11:41:48 188 0

原创 RocketMQ如何维持心跳

首先放上RocketMQ网络结构图,如下所示: Producer与NameSrv随机建立长连接,定期从NameSrv获取topic路由信息。然后Producer还与Broker的Master结点建立长连接,用于发送消息。此外Producer还与Master维持了一个心跳。 Conumser...

2019-08-26 19:54:37 837 0

原创 RocketMQ是如何通讯的?

前言 RocketMQ作为一个分布式消息中间件,通讯肯定是必不可少的。参与通讯的角色包括:NameSrv,Broker,Producer和Consumer,另外Broker Master和Slave结点之间也有通讯。RocketMQ的通讯基于Netty,在其基础上做了一层简单的封装。大致的通讯架...

2019-08-23 16:51:56 361 0

原创 RocketMQ Topic是如何注册和保存的

Topic Topic用于标识一些消息的分类,例如订单消息,通知消息。RocketMQ Producer发送消息,Consumer接收消息,Topic都是绕不过去的话题,消息就是围绕Topic组织的。Topic存储在NameSrv,Producer从NameSrv获取Topic的路由信息,找到b...

2019-08-19 11:15:21 691 0

原创 CentOS 7使用RocketMQ mqadmin命令工具报错

问题描述 我在CentOS 7上安装好RocketMQ之后,使用mqadmin创建topic,命令如下: ./mqadmin updateTopic -n 192.168.77.129:9876 -c DefaultCluster -t test 然后报错信息如下: org.apache.roc...

2019-08-13 10:42:12 546 0

原创 策略模式与消除If-else

策略模式 策略模式是很常见的一种设计模式,将具体的算法封装起来,可以平等替换,避免客户端过多的设计业务逻辑。网上有很多讲策略模式的文章,都很好。但也有一些文章强行将策略模式、状态模式和消除if-else联系起来,这是不对的。策略模式只是封装了各自算法逻辑,使其可以自由替换,如何选择仍然需要客户端...

2019-08-09 16:26:16 325 0

原创 flex布局导致ellispsis失效

问题描述 之前的文本超过长度省略文章中,讲到了如何通过CSS控制文本超过长度省略。但是在flex布局中,ellispis却失效了。举例说明: 文档结构如下: <div class="container"> <div class="div_1&...

2019-08-08 19:14:43 180 0

原创 如何判断ellispsis生效了

主要内容 要让文本超过长度后,截取显示并附上省略号,可以通过如下的css代码实现: text-overflow: ellipsis; overflow: hidden; white-space: nowrap; width:100px; 有时候,我们需要根据文本是否省略做一些别的事情,例...

2019-08-07 16:42:52 49 0

原创 jsp页面禁用缓存

A页面跳转到B页面后,按返回按钮,返回页面A后并没有继续处理,而是卡住了,原因是jsp页面被浏览器缓存了。因此需要禁用Jsp页面缓存。 正确的做法: <%@ page contentType="text/html;charset=UTF-8" %> <% ...

2019-08-02 10:32:18 88 0

原创 Dubbo-Monitor安装后无法访问

安装步骤说明 Dubbo-Monitor安装比较简单,下载好包之后,解压,进入到conf目录,编辑dubbo.properties文件: dubbo.container=log4j,spring,registry,jetty dubbo.application.name=simple-monito...

2019-07-29 19:01:11 127 0

原创 Apollo加载配置小坑一记

公司的配置中心使用的是携程的Apollo配置中心,现在基本上所有的配置文件都迁移到了Apollo里面。Apollo的使用非常方便,实时生效,不需要重启应用。但是有个缺点,就是对配置没有进行校验,如果配置格式或者类型有问题的话,就会抛异常。 鉴于此,一些逻辑上的校验就得自己做。例如对下载的账单要进行...

2019-07-12 16:15:20 837 2

原创 实现输入框自带清除按钮

输入框自带清除按钮是很常见的需求了,网上有很多方案,最基础的是原生实现input和清除按钮,然后绑定一大堆事件,此种方案非常原始,而且复用性极差。稍微好点的方案有基于bootstrap和jQuery的,将input和清除按钮集成起来,但样式依赖bootstrap,加重了文件引入数,而且很容易有jQ...

2019-05-20 19:12:59 311 0

原创 LockSupport原理

LockSupport是一个非常基础而重要的类,它为java并发包里的锁和同步类提供了线程阻塞原语。没有它也就没有AQS,更没有上层的各类锁实现(例如ReentrantLock),同步器(例如CountdownLatch),阻塞队列等。 LockSupport提供的都是静态方法,例如: publ...

2019-05-08 17:35:59 292 0

原创 AtomicBoolean原理

AtomicBoolean是一个原子boolen类,用于高并发场景下的标记,例如某个只需初始化一次的服务: public class SomeService { private String name; private AtomicBoolean initialized ...

2019-05-07 15:34:23 412 0

原创 关于LongAdder的一点思考

LongAdder是jdk 1.8引入的一个类,宣称比AtomiLong更高效。它内部有一个基本数base和一个cell数组,在高并发的情况下各个线程将值存放在了数组中,在低并发的情况下直接在一个base数上做计算,取值的时候把基本数和cell数组中的值做累加返回。 其实看到取值的时候我是懵的,...

2019-05-06 10:31:03 141 0

原创 手写一个简单的线程池

多线程的引入,可以大大增强系统的并发能力,但是创建一个线程的开销是很大的,频繁的创建和销毁线程反而使得我们的系统在高并发时性能急剧下降。如果线程用完了,先不着急销毁,有下个任务来了,再重复利用,是不是就好多了。线程池就是这样做的,当一个新任务到来的时候,线程池会找到一个空闲的线程来执行任务。如果线...

2019-04-25 19:29:53 856 2

原创 Quartz定时任务过期处理策略

由于某种原因,例如应用停掉,导致定时任务错过了本该执行的时间点,这就是定时任务过期。对于过期的定时任务,我们需要基于某种策略对其进行处理。 过期策略 在Trigger接口中定义了两种过期策略, public static final int MISFIRE_INSTRUCTION_SMAR...

2019-04-23 16:46:02 1383 0

原创 Quartz Trigger状态转换

在Quartz的框架中,Trigger可能是最重要的一个对象了。定时任务的调度,触发,都是通过对Trigger的操作来实现的。Quartz的所有表里面,光Trigger相关的表就占了一大半,从这一点也可以看出Trigger的重要地位。下面是2.21版本中的数据表: Trigger按其类型不同,分...

2019-04-22 16:47:33 1402 0

原创 Quartz集群原理

传统的Quartz集群是基于数据库实现的,所有的quartz应用节点彼此并没有通信机制。09年terracotta收购Quartz后,才有基于terracotta的分布式的Quartz集群。由于工作中大部分用到的还是基于数据库的集群,这里仅分析基于数据库实现的Quartz集群。 配置集群 Quar...

2019-04-22 11:41:23 103 0

原创 用JavaMelody监控Quartz

JavaMelody是一个优秀的监控工具,它可以方便的监控我们的应用,并提供了非常直观的图表展示。下面就用它来监控我的定时任务框架Quartz。 1、添加依赖 <!--javamelody--> <dependency> <groupId>n...

2019-04-17 17:23:19 300 0

原创 Quartz Job是如何执行的

在前一篇Quartz是如何到期触发定时任务的我们通过对源码的分析,了解的Quartz的触发机制。接下来的这一篇,我们分析Job是如何执行的。 for (int i = 0; i < bndles.size(); i++) { TriggerFiredResult result =...

2019-04-16 15:08:30 1648 0

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