Quartz 动态调度 Job

Quartz 动态调度 Job

最近在开发 Quartz Job 任务时有一种很迫切的需求,希望能动态调整生产的 Job 的运行,开启或停止 Job、调整 Job 的运行频率。翻了一下源码,基于 Quartz 的 Scheduler 扩展一个。

阅读更多
控制 Quartz 是否启动

控制 Quartz 是否启动

在开发集成了 Quartz 的应用时,由于 Quartz 在开发环境一般也会自动启动。这样会给人造成不少烦恼,一个是启动 Job 会影响本地的运行效率,同时如果是分布
式模式的 Quartz 会出现本地抢任务运行,又由于本地和测试环境的各种不一致,会出现很多奇怪问题。

阅读更多

GenericJackson2JsonRedisSerializer 的时间序列化问题

GenericJackson2JsonRedisSerializer 是 Spring Data Redis 包提供的一个类,用于将 Java 对象与 JSON 字符串进行转换,存储于 Redis 时是 JSON,取出来时转换为 Java 对象。

该类是用于设置 RedisTemplate 的序列化器时一般这样配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private RedisTemplate<Object, Object> createGenericRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

redisTemplate.setKeySerializer(new StringRedisSerializer());

redisTemplate.setHashKeySerializer(new StringRedisSerializer());


redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());

redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}

这个配置一般用起来是没问题的,但很快你会发现一些理所当然的配置会不生效。

阅读更多
Spring Boot 中的 @EnableWebMvc

Spring Boot 中的 @EnableWebMvc

@EnableWebMvc 注解并不是像一般理解的那样在 Spring Boot 中使用 Spring MVC 必需要有的配置,而且并不是像字面意思那样启用 Spring MVC 的
功能。

@EnableWebMvc 的作用是引入 DelegatingWebMvcConfiguration 类来支持通过 WebMvcConfigurer 来对 WebMvc 进行配置。但其引入 DelegatingWebMvcConfiguration
的结果是导致 Spring MVC 相关的自动配置功能失效。

阅读更多
Spring Boot 集成 WebSocket

Spring Boot 集成 WebSocket

得益于 Spring Boot 约定大于配置的特性,集成 Websocket 非常简单,只需在依赖中加入对应的 starter 就可完成引入。

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

加入 starter 后,websocket 已经完成引入,这时可以使用 @Configuration 类来配置,然后使用 @EnableWebSocketMessageBroker 来启用 WS。

阅读更多
自定义 Validation 注解

自定义 Validation 注解

在 Java 后端的数据校验常用 @NotNull@NotEmpty@Size 等注解进行校验,但标应准的验证注解是很局限的,在一些特殊要求的验证中并不能满足需求。

自定义校验注解

要想实现业务用特定需求的验证只用定义一个注解和对应的校验类既可,下面实现一个非空字符串验证注解。

阅读更多
Shiro 导致 Spring 事务失效

Shiro 导致 Spring 事务失效

前段时间将 Shiro 作为权限模块整合到 Spring 中使用,也发了篇整合相关的文章《Shiro 方法上有权限注解的时候才鉴权》,讲如何实现在有打注解时才校验权限。

在集成后的项目中开发时出现有个 Service 的事务是无效的,@Transactional 注解无任何作用。检查后发现这个 Service 是在 Shiro 的 Realm 类中使用 @Autowired 注入的。

阅读更多
Spring 缓存抽象之基于注解的声明式缓存

Spring 缓存抽象之基于注解的声明式缓存

Spring 提供了一些 Java 注解用于声明缓存。

  1. @Cacheable 用于触发缓存
  2. @CacheEvict 用于失效缓存
  3. @CachePut 可用于在不影响方法运行的情况下更新缓存
  4. @Caching 用于将多种缓存操作应用到一个方法中
  5. @CacheConfig 用于配置同一个类的缓存配置,类中的所有缓存都将共享这个配置
阅读更多
Spring Boot 集成 Caffeine 缓存

Spring Boot 集成 Caffeine 缓存

Caffeine 是个高性能的开源 Java 内存缓存库,具有较高的命中率和出色的并发能力。在 Spring Boot 中集成也非常简单,提供了各种开箱既用的工具。

阅读更多
Shiro 方法上有权限注解的时候才鉴权

Shiro 方法上有权限注解的时候才鉴权

最近参与的新项目 REST API 需要集成 Shiro 权限框架,在集成过程中发现 Shiro 好像只能通过对过滤器指定 Url Path Pattern 的方式针对 URL 进行权限校验。在指定 Filter 的 URL 后,Fitler 会对所有的 URL 进行处理并不会根据需要对 URL 进行略过,但是 API 中并不是所有的接口都需要进行鉴权。

针对这个需求,翻遍了自带的默认过滤器都没有对应合适的 Filter 进行处理,只能自己实现 Filter,好在 Shiro 在扩展方面做得相当不错。本文主要讲述实现一个根据是否有权限注解来进行是否鉴权的方法,在没有 Shiro 权限注解的方法或者类上不进行鉴权。

阅读更多