SpringBoot 非 Web 项目运行

有时候一些项目并不需要提供 Web 服务,例如跑定时任务的项目,如果都按照 Web 项目启动未免画蛇添足浪费资源

为了达到非 Web 运行的效果,首先调整 Maven 依赖,不再依赖 spring-boot-starter-web,转而依赖最基础的 spring-boot-starter:

此时按照原先的方式启动 SpringBootApplication 会发现启动加载完之后会立即退出,这时需要做点工作让主线程阻塞让程序不退出:

这里利用了 SpringBoot 提供的 CommandLineRunner 特性,这个名字比较有欺骗性,实际效果如下:

SpringBoot 应用程序在启动后,会遍历 CommandLineRunner 接口的实例并运行它们的 run 方法。也可以利用 @Order 注解(或者实现Order接口)来规定所有 CommandLineRunner 实例的运行顺序

OkHttp 和 AsyncHttpClient 性能对比

OkHttp: http://square.github.io/okhttp/
AsyncHttpClient: https://github.com/AsyncHttpClient/async-http-client

测试代码:

测试结果:

OkHttp Sync took: 13018 ms
OkHttp Async took: 3185 ms
AsyncHttpClient took: 4980 ms

Spring MVC 异常响应编码设置

直接代码说话

[转载]MySQL 5.6 中 TIMESTAMP 的变化

注:阿里云现行使用的 MySQL RDS 版本为 5.6,小版本未知,且未开放 explicit_defaults_for_timestamp 参数的设置

本文转载自:http://www.williamsang.com/archives/818.html

在MySQL 5.6.6之前,TIMESTAMP的默认行为:

  • TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而其他数据类型,如果没有显示声明为NOT NULL,则允许NULL值。)设置TIMESTAMP的列值为NULL,会自动存储为当前timestamp。
  • 表中的第一个TIMESTAMP列,如果没有声明NULL属性、DEFAULT或者 ON UPDATE,会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性。
  • 表中第二个TIMESTAMP列,如果没有声明为NULL或者DEFAULT子句,默认自动分配’0000-00-00 00:00:00′。插入行时没有指明改列的值,该列默认分配’0000-00-00 00:00:00′,且没有警告。

MySQL5.6-MyISAM-timestamp

MySQL5.6-MyISAM-2timestamp
2列TIMESTAMP未声明为NULL的默认行为

从MySQL5.6.6开始这种默认设置的方法被废弃了。在MySQL启动时会出现以下警告:

1
2
3
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option
(seedocumentation for more details).

关闭警告,在my.cnf中加入

1
2
[mysqld]
explicit_defaults_for_timestamp=true

重启MySQL后错误消失,这时TIMESTAMP的行为如下:

  • TIMESTAMP如果没有显示声明NOT NULL,是允许NULL值的,可以直接设置改列为NULL,而没有默认填充行为。
  • TIMESTAMP不会默认分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP属性。

MySQL5.6-INNODB-timestampTIMESTAMP 不设置是否为NULL

  • 声明为NOT NULL且没有默认子句的TIMESTAMP列是没有默认值的。往数据表中插入列,又没有给TIMESTAMP列赋值时,如果是严格SQL模式,会抛出一个错误,如果严格SQL模式没有启用,该列会赋值为’0000-00-00 00:00:00′,同时出现一个警告。(这和MySQL处理其他时间类型数据一样,如DATETIME)

MySQL5.6-INNODB-timestamp-NOT-NULL
TIMESTAMP 默认设置为NOT NULL

Note:

以上内容和存储引擎选择无关。

Apache CXF 客户端开发

通过 WSDL 生成 Java 代码

在 IDEA 配置 CXF Engine 时各种不让我选择目录,不知道什么原因,因此通过命令行来生成:

  • apache-cxf-home: CXF 目录
  • output-dir: 生成的代码输出目录
  • package-name: 生成的 Java 代码的包路径
  • wsdl-url: 远端的调用地址( ?wsdl )

添加 Maven 依赖

Java Config 方式与 Spring 整合

网上包括官方文档都比较老,单独写个实例: