Activiti 遇到Timer 流程被卡住 其中 EXCEPTION_STACK_ID_ 字段是异常的堆栈信息,根据其中id可以去 act_ge_bytearray 表中找到堆栈异常信息。解决完异常就能正常推进流程。问题:最近在activiti中使用了timer,遇到了流程卡在timer,不继续执行的问题。流程卡在了这里,不是timer没有触发,而是触发了,但是遇到异常,事务回滚了。activiti中有张表act_ru_job 其中有timer执行失败的记录。,内容更多,更新,欢迎参观。
一次新奇的空指针NullPointException报错 title: 一次新奇的空指针NullPointException报错date: 2024-06-22 12:17updated: 2024-06-22 12:17tags:
Build completed with 1 error and 0 warnings title: Build completed with 1 error and 0 warningsdate: 2024-05-16 21:30updated: 2024-05
利用Github Action 简化个人博客上传流程 在autodeploy.yml文件中添加一个步骤,去初始化更新submodule(我这里放在了检查分支后面)把主题项目当成一个submodule,备份后删除themes下的主题文件夹,执行以下命令,下载。通常,为了保证我们的markdown文件不丢失,还需要将markdown文件上传至一个私人仓库。方案:利用GithubAction,监控源代码仓库,如果有代码提交,自动执行。需求:操作一个仓库(源代码仓库),另外一个(页面仓库)自动更新。可以同步部署,但是导出的页面文件是空的。需要维护两个仓库,比较麻烦。
浅谈AQS AQSAbstractQueuedSynchronizer部分代码如下://同步队列的队列头private transient volatile Node head;//同步队列的队列尾private transient volatile Node tail;//状态值,代表的含义与具体的实现类相关private volatile int state;//与Condition相关,可以实现精确唤醒public class ConditionObject{ //条件队列的队列头 priv
Spring自动装配 自动装配@Autowired标注在属性、构造器、方法、参数、注解上,自动从容器中寻找相同类型的bean赋值,如果有多个相同类型的,则根据bean的id来匹配。默认是需要完成装配的,否则报错,当然也可以设置为非必须:@Autowired(required = false)标注在方法上,最常见的就是配置类中结合@Bean和标在set方法上@Bean// factory从容器中获取,可以省略@Autowiredpublic RedisTemplate<String, Object>
Spring属性赋值 属性赋值@Value可以使用@Value标在属性上,给属性赋值,当然也可以标在方法、参数、注解上。可以直接写值、SpEL(Spring Expression Language)、或者${}取值示例public class People { @Value("${people.name}") // 从配置文件中取 private String name; @Value("#{1+2}") // SpEL private String i
Spring bean的生命周期 生命周期生命周期及对其控制bean生命周期分为7个阶段创建实例属性赋值初始化前初始化初始化后使用销毁对于单实例bean,容器创建好了,bean也就创建好了,容器关闭了,bean也调用destroy方法销毁对于多实例bean,直到使用才会去创建,容器关闭,也不会调用destroy方法销毁我们使用@Bean注册组件时,可以使用@Bean(initMethod = “init”, destroyMethod = “destroy”)指定初始化方法名,销毁方法名如果是使用组件扫描加入
Spring组件注册 组件注册@Configuration声明这是一个配置类在配置类中可以使用@Bean修饰方法,将该组件加入容器中。组件类型为返回值类型,组件id为方法名。@Configurationpublic class SpringConfig { // 将组件加入容器中,组件类型为People,组件为People("ming",null,null),组件名称默认为为people1,但是@Bean注解中设置了为people @Bean("people") public People pe
ArrayList和Vector扩容机制 在JDK8中,ArrayList有三种构造方法。特别的,对于ArrayList(),是造了一个空数组。我们直接找到ArrayList的扩容方法其中,DEFAULT_CAPACITY=10,minCapacity = 数组现有长度加上需要添加的元素(或集合)的长度。如果现在ArrayLIst存的是一个空数组,那么就取10和minCapacity的最大值。得到了所需最小容量后,该扩容就扩容具体扩容方式尝试扩容至1.5倍,如果仍不够,则将所需最小容量作为新数组的容量。JDK1.7,和1.8
StringBuffer和StringBuilder扩容机制 StringBuffer与StringBuilder的append都是调用父类AbstractStringBuilder的appen方法。而AbstractStringBuilder的append方法如下,其中有一个ensureCapacityInternal(count + len)方法。其中count+len是所需容量。而ensureCapacityInternal(int minimumCapacity)方法是:如果目前数组长度小于所需长度,则调用newCapacity(minimumCapac
Lambda表达式与方法引用 lambda表达式前提条件使用Lambda表达式前提条件是:实现的接口是一个函数式接口函数式接口函数式接口就是在接口中只能有一个抽象方法。Java 8 中还有一个注解@FunctionalInterface,表明接口是函数式接口。当然,不标注此注解,他也是函数式接口,注解只是起到编译检查的作用java 8 提供了四大函数式接口:Consumer,Supplier,Function<T, R>,Predicate。语法 // 这个接口中的accept方法负责接受一个参数,不作返