Метод setSerial (логический сериал) ушел в Liferay 7 - PullRequest
0 голосов
/ 13 февраля 2019

Я работаю над проектом по миграции кода с Liferay 6.2 на Liferay 7.1.В Liferay 6.2 есть класс BaseBackgroundTaskExecutor , содержащий метод setSerial (логический последовательный) .Однако в Liferay 7.1 этот метод исчез, и я не могу найти его замену.

Кто-нибудь здесь знаком с моей проблемой или Liferay в целом и может дать мне некоторые рекомендации?

Привет,Michael

1 Ответ

0 голосов
/ 13 февраля 2019

Сравнивая две ветви ( 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) или нет.Если нет, подумайте, какой уровень изоляции подходит лучше всего, и используйте его.

...