前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Activiti性能与容量优化

Activiti性能与容量优化

作者头像
只喝牛奶的杀手
发布2024-05-14 14:50:19
600
发布2024-05-14 14:50:19
举报

由于需要提升Activiti7性能,所有需要将Activiti的默认缓存更换为Redis,但由于Activiti中的缓存对象ProcessDefinitionCacheEntity中的BpmnModel没有实现序列化,更重要的一点是ProcessDefinitionCacheEntity有有参的构造函数没有无参的构造函数。Redis对对象的操序列化和反序列化又极为严格。你又不想改源码?那只好兼容序列化和反序列化的方式。当然Jackson和Gson也支持,有的需要在原来的类上打注解。有的需要重新用有参构造函数生成instance。

网上查了很多资料没有很合适的解决方案。推荐使用Kyro去做序列化,在它的基础上做扩展还是比较哇塞的,代码更优雅。基本思路就是通过反射来去搞定无参构造函数实例。

代码语言:javascript
复制
package com.octopus.test;

import com.esotericsoftware.kryo.Kryo;
import sun.reflect.ReflectionFactory;

import java.lang.reflect.Constructor;
import java.util.concurrent.ConcurrentHashMap;

public class Kryox extends Kryo {
    private final ReflectionFactory REFLECTION_FACTORY = ReflectionFactory.getReflectionFactory();
    private final ConcurrentHashMap<Class<?>, Constructor<?>> _constructors = new ConcurrentHashMap<Class<?>, Constructor<?>>();

    @Override
    public <T> T newInstance(Class<T> type) {
        try {
            return super.newInstance(type);
        } catch (Exception e) {
            return (T) newInstanceFromReflectionFactory(type);
        }
    }

    @SuppressWarnings("unchecked")
    public <T> T newInstanceFromReflectionFactory(Class<T> type) {
        Constructor<?> constructor = _constructors.get(type);
        if (constructor == null) {
            constructor = newConstructorForSerialization(type);
            Constructor<?> saved = _constructors.putIfAbsent(type, constructor);
            if (saved != null)
                constructor = saved;
        }
        return (T) newInstanceFrom(constructor);

    }

    private Object newInstanceFrom(Constructor<?> constructor) {
        try {
            return constructor.newInstance();
        } catch (final Exception e) {
            throw new RuntimeException(e);
        }
    }

    private <T> Constructor<?> newConstructorForSerialization(Class<T> type) {
        try {
            Constructor<?> constructor = REFLECTION_FACTORY.newConstructorForSerialization(type, Object.class.getDeclaredConstructor());
            constructor.setAccessible(true);
            return constructor;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Activiti性能与容量优化的一些思路:

  • 历史数据异步化,历史数据使用MongoDB等存储。
  • ID生成器优化,自定义雪花算法。自带两个:数据库ID和UUID。
  • 定时器优化
  • Redis缓存改造(实现DeploymentCache)
  • 多引擎架构方案设计:建模服务负责流程建模和部署。工作流引擎服务负责流程的流转。为什么不要分库分表呢?欢迎留言

今天母亲节,想到初中语文老师教我们的诗句:没有太阳,花朵不会开放;没有爱便没有幸福;没有妇女也没有爱,没有母亲,既不会有诗人,也不会有英雄。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 只喝牛奶的杀手 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档