<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[作草分茶]]></title><description><![CDATA[Java 学习者的笔记及分享]]></description><link>https://blog.youkuaiyun.com/JonKee</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; JonKee]]></copyright><item><title><![CDATA[探索java中复杂的时区]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/133266693</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/133266693</guid><author>JonKee</author><pubDate>Mon, 25 Sep 2023 09:32:11 +0800</pubDate><description><![CDATA[Java 中的时区到底是什么东西，Spring 时间格式化怎么用，本文告诉你]]></description><category></category></item><item><title><![CDATA[Mybatis Plus 中的流式查询]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/119935265</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/119935265</guid><author>JonKee</author><pubDate>Thu, 26 Aug 2021 16:50:29 +0800</pubDate><description><![CDATA[mybatis plus 中自定义如下接口，就可以实现流式查询，mybatis 中同样适用。
@Select("select * from t_xxx t ${ew.customSqlSegment}")
@Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = 1000)
@ResultType(ClearReconDiffAbnormalDO.class)
void listByStream(@Param(Constants.WRA]]></description><category></category></item><item><title><![CDATA[Mybatis Plus 自定义批量更新和插入方法]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/119772797</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/119772797</guid><author>JonKee</author><pubDate>Wed, 18 Aug 2021 09:30:53 +0800</pubDate><description><![CDATA[定义方法
@Slf4j
public class InsertBatchMethod extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class&lt;?&gt; mapperClass, Class&lt;?&gt; modelClass, TableInfo tableInfo) {
        final String sql = "&lt;script&gt;inser]]></description><category></category></item><item><title><![CDATA[ES 实现自动补全功能]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/115421810</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/115421810</guid><author>JonKee</author><pubDate>Sat, 03 Apr 2021 22:11:09 +0800</pubDate><description><![CDATA[新建索引
PUT /hot_search_index
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text",
        "analyzer": "ik_max_word", 
        "fields": {
          "keyword":{
            "type":"completion"
          }
        }
      }
    }
  }
}]]></description><category></category></item><item><title><![CDATA[Java 网络编程的演进史和 epoll]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/114070570</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/114070570</guid><author>JonKee</author><pubDate>Thu, 25 Feb 2021 11:45:04 +0800</pubDate><description><![CDATA[BIO
public class BioServer {
    private static ExecutorService executorService = Executors.newFixedThreadPool(8);

    public static void main(String[] args) throws IOException {
        // 绑定端口，启动服务器
        ServerSocket serverSocket = new ServerSocket(9]]></description><category></category></item><item><title><![CDATA[Netty 自定义协议实战]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/113779115</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/113779115</guid><author>JonKee</author><pubDate>Wed, 10 Feb 2021 09:51:25 +0800</pubDate><description><![CDATA[Netty 自定义协议实战

依赖
&lt;dependency&gt;
  &lt;groupId&gt;io.netty&lt;/groupId&gt;
  &lt;artifactId&gt;netty-all&lt;/artifactId&gt;
  &lt;version&gt;4.1.50.Final&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;com.caucho&lt;/groupId&gt;]]></description><category></category></item><item><title><![CDATA[Verifier 简单的 Java 校验工具]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/112025727</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/112025727</guid><author>JonKee</author><pubDate>Thu, 31 Dec 2020 16:31:59 +0800</pubDate><description><![CDATA[verifier
自己写的开源的、自由简单的 Java 校验工具，支持代码编写和注解方式，支持 Springboot 集成。
引入
&lt;dependency&gt;
  &lt;groupId&gt;online.qiqiang&lt;/groupId&gt;
  &lt;artifactId&gt;verifier-spring-boot-starter&lt;/artifactId&gt;
  &lt;version&gt;1.1.7-RELEASE&lt;/version&gt;
&lt;/dep]]></description><category></category></item><item><title><![CDATA[基于 Netty 纯手写 RPC 框架]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/109508284</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/109508284</guid><author>JonKee</author><pubDate>Thu, 05 Nov 2020 11:08:36 +0800</pubDate><description><![CDATA[最近为了复习 netty，纯手写了一套 RPC 框架，项目地址 qingcha-rpc
项目介绍
本项目是一个基于 netty 的 rpc 框架，可以使用纯 java 编程或者跟 SpringBoot 集成。
本项目纯属练手项目，未经测试和生产使用，谨慎使用！欢迎交流。
使用介绍
java 方式
Server 端


引入依赖
&lt;dependency&gt;
  &lt;groupId&gt;com.qingcha.rpc&lt;/groupId&gt;
  &lt;artifactId&gt;qin]]></description><category></category></item><item><title><![CDATA[AQS 详解之独占锁]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/109363311</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/109363311</guid><author>JonKee</author><pubDate>Thu, 29 Oct 2020 16:34:19 +0800</pubDate><description><![CDATA[本文以ReentrantLock的非公平锁图解 AQS 独占锁加解锁过程。
前置知识了解
static final class Node {
    /** 标记为共享节点 */
    static final Node SHARED = new Node();
    /** 标记为独占节点 */
    static final Node EXCLUSIVE = null;
    /** 等待状态值，表示被取消 */
    static final int CANCELLED =  1;
    ]]></description><category></category></item><item><title><![CDATA[Linux 下通用 jar 启动脚本]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/109077090</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/109077090</guid><author>JonKee</author><pubDate>Wed, 14 Oct 2020 16:22:26 +0800</pubDate><description><![CDATA[脚本
#!/bin/zsh
# 使用命令
USAGE="Usage: startup.sh {start|stop|restart}"

# 参数个数
exec_param_count=$#
# 如果不是 stop 命令，那么就是需要启动启动服务，此时参数不能少于3个，如果小于3，则提示使用命令
if [ $1 != "stop" -a $exec_param_count -lt 1 ]; then
    echo $USAGE
    exit
fi

cd $(dirname $0)
WORKSPA.]]></description><category></category></item><item><title><![CDATA[Maven 自定义插件实战]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/108777822</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/108777822</guid><author>JonKee</author><pubDate>Thu, 24 Sep 2020 16:46:10 +0800</pubDate><description><![CDATA[实战

开发插件
使用 IDEA，创建一个org.apache.maven.archetypes:maven-archetype-mojo模版项目，项目名叫demo-maven-plugin。注意，maven 插件的命名有讲究的，官方插件命名格式是maven-pluginName-plugin，非官方插件的命名格式是pluginName-maven-plugin。
修改 pom.xml 。
&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmln.]]></description><category></category></item><item><title><![CDATA[dubbo 自定义异常处理方案]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/108363122</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/108363122</guid><author>JonKee</author><pubDate>Wed, 02 Sep 2020 15:28:38 +0800</pubDate><description><![CDATA[传统的MVC异常处理
在传统的 SpringMVC 开发的时候，层次结构经常是这样的。
View — Controller — Service
在这样的架构层次上做自定义业务异常处理，一般的方案是在用 Spring 的统一异常处理机制，即@ControllerAdvice加上@ExceptionHandler来捕获自己感兴趣的异常。如自定义异常如下：
public class BaseQingChaException extends RuntimeException {
    private String]]></description><category></category></item><item><title><![CDATA[线程池总结加实战]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/108143384</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/108143384</guid><author>JonKee</author><pubDate>Fri, 21 Aug 2020 11:14:06 +0800</pubDate><description><![CDATA[使用线程池的好处

降低资源消耗。
提高响应速度。
提高线程的可管理性。


线程池的实现原理
当用户提交了一个任务到线程池，线程池执行流程如下：

线程池判断核心线程池里的线程是否都在执行任务。如果不是，则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务，则进入下一个流程。
线程池判断工作队列是否已满。如果没满，则将新提交的任务存储在这个工作队列中。如果满了则进入下一个流程。
线程池判断线程池的线程是否都处于工作状态。如果没有，则创建一个新的工作线程来执行任务。如果满了，则交给饱和策略.]]></description><category></category></item><item><title><![CDATA[记一次Mysql group 的 bug]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/107321347</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/107321347</guid><author>JonKee</author><pubDate>Mon, 13 Jul 2020 17:25:28 +0800</pubDate><description><![CDATA[项目中用到了GROUP_CONCAT函数，测试环境没有问题，到生产环境发现该函数返回的结果被截取掉了。经过排查是由于该函数默认结果长度限制是1024，将限制调整大一些即可。
SET GLOBAL group_concat_max_len=1024000;
SET SESSION group_concat_max_len=1024000;
show variables like "group_concat_max_len";


...]]></description><category></category></item><item><title><![CDATA[Elk搭建古诗搜索实战]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/107132593</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/107132593</guid><author>JonKee</author><pubDate>Sat, 04 Jul 2020 23:55:07 +0800</pubDate><description><![CDATA[本文安装环境是macos，基于 elk 7.6.2搭建，不同版本之间略有差异，可以选择官网下载，也可以点击这里的的链接下载。




软件
下载地址
提取码




elasticsearch
https://pan.baidu.com/s/1835hI05ZqT1LSCxGtDCBxQ
okyv


kibana
https://pan.baidu.com/s/1m6NzW4FbzHWpwsWz3AtmHg
b6bv


logstash
https://pan.baidu.com/s/1F8eANfMF]]></description><category></category></item><item><title><![CDATA[Protobuf 了解一下]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/106904235</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/106904235</guid><author>JonKee</author><pubDate>Mon, 22 Jun 2020 16:17:25 +0800</pubDate><description><![CDATA[ProtoBuf 使用
ProtoBuf 全称&nbsp;protocol buffers，是 google 开源的一个平台无关、语言无关的序列化框架。官网点击这里&nbsp;protobuf 官网&nbsp;
文本通过一个简单的案例介绍 protobuf 的简单使用。

创建 addressbook.proto 文件
创建一个 maven 项目，在&nbsp;resources&nbsp;下创建一个目录 proto&nbsp;（可自己更改），然后在该目录下创建一个 addressbook.proto 文件]]></description><category></category></item><item><title><![CDATA[juc 阻塞队列被问怕了，熬夜总结]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/106138263</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/106138263</guid><author>JonKee</author><pubDate>Fri, 15 May 2020 11:30:05 +0800</pubDate><description><![CDATA[juc 指的是 jdk 下的 java.util.concurrent包，在这个包下提供了很多并发相关的工具类。本文将解析这个包下面的一些阻塞队列。
阻塞队列其实是实现了java.util.concurrent.BlockingQueue接口的一些实现类，要搞明白阻塞队列，那么就要清楚这个接口到底是做什么的。
public interface BlockingQueue&lt;E&gt; extends Queue&lt;E&gt; {
    boolean add(E e);
    boolean o]]></description><category></category></item><item><title><![CDATA[这下该懂 ArrayBlockingQueue 了吧]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/106138297</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/106138297</guid><author>JonKee</author><pubDate>Fri, 15 May 2020 11:29:41 +0800</pubDate><description><![CDATA[阻塞队列基础知识详见 juc 阻塞队列被问怕了，熬夜总结。
源码详解
成员变量和构造函数

/** 队列中存放数据的数组 */
final Object[] items;
/** 下一次 take, poll, peek 或者 remove 的位置 */
int takeIndex;
/** 下一次 put, offer, 或者 add 的位置 */
int putIndex;
/** 队列中元素的数量 */
int count;
/** 全局锁 */
final ReentrantLock lock;
/]]></description><category></category></item><item><title><![CDATA[Spring BeanDefinition 详解与案例]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/105464803</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/105464803</guid><author>JonKee</author><pubDate>Sun, 12 Apr 2020 09:54:28 +0800</pubDate><description><![CDATA[介绍
BeanDefinition 是 Spring 用来描述用来生成 Bean 的类的元数据信息的一个接口。容器中的 BeanDefinitionMap 是 IOC 的一个基础的组成部分，也是非常重要的一个组件。
BeanDefinition 是一个接口，它的继承关系如下：

AbstractBeanDefinition是一个抽象类，它的三个子类都具有各自的特点，下会重点分析。
BeanDefi...]]></description><category></category></item><item><title><![CDATA[Netty 服务端启动源码解析]]></title><link>https://blog.youkuaiyun.com/JonKee/article/details/104776311</link><guid>https://blog.youkuaiyun.com/JonKee/article/details/104776311</guid><author>JonKee</author><pubDate>Tue, 10 Mar 2020 15:53:55 +0800</pubDate><description><![CDATA[netty 是一个网络通信框架，底层是 java 的 NIO。使用 netty 后开发者可以将重点都放在对业务的处理上。而它的启动流程是有固定的模板的。
public class NettyServer {
    public static void main(String[] args) throws InterruptedException {
        // 1. 创建负责接收客户端...]]></description><category></category></item></channel></rss>