Flowable 中节点任意跳转

工作流开发中经常有一种回退的需求,审批回退、驳回、撤回等都需要。

在 Activiti 中流程底层没开放对应的接口,而在 Flowable 中已经提供了支持节点跳转的功能。同时我们也可以像在 Activiti 中通过实现自己的 Command 来实现任意节点跳转的需求。

下面我们先介绍一下 Flowable 提供的内置跳转功能,最后我们再手动实现任务跳转的 Command。

使用注解的方式注册 Quartz 的 Job

Java 程序员最喜欢的就是造轮子了,后端开发中时常要自己造一些轮子,一个工具包、封装一些开源组件、功能定制化等等,太常见了。

在 Spring 的自造轮子最常见的莫过于设计个注解,然后扫描到后在 BeanPostProcessor 中处理该注解对象,并根据注解组装一个新的对象然后注册到 Spring 中。

场景如《Quartz 动态调度 Job》所述那样,现在对文中 @ScheduledJob 注解的实现做详细说明。

Python 3 中使用 Sqlite3 报 no module

最近在开发一个 Telegram 小机器人,由于功能简单所以也没考虑用什么大型的关系数据库啥的,选用了 Sqlite3 这个嵌入式数据库,它的数据库就是一个文件。

程序原先使用的是 Python 2 写的,在写完核心功能后决定将代码基于 Python 3 调整一下,引人 SQLAlchemy ORM 来管理数据实体。(这次调整使用 ORM 极大方便了后面功能的加入)

调整成 Python3 后在本地运行没有任何问题,但是一发布到服务器上运行就会报 no module named '_sqlite3' 错误。

Quartz 动态调度 Job

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

控制 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;
}

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