Tomcat Servlet 工作原理
本文译自:An Introduction to Tomcat Servlet Interactions
译者:因特马
邮箱:myz9412@163.com
Tomcat Servlet 功能介绍
Apache Tomcat 因其灵活的配置和交互能力其实是作为通用的 web 应用服务运行在多种环境上的,但主要还是作为一个 Java Servlet 容器。
Tomcat 利用它对 Java Servlet 和 JSP API 的实现,可以从客户端接收请求,通过动态编译容器管理的 Java class 文件来处理相关应用程序上下文中指定的请求,并将结果返还给客户端。这种动态生成的特点是快速、多线程,同时还不依赖于特有的平台去处理请求。
JavaMail 发送邮件阻塞问题解决——设置 smtp 超时时间
背景
最近发现项目中有关发送邮件的模块偶尔会阻塞住,导致整个线程阻塞。诡异的是没有捕获到任何异常日志,程序莫名其妙就卡在了 sendMail 上。
后来想到发送邮件的内容过大,可能由于这个原因导致,所以找了一下有关 JavaMail 超时设置的资料。现做整理,顺便聊聊一些小坑。
JavaMail smtp 超时参数
| 参数 | 类型 | 描述 |
|---|---|---|
| mail.smtp.connectiontimeout | int | Socket connection timeout value in milliseconds. This timeout is implemented by java.net.Socket. Default is infinite timeout. |
| mail.smtp.timeout | int | Socket read timeout value in milliseconds. This timeout is implemented by java.net.Socket. Default is infinite timeout. |
| mail.smtp.writetimeout | int | Socket write timeout value in milliseconds. This timeout is implemented by using a java.util.concurrent.ScheduledExecutorService per connection that schedules a thread to close the socket if the timeout expires. Thus, the overhead of using this timeout is one thread per connection. Default is infinite timeout. |
SpringBoot 全局异常处理进阶:使用 @ControllerAdvice 对不同的 Controller 分别捕获异常并处理
引言
之前发表过一篇 SpringBoot 对 controller 层捕获全局异常并处理的方法(@ControllerAdvice 和 @ExceptionHandler),介绍了如何在 SpringBoot 工程中对 Controller 配置全局异常处理。后来在实际工程中,又有了如下需求:有些接口在发生异常时,需要持久化错误信息,而有的接口则不需要。如果使用了全局异常处理,那每次发生了异常,还需要判断是哪个接口发生的异常,进而选择是否持久化错误日志。那能不能对全局异常进行配置,对不同类型的接口使用不同的全局异常进行处理呢?
经过查阅文档发现,Spring 提供了对 @ControllerAdvice 注解的配置,我们可以通过配置 @ControllerAdvice 指定拦截范围。
@ControllerAdvice 指定 Controller 范围
根据 API,我们可以看到注解 @ControllerAdvice 有如下几种配置:
SpringBoot 配置邮件服务
有关 SpringBoot 邮件服务
Spring Framework 自己有一套基于 JavaMail 的邮件服务包 org.springframework.mail,并通过 JavaMailSender 接口提供了一种简易的发送邮件的方式。这样,开发人员就可以不用操心底层的邮件系统,使用 Spring 提供的接口即可方便地使用邮件服务。官方文档:https://docs.spring.io/spring/docs/5.0.10.RELEASE/spring-framework-reference/integration.html#mail
而在 SpringBoot 中,提供了更为简便的自动配置,又进一步简化了开发人员工作。官方文档:https://docs.spring.io/spring-boot/docs/2.0.6.RELEASE/reference/htmlsingle/#boot-features-email 。下面介绍一下 SpringBoot 中配置邮件服务的具体方法。
具体操作
添加 Maven 依赖
SpringBoot 对 controller 层捕获全局异常并处理的方法(@ControllerAdvice 和 @ExceptionHandler)
引言
在开发中,我们会有如下的场景:某个接口中,存在一些业务异常。例如用户输入的参数校验失败、用户名密码不存在等。当触发这些业务异常时,我们需要抛出这些自定义的业务异常,并对其进行处理。一般我们要把这些异常信息的状态码和异常描述,友好地返回给调用者,调用者则利用状态码等信息判断异常的具体情况。
过去,我们可能需要在 controller 层通过 try/catch 处理。首先 catch 自定义异常,然后 catch 其它异常。对于不同的异常,我们需要在 catch 的同时封装将要返回的对象。然而,这么做的弊端就是代码会变得冗长。每个接口都需要做 try/catch 处理,而且一旦需要调整,所有的接口都需要修改一遍,非常不利于代码的维护,如下段代码所示
1 | @RequestMapping (value = "/test") |
那么,有没有什么方法可以简便地处理这些异常信息呢?答案是肯定的。Spring 3.2 中,新增了 @ControllerAdvice 注解,可以用于定义 @ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有 @RequestMapping 中。简单来说就是,可以通过 @ControllerAdvice 注解配置一个全局异常处理类,来统一处理 controller 层中的异常,于此同时 controller 中可以不用再写 try/catch,这使得代码既整洁又便于维护。
如何避免成为一个低级的码农?
计算机科学与技术专业的学生要怎样做才能避免成为 一个低级的码农?
知乎上计算机的似乎很多,大神也有不少,作为一个计算机科学与技术专业的学生,真心的请教一下要怎样做,要学什么,要怎样做,才能避免那种月工资两三千的码农甚至码奴的生活呢。 之前也有过类似的提问,但是本人看了一下那个问题下的答案,调侃者居多,希望大神们能够给小弟指一条不是那么荒唐的道路。。。
在知乎上看到上面这个问题(问题原链在【阅读原文】),以下是我的回答:
其实题主应该是看到一些学长学姐或者是看到网上一些有关程序员的言论才来问这个问题的吧?首先,我觉得题主是个很有心的人,还没毕业就开始对自己的未来开始考虑了。其次,题主现在的技术积累和学习成绩应该是一般般,我猜没什么项目经验,虽然想努力但是还是很迷茫,不知道如何下手。再者,题主应该是个对计算机抱有一定热爱的同学,要不然不会来问这个问题。
首先我来理解下题主所谓的低级码农:表象为工资低、职位低、工作内容枯燥乏味低级、工作前景不明朗、发展空间不大;内在为个人对技术不够热爱、没有进取心、以混日子为主、对工作中的内容不求甚解。不知道我理解的对不对,而以下的内容都是按照我的这个理解来展开的。
我是CS本科出身,在学校成绩中上,参加过一些比赛,成绩都一般,项目经验几乎为0,也就是平时自己会自学一些技术。所以,题主别慌,我当初也是跟你一样。好了,以下是干货,说一些适合普通人的路子。这其中有些我做到了,有些是我当时没有做到后来自己总结觉得应该去做的。另外这里也不讨论考研相关,只针对本科到工作。
有一个程序员,他毕业一年了……

前一段看到朋友圈里的学弟学妹们开始晒毕业照,这一晃据我毕业也一年多了。走出了校园,工作了一年,见得多了,体会和感触也随之变多。所以,又开始习惯性地来一波复盘,总结一下过去一年的经历,用现在不成熟的想法去回顾之前更不成熟的想法,哈哈。
挑出我认为比较重要的四点感受来叨叨吧。
一.理论知识的重要性
我的2017:不得不总结的一年
Excel表格哭着对我说:我还能再抢救一下!
统计了一天的表格在发给负责人后,负责人问我为什么我发给她的Excel文件打开是空的?!

一开始我以为是发的过程文件被损坏,重发一次就行了。但我点开检查我的excel文件是否真的是空的时,excel提示我这个↓↓↓

我靠,我心里一沉。这怕是要翻车了。果然,点击“是”后