gpt4 book ai didi

alfresco - RetryingTransactionHandler 在 alfresco 中的工作原理是什么

转载 作者:行者123 更新时间:2023-12-03 06:40:08 29 4
gpt4 key购买 nike

Alfresco建议程序员一旦需要在存储库中进行事务时使用RetryingTransactionHandler来实现事务。

谁能给我澄清一下吗?

具体来说,我正在谈论这样的代码

RetryingTransactionCallback<String> callback = new RetryingTransactionCallback<String>(){
public String execute() throws Throwable {
// doProcess must be invoked within user context.
AuthenticationUtil.runAs(new RunAsWork<String>(){
public String doWork()throws Exception{
try {
if(getOperationType().equals(OperationTypes.CREATE_ORGANIZATION_OPERATION)){
RetryingTransactionHelper txnHelper =
Repository.getRetryingTransactionHelper(FacesContext.getCurrentInstance());
txnHelper.doInTransaction(doProcessActionCallbackOperations.CreateOrganizationCallback, false, true);
}
} catch(Throwable e){

}
return "";
}
}, AuthenticationUtil.getSystemUserName());
return "";
}
};
try {
RetryingTransactionHelper txnHelper = Repository.getRetryingTransactionHelper(FacesContext.getCurrentInstance());
txnHelper.doInTransaction(callback, false, true);
} catch (Throwable e) {
if (e instanceof ReportedException == false) {
Utils.addErrorMessage(formatErrorMessage(e), e);
}
ReportedException.throwIfNecessary(e);
}

此外,正如您所注意到的,我使用 AuthenticationUtils.runAs()。

那么你能帮我理解这段代码中的不同键,例如 RetryingTransaction 和 AuthenticationUtils 吗?

最佳答案

RetryingTransactionHelper确保您提供的回调在事务中执行。此外,顾名思义,如果事务由于某种原因失败(例如,在未正确捕获的回调代码中抛出异常,或者您尝试同时从两个存储库中更改相同的内容)不同的线程),同一事务将被正确回滚并重新执行(“重试”)可配置的次数(默认值:20)。这比经常手动处理事务更方便。

在您发布的代码中,您将对 doProcessActionCallbackOperations.CreateOrganizationCallback 的调用嵌套在两个事务中(因为 doInTransaction 的最后一个参数始终为 true,即 requiresNew),外部是在执行 callback 之前创建的,内部是在 callback 本身内创建的。在我看来,你可以摆脱内部交易,但这取决于你。事务可以嵌套,即使内部事务中的失败很可能会使整个事务堆栈失效。

AuthenticationUtils.runAs工具允许您使用通常不同于当前用户的权限来执行逻辑片段。在内部,用户凭据存储为 ThreadLocal 参数。在您的情况下, AuthenticationUtil.runAs 负责临时更改此类 ThreadLocal ,以允许内部回调始终以最高权限级别(即系统)执行,无论哪个用户正在执行代码。还存在当前未设置登录用户的情况,例如在预定的工作范围内。然后,AuthenticationUtils.runAs 允许您访问存储库中的内容,通常指定systemadmin 用户。

关于alfresco - RetryingTransactionHandler 在 alfresco 中的工作原理是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887991/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com