方法 setSerial(boolean serial) 在 Liferay 7 中消失了

Method setSerial(boolean serial) gone in Liferay 7

我正在进行从 Liferay 6.2 到 Liferay 7.1 的代码迁移项目。在 Liferay 6.2 中有一个 class BaseBackgroundTaskExecutor 包含一个方法 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() return true。 或者,如果你真的想要,你也可以覆盖 isSerial() 方法并让它成为 return truefalse.

但是,您应该看看BackgroundTaskLockHelperUtil implementation。特别是它的方法 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;
}

所以根据你的"Isolation Level",一个特定的锁将被获取,所以你应该首先考虑你是否想要你的BackgroundTaskExecutor 运行并行的多个实例(isSerial()应该return false) 或不。如果不是,请考虑哪种隔离级别最适合并使用它。