我正在从事一个从Liferay 6.2到Liferay 7.1的代码迁移项目。在Liferay 6.2中,有一个类 backbackgroundtaskexecutor 包含方法 setSerial(boolean serial)。但是,在Liferay 7.1中,该方法消失了,我找不到任何替代品。
这里的任何人一般都熟悉我的问题或Liferay,可以为我提供一些指导吗?
问候,迈克尔
比较两个分支(6.2.x& 7.1.x),看起来它已被setIsolationLevel(int)
替换。它的接口的方法isSerial()
仍然存在,但其实现发生了变化:
@Override
public boolean isSerial() {
if (_isolationLevel == BackgroundTaskConstants.ISOLATION_LEVEL_NOT_ISOLATED) {
return false;
}
return true;
}
您只需调用setIsolationLevel(BackgroundTaskConstants.ISOLATION_LEVEL_NOT_ISOLATED)
而不是setSerial(false)
。由于ISOLATION_LEVEL_NOT_ISOLATED
的值为4
,因此任何值,但是4
都会使isSerial()
返回true
。或者,如果您真的愿意,也可以覆盖isSerial()
方法,然后返回true
或false
。
但是,您应该查看BackgroundTaskLockHelperUtil
实现。特别是方法getLockKey(BackgroundTask)
:
protected static String getLockKey(BackgroundTask backgroundTask) {
BackgroundTaskExecutor backgroundTaskExecutor =
BackgroundTaskExecutorRegistryUtil.getBackgroundTaskExecutor(
backgroundTask.getTaskExecutorClassName());
String lockKey = StringPool.BLANK;
if (backgroundTaskExecutor.getIsolationLevel() ==
BackgroundTaskConstants.ISOLATION_LEVEL_CLASS) {
lockKey = backgroundTask.getTaskExecutorClassName();
}
else if (backgroundTaskExecutor.getIsolationLevel() ==
BackgroundTaskConstants.ISOLATION_LEVEL_COMPANY) {
lockKey =
backgroundTask.getTaskExecutorClassName() + StringPool.POUND +
backgroundTask.getCompanyId();
}
else if (backgroundTaskExecutor.getIsolationLevel() ==
BackgroundTaskConstants.ISOLATION_LEVEL_CUSTOM) {
lockKey = backgroundTaskExecutor.generateLockKey(backgroundTask);
}
else if (backgroundTaskExecutor.getIsolationLevel() ==
BackgroundTaskConstants.ISOLATION_LEVEL_GROUP) {
lockKey =
backgroundTask.getTaskExecutorClassName() + StringPool.POUND +
backgroundTask.getGroupId();
}
else if (backgroundTaskExecutor.getIsolationLevel() ==
BackgroundTaskConstants.ISOLATION_LEVEL_TASK_NAME) {
lockKey =
backgroundTask.getTaskExecutorClassName() + StringPool.POUND +
backgroundTask.getName();
}
else {
lockKey =
backgroundTask.getTaskExecutorClassName() + StringPool.POUND +
backgroundTaskExecutor.getIsolationLevel();
}
return lockKey;
}
因此,基于您的"隔离级别",将获得一个特定的锁定,因此,您应该首先考虑是否要平行使用多个backgroundTaskexecutor运行(isSerial()
应该返回false
)。如果不是,请考虑哪个隔离水平最适合并使用它。