RESTful开发日期类型字段如何正确传递

RESTful开发时经常会遇到参数传入日期类型及返回的日期类型值,日期和时间戳如果没有适当和一致地处理,就会给人带来头痛的问题,我这里建议大家使用统一格式化的时间字符串yyyy-MM-dd HH:mm:ss,为什么建议这个呢?这样看起来比较直观,前后端联调起来比较高效。

下面我们就细说一下日期类型的参数将如何处理。

Read More

Spring @Async的异常处理

通常,如果我们要在程序中做一个耗时的操作(例如调用其他外部模块),一般会通过异步的方式执行。

有这2种方法:

  • 自行生成线程池ThreadPoolExecutor,提交任务执行
  • 更方便地,使用Spring @Async注解,修饰在需要异步执行的方法上

对于第一种方法的异常处理,楼主已经在Java子线程中的异常处理(通用)这篇文章中介绍了,也就是提交任务后获取到Future对象,通过future.get()获取返回值的时候能够捕获到ExcecutionException。

对于Spring @Async注解的方法,如何进行异常处理呢?楼主想到了2种方法。

Read More

Java子线程中的异常处理

在普通的单线程程序中,捕获异常只需要通过try … catch … finally …代码块就可以了。那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相应的处理呢?

常见错误

也许有人会觉得,很简单嘛,直接在父线程启动子线程的地方try … catch一把就可以了,其实这是不对的。

原因分析

让我们回忆一下Runnable接口的run方法的完整签名,因为没有标识throws语句,所以方法是不会抛出checked异常的。至于RuntimeException这样的unchecked异常,由于新线程由JVM进行调度执行,如果发生了异常,也不会通知到父线程。

Read More

Docker容器:如何让应用程序优雅退出

伴随着业务的不断更新迭代,容器启动的和停止经常发生,当容器停止时,如果容器内的程序未执行完,那么将会造成数据不完整,特别是一些分布式事务,可能会导致数据不一致,为此,容器引入优雅关闭功能。

当我们执行docker stop命令后,docker会向容器中进程ID为1的进程发送SIGTERM(kill -15)信号,当等待一段时间后程序仍然没有退出后,将发送SIGKILL(kill -9)信号强制杀死进程。等待时间可以通过参数设置:

1
# docker stop --time=30 foo

Read More