Tomcat源码分析【八】启动过程分析之注册关闭钩子、阻塞监听关闭指令
引言本篇主要分析Catalina的start方法内部的两块内容:注册关闭钩子与阻塞监听关闭指令。
注册关闭钩子12345678910111213141516171819// Register shutdown hook //注册关闭钩子 if (useShutdownHook) { if (shutdownHook == null) { // Catalina.this.stop(); shutdownHook = new CatalinaShutdownHook(); } Runtime.getRuntime().addShutdownHook(shutdownHook); // If JULI is being used, disable JULI's shutdown hook since // shutdown hooks run in parallel and ...
Tomcat源码分析【七】启动过程分析之Server组件的start方法
各个组件的startInternalTomcat启动的时候会调用到Catalina的start方法,内部会调用其持有的Server组件的start方法:
1234567891011121314// Start the new server try { //调用Server的start方法 getServer().start(); } catch (LifecycleException e) { log.fatal(sm.getString("catalina.serverStartFail"), e); try { //异常的时候调用Server的destroy方法 getServer().destroy(); } catch (LifecycleException e1) { log.debug(&q ...
Tomcat源码分析【六】启动过程分析之生命周期方法init
引言本篇文章从一段代码开始,Catalina类中的laod()方法中:
12345678910111213//略......// Start the new servertry { //生命周期init方法 getServer().init();} catch (LifecycleException e) { if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE")) { throw new java.lang.Error(e); } else { log.error("Catalina.start", e); }}//略......
getServer获取的是当前持有的StandardServer,当然调用的init方法也是它的。具体入口在StandardServer父类LifecycleBase中:
12345678 ...
Tomcat源码分析【五】启动过程分析之配置文件解析与组件注入
引言在执行catalina的load方法时,会执行配置Digester、读取配置文件、将Catalina作为digester的顶级容器、digester解析配置文件并注入各个组件。简略修改了一下代码:
123456789101112131415// Create and execute our Digester//创建和配置将用于启动的Digester。//配置解析server.xml中各个标签的解析类Digester digester = createStartDigester(); //下面一大段都是为了conf/server.xml配置文件,失败就加载server-embed.xmlFile file = configFile();InputSource inputStream = new FileInputStream(file);InputSource inputSource = new InputSource(file.toURI().toURL().toString());inputSource.setByteStream(inputStream);//把Catali ...
Tomcat源码分析【三】分析方向选择
引言通过前两篇文章,已经做好了Tomcat源码分析的准备,但是工程那么大,到底要从哪一块开始入手分析呢?
我这里选择了以下两个分析的方向:
1 Tomcat启动过程分析目的是了解Tomcat启动流程,入口在startup.sh脚本。
2 Tomcat请求处理过程分析通过监听端口,获取客户的请求,对请求进行封装,再做业务处理,最终将结果返回给客户的一系列过程,入口在监听到请求之后的处理阶段,等分析完Tomcat的启动流程自然就知道具体的入口位置。
Tomcat源码分析【二】总体架构
总体架构Tomcat的总体架构还是比较清晰的,贴一张图先有个简单的印象,这样在之后分析源码的时候能减少懵的概率。
一个服务器的基本功能:接收客户请求,解析请求,处理业务逻辑,结果返回给客户端。一般有两个方法,star打开服务,监听端口;stop关闭服务,释放资源。Tomcat也是一样的,只不过更复杂,功能更完善。为什么Tomcat要分为这么多的组件呢?原因很简单:为了扩展。好像所有的多组件架构都是为了好扩展。Connector负责请求监听,Container负责请求处理。server.xml配置了Connector与Container的对应关系,Service就包含了这种对应关系。在Tomcat架构中,一个Server包含多个Service,每个Service包含多个Connector与一个Container,Container又有4种实现:Engine、Host、ontext、Wrapper。
server.xml配置文件用Tomcat肯定会接触到配置文件server.xml。从配置文件中也能看出来大概的架构。
1
组件从架构图中看到了好多组件,其实并不知道它的作用是什么,这里简单的 ...
Tomcat源码分析【一】版本选择与工程导入
引言项目中有直接使用外置Tomcat的,也有springboot内置Tomcat的,虽然一直在使用,也会简单的配置与调优,但是从来没有系统的分析过Tomcat。
版本选择因为我使用的Test工程中springboot是2.1.6.RELEASE,其内嵌的tomcat版本为9.0.21,看Tomcat官网当前最新版本为9.0.24。看了线上老的服务Tomcat版本为7.0.73。线上springboot版本有1.5.2.RELEASE,内置的Tomcat版本为8.5.11,springboot版本也有2.1.0.RELEASE,内置Tomcat版本为:9.0.12。
Tomcat各个版本的区别贴上官方地址:Apache Tomcat Versions
最终决定使用springboot 2.1.0.RELEASE版本,因为线上运行稳定,并且版本比较新,内置Tomcat版本为:9.0.12。下载Tomcat9.0.12版本源码:v9.0.12
IDEA导入工程直接参考别人的博客就好,期间碰到起不来的情况,通过查找资料解决掉了。主要跟着这个文章导入就好:IDEA 导入 Tomcat9 源码期间 ...
Canal数据采集框架的使用与错误信息总结
文章首发于:clawhub.club
背景
存在跨数据库同步数据的需求,对数据有实时同步的要求,采用阿里的开源框架Canal实时采集Mysql的binlog日志,将过滤后的数据统一标准格式发送到kafka中,在服务的消费端进行数据消费入库。
版本信息Canal 1.1.3Mysql支持版本 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
工作原理
Canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
Canal 解析 binary log 对象(原始为 byte 流)
实现代码123456789101112131415161718192021222324/** * canal连接 * * @return */@Beanpublic CanalConnector getCanalConnector() { String canalH ...
MyBatis【七】SqlSession与Spring事务的分析
引言SqlSession 完全包含了面向数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
123try (SqlSession session = sqlSessionFactory.openSession()) { Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);}
上面是官方文档的内容:MyBatis官方文档|入门
在上一篇文章分析MyBatis执行SQL的时候,遗留了一些关于SqlSession的疑问,怎么创建,怎么释放。SqlSessionTemplate的SqlSessionInterceptor中解决了上面的疑问:
1234567891011121314151617181920212223242526272829303132@Override public Object invoke(Object proxy, Method method, ...
MyBatis【六】SQL语句的执行过程
1、JDBC执行查询语句再回忆一下最初写JDBC的语句:
12345678910111213141516171819202122public static void select() { String sql = "select * from people where name = ? order by id"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, "李四"); rs = pstmt.executeQuery(); while (rs.next()) { int id = rs.getInt("id"); ...