方法 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 true
或 false
.
但是,您应该看看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
) 或不。如果不是,请考虑哪种隔离级别最适合并使用它。
我正在进行从 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 true
或 false
.
但是,您应该看看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
) 或不。如果不是,请考虑哪种隔离级别最适合并使用它。