<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Z_ChenChen的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Z_ChenChen</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Z_ChenChen]]></copyright><item><title><![CDATA[ScheduledThreadPoolExecutor中定时周期任务的实现源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/103586753</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/103586753</guid><author>Z_ChenChen</author><pubDate>Tue, 07 Jan 2020 16:18:01 +0800</pubDate><description><![CDATA[ScheduledThreadPoolExecutor是一个定时任务线程池，相比于ThreadPoolExecutor最大的不同在于其阻塞队列的实现
首先看一下其构造方法：
public ScheduledThreadPoolExecutor(int corePoolSize,
                                   ThreadFactory threadFacto...]]></description><category></category></item><item><title><![CDATA[RocketMQ中PullConsumer的消息拉取源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/99366581</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/99366581</guid><author>Z_ChenChen</author><pubDate>Tue, 13 Aug 2019 16:21:01 +0800</pubDate><description><![CDATA[在PullConsumer中，有关消息的拉取RocketMQ提供了很多API，但总的来说分为两种，同步消息拉取和异步消息拉取
同步消息拉取
以同步方式拉取消息都是通过DefaultMQPullConsumerImpl的pullSyncImpl方法：
private PullResult pullSyncImpl(MessageQueue mq, SubscriptionData subscript...]]></description><category></category></item><item><title><![CDATA[RocketMQ中PullConsumer的启动源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/99131324</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/99131324</guid><author>Z_ChenChen</author><pubDate>Tue, 13 Aug 2019 00:03:27 +0800</pubDate><description><![CDATA[通过DefaultMQPullConsumer作为默认实现，这里的启动过程和Producer很相似，但相比复杂一些
【RocketMQ中Producer的启动源码分析】
DefaultMQPullConsumer的构造方法：
public DefaultMQPullConsumer(final String consumerGroup, RPCHook rpcHook) {
    this.co...]]></description><category></category></item><item><title><![CDATA[RocketMQ中Broker的HA策略源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98683924</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98683924</guid><author>Z_ChenChen</author><pubDate>Thu, 08 Aug 2019 07:41:20 +0800</pubDate><description><![CDATA[Broker的HA策略分为两部分
①同步元数据
②同步消息数据
同步元数据
在Slave启动时，会启动一个定时任务用来从master同步元数据
if (role == BrokerRole.SLAVE) {
    if (null != slaveSyncFuture) {
        slaveSyncFuture.cancel(false);
    }
    this.slaveSy...]]></description><category></category></item><item><title><![CDATA[RocketMQ中Broker的刷盘源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98536232</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98536232</guid><author>Z_ChenChen</author><pubDate>Wed, 07 Aug 2019 00:35:07 +0800</pubDate><description><![CDATA[上一篇博客简单提了下CommitLog的刷盘  【RocketMQ中Broker的启动源码分析（二）】
CommitLog有两种刷盘实现：
public enum FlushDiskType {
    SYNC_FLUSH,
    ASYNC_FLUSH
}

同步和异步，同步刷盘由GroupCommitService实现，异步刷盘由FlushRealTimeService实现，默认采用异步刷...]]></description><category></category></item><item><title><![CDATA[RocketMQ中Broker的消息存储源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98549453</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98549453</guid><author>Z_ChenChen</author><pubDate>Tue, 06 Aug 2019 07:46:01 +0800</pubDate><description><![CDATA[Broker和前面分析过的NameServer类似，需要在Pipeline责任链上通过NettyServerHandler来处理消息
【RocketMQ中NameServer的启动源码分析】
实际上就通过前面提到的SendMessageProcessor的processRequest方法处理
【RocketMQ中Broker的启动源码分析（一）】
SendMessageProcessor的proc...]]></description><category></category></item><item><title><![CDATA[RocketMQ中Broker的启动源码分析（二）]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98471292</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98471292</guid><author>Z_ChenChen</author><pubDate>Mon, 05 Aug 2019 06:00:14 +0800</pubDate><description><![CDATA[接着上一篇博客  RocketMQ中Broker的启动源码分析（一）
在完成准备工作后，调用start方法：
public static BrokerController start(BrokerController controller) {
    try {

        controller.start();

        String tip = "The broker[" + ...]]></description><category></category></item><item><title><![CDATA[RocketMQ中Broker的启动源码分析（一）]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98267225</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98267225</guid><author>Z_ChenChen</author><pubDate>Sun, 04 Aug 2019 06:26:14 +0800</pubDate><description><![CDATA[在RocketMQ中，使用BrokerStartup作为启动类，相较于NameServer的启动，Broker作为RocketMQ的核心可复杂得多
【RocketMQ中NameServer的启动】
主函数作为其启动的入口：
public static void main(String[] args) {
    start(createBrokerController(args));
}

首先通...]]></description><category></category></item><item><title><![CDATA[RocketMQ中NameServer的启动源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98231358</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/98231358</guid><author>Z_ChenChen</author><pubDate>Fri, 02 Aug 2019 22:38:55 +0800</pubDate><description><![CDATA[在RocketMQ中，使用NamesrvStartup作为启动类
主函数作为其启动的入口：
public static void main(String[] args) {
	main0(args);
}

main0方法：
public static NamesrvController main0(String[] args) {
    try {
        NamesrvControl...]]></description><category></category></item><item><title><![CDATA[RocketMQ中Producer消息的发送源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/97925347</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/97925347</guid><author>Z_ChenChen</author><pubDate>Fri, 02 Aug 2019 18:31:14 +0800</pubDate><description><![CDATA[上篇博客介绍过Producer的启动，这里涉及到相关内容就不再累赘了【RocketMQ中Producer的启动源码分析】
Producer发送消息，首先需要生成Message实例：
public class Message implements Serializable {
    private static final long serialVersionUID = 8445773977080...]]></description><category></category></item><item><title><![CDATA[RocketMQ中Producer的启动源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/97616508</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/97616508</guid><author>Z_ChenChen</author><pubDate>Wed, 31 Jul 2019 03:10:30 +0800</pubDate><description><![CDATA[RocketMQ中通过DefaultMQProducer创建Producer
DefaultMQProducer定义如下：
public class DefaultMQProducer extends ClientConfig implements MQProducer {
	protected final transient DefaultMQProducerImpl defaultMQProd...]]></description><category></category></item><item><title><![CDATA[Netty服务端的启动源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90586884</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90586884</guid><author>Z_ChenChen</author><pubDate>Mon, 03 Jun 2019 18:21:30 +0800</pubDate><description><![CDATA[ServerBootstrap的构造：
public class ServerBootstrap extends AbstractBootstrap&lt;ServerBootstrap, ServerChannel&gt; {
    private static final InternalLogger logger = InternalLoggerFactory.getInstance(Se...]]></description><category></category></item><item><title><![CDATA[Netty中的ChannelFuture和ChannelPromise]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90746281</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90746281</guid><author>Z_ChenChen</author><pubDate>Mon, 03 Jun 2019 05:43:02 +0800</pubDate><description><![CDATA[在Netty使用ChannelFuture和ChannelPromise进行异步操作的处理
这是官方给出的ChannelFutur描述
 *                                      | Completed successfully    |
 *                                      +---------------------...]]></description><category></category></item><item><title><![CDATA[Netty中的ChannelPipeline源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90733936</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90733936</guid><author>Z_ChenChen</author><pubDate>Sun, 02 Jun 2019 14:42:17 +0800</pubDate><description><![CDATA[ChannelPipeline在Netty中是用来处理请求的责任链，默认实现是DefaultChannelPipeline，其构造方法如下：
private final Channel channel;
private final ChannelFuture succeededFuture;
private final VoidChannelPromise voidPromise;
final A...]]></description><category></category></item><item><title><![CDATA[Netty中FastThreadLocal源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90733986</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90733986</guid><author>Z_ChenChen</author><pubDate>Sun, 02 Jun 2019 02:58:50 +0800</pubDate><description><![CDATA[Netty中使用FastThreadLocal替代JDK中的ThreadLocal 【JAVA】ThreadLocal源码分析，其用法和ThreadLocal 一样，只不过从名字FastThreadLocal来看，其处理效率要比JDK中的ThreadLocal要高
在类加载的时候，先初始化了一个静态成员：
private static final int variablesToRemoveInde...]]></description><category></category></item><item><title><![CDATA[Netty中NioEventLoopGroup的创建源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90567863</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90567863</guid><author>Z_ChenChen</author><pubDate>Thu, 30 May 2019 17:37:16 +0800</pubDate><description><![CDATA[NioEventLoopGroup的无参构造：
public NioEventLoopGroup() {
	this(0);
}

调用了单参的构造：
public NioEventLoopGroup(int nThreads) {
    this(nThreads, (Executor)null);
}

继续看到双参构造：
public NioEventLoopGroup(int nThre...]]></description><category></category></item><item><title><![CDATA[【Java】NIO中Selector的select方法源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90254156</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90254156</guid><author>Z_ChenChen</author><pubDate>Sun, 19 May 2019 18:26:54 +0800</pubDate><description><![CDATA[上一篇博客说过了Selector的创建在Windows下默认生成WindowsSelectorImpl对象，那么Selector的select方法使用的就是WindowsSelectorImpl的select方法，而在WindowsSelectorImpl下并没有覆盖这个方法，而是由其基类SelectorImpl实现的：
public int select() throws IOException...]]></description><category></category></item><item><title><![CDATA[【Java】NIO中Channel的注册源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90267563</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90267563</guid><author>Z_ChenChen</author><pubDate>Fri, 17 May 2019 13:18:17 +0800</pubDate><description><![CDATA[不管是在服务端还是客户端，Channel的注册是在SelectableChannel中定义的：
public abstract SelectionKey register(Selector sel, int ops, Object att)
        throws ClosedChannelException;
        
public final SelectionKey regis...]]></description><category></category></item><item><title><![CDATA[【Java】NIO中Selector的创建源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90240589</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90240589</guid><author>Z_ChenChen</author><pubDate>Thu, 16 May 2019 01:06:59 +0800</pubDate><description><![CDATA[在使用Selector时首先需要通过静态方法open创建Selector对象
public static Selector open() throws IOException {
        return SelectorProvider.provider().openSelector();
}

可以看到首先是调用SelectorProvider的静态方法provider，得到一个Selec...]]></description><category></category></item><item><title><![CDATA[【Java】ServiceLoader源码分析]]></title><link>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90241519</link><guid>https://blog.youkuaiyun.com/Z_ChenChen/article/details/90241519</guid><author>Z_ChenChen</author><pubDate>Wed, 15 May 2019 19:52:49 +0800</pubDate><description><![CDATA[ServiceLoader主要的功能是用来完成对SPI的provider的加载。
先看下它的成员：
public final class ServiceLoader&lt;S&gt;
    implements Iterable&lt;S&gt; {

    private static final String PREFIX = "META-INF/services/";

    // T...]]></description><category></category></item></channel></rss>