问题描述
遇到这样一个问题,连接mysql流程正常,连接mycat流程异常,错误信息如下:
org.activiti.engine.ActivitiException: Couldn't deserialize object in variable 'assignee'
at org.activiti.engine.impl.variable.SerializableType.getValue(SerializableType.java:69)
at org.activiti.engine.impl.persistence.entity.VariableInstanceEntity.getValue(VariableInstanceEntity.java:177)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.collectVariables(VariableScopeImpl.java:82)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.collectVariables(VariableScopeImpl.java:79)
at org.activiti.engine.impl.persistence.entity.VariableScopeImpl.getVariables(VariableScopeImpl.java:72)
Caused by: java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806)
产生原因
mycat是在阿里开源的cobar上进行扩展,而cobar一直有下面的问题:
上面红色框中就是原因根本,测试验证下:
PreparedStatement ps = ...
//1. ps.setBinaryStream(1,new ByteArrayInputStream(bytes));
连接mycat时,有问题;连接mysql时,没问题。
//2. ps.setBytes(1, bytes);
连接mycat,mysql时,都没问题
解决方案
使用setBytes来代替setBinaryStrem
1、创建一个类
public class ConvertBlobTypeHandler extends BaseTypeHandler<byte[]> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, byte[] parameter, JdbcType jdbcType)
throws SQLException {
//luoq 2018年5月10日17:17:38 云上 流程 有会签节点是操作异常。原因:注释的连接mycat有问题。
// ByteArrayInputStream bis = new ByteArrayInputStream(parameter);
// ps.setBinaryStream(i, bis, parameter.length);
ps.setBytes(i, parameter);
}
......
}
2、修改activiti-engine-5.15.1.jar下的org\activiti\db\mapping\entity\ByteArray.xml 文件