首页 > 解决方案 > Liferay 7 中的方法 setSerial(boolean serial)

问题描述

我正在从事从 Liferay 6.2 到 Liferay 7.1 的代码迁移项目。在 Liferay 6.2 中有一个类BaseBackgroundTaskExecutor包含一个方法setSerial(boolean serial)。但是在 Liferay 7.1 中,该方法消失了,我找不到任何替代方法。

这里有没有人熟悉我的问题或 Liferay 并可以为我提供一些指导?

问候,迈克尔

标签: liferayliferay-7

解决方案


比较两个分支(6.2.x7.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's 的值是4,任何值,但4isSerial()返回true。或者,如果你真的想要,你也可以覆盖该isSerial()方法并让它返回truefalse.

但是,您应该看一下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)。如果不是,请考虑哪种隔离级别最适合并使用它。


推荐阅读