验证拦截器在多线程 Impex 中不起作用

Posted

技术标签:

【中文标题】验证拦截器在多线程 Impex 中不起作用【英文标题】:Validate Interceptor not working in Multi Threaded Impex 【发布时间】:2021-08-14 08:14:50 【问题描述】:

SAP Commerce 1811

Impex -

INSERT_UPDATE Calendar ; code[unique=true] ; name[lang=en]       ; year   ; active[default=false]
                       ; 10001             ; 2021 Public Holiday ; 2021   ; true                 
                       ; 10002             ; 2021 Holiday        ; 2021   ; true                 

我创建了一个验证拦截器,它可以确保一次只能激活一个日历。这意味着我们不能在同一年激活两个以上的日历。

final CalendarModel cal = calendarService.getActiveCalendar(calendar.getYear());
        if (cal != null && !cal.equals(calendar))
        
            throw new InterceptorException(
                    String.format("Only one Calendar can be active at a time for year %s", calendar.getYear()));
        

在这个 Impex 中,我插入了两个带有 active=true 的日历,并希望为其中一个条目提供验证异常。

由于在这个用例中,一个条目依赖于另一个条目,它在多线程的情况下不起作用(因为没有定义顺序)。

如果最大。线程设置为大于 1,我运行 impex,验证不起作用。我尝试用 1 个线程导入这个 impex,然后只有验证工作。

有什么办法可以解决这个问题吗?

【问题讨论】:

我在 2005 年看不到 calendarService。如果是自定义服务,可能存在错误/缓存问题。 我不确定行为,你能在 impex 执行期间尝试使用翻译器吗? 【参考方案1】:

你不能用拦截器解决这个问题。拦截器根本不是线程安全的。它们不是为了验证对象是否已经存在而构建的。拦截器旨在验证将被保存的对象,独立于其他对象。

这是一个需要在数据库中解决的问题,而不是在您的代码中。您需要在 CalendarModel 的表格上添加一个SQL constraint(更具体地说是一个SQL CHECK 约束)。此约束应验证您对每年 1 个活动项目的要求。

如何编写该约束取决于您的数据库。要添加它,您可以直接在数据库中添加约束,尽管更新系统可能会再次删除它(我没有验证这一点,但它发生在索引中)。或者,您可以在初始化期间运行 alter table 语句来创建约束。

使用此约束,非法项目将引发数据库错误。运行 impex 时,这将在结果中可见

【讨论】:

有道理

以上是关于验证拦截器在多线程 Impex 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

VB6 GUI 在多线程 COM 环境中不起作用

为啥 switchMap 在 Angular 拦截器(Angular 9)中不起作用

lambda函数在多进程中不起作用

拦截器在 Spring Boot GraphQL 中不起作用

Axios 请求拦截器在我的 vue 应用程序中不起作用

为啥进入动画在新线程中不起作用?