【问题标题】:Restrict curation task to *single* item将策展任务限制为*单个*项目
【发布时间】:2017-01-30 10:47:36
【问题描述】:

是否可以将curation task 限制为仅在为单个项目调用时执行,而在为社区、集合或整个 DSpace 调用时中止?

我知道可以将 curation task 限制为仅处理项目s,而不是社区和收藏,但这不是我想要的。

背景:

我有一个curation task,它会发送一封有关某件商品的电子邮件。
它旨在在单个项目上调用。
如果有人不小心在一个集合或整个 DSpace 上调用它,它会发送数千封电子邮件,这显然是个问题。

【问题讨论】:

    标签: dspace


    【解决方案1】:

    您应该实现接口 org.dspace.curate.CurationTask 而不是扩展 org.dspace.curate.AbstractCurationTask 类。

    确实,抽象类负责实现在 DSpace 容器(社区、集合)中的所有对象之间自动分配策展任务。如果策展是在社区或集合上运行,则直接实现您可以决定立即返回的界面

    int perform(DSpaceObject dso) throws IOException {
        if (!(dso instanceof Item)) {
            return Curator.CURATE_SKIP;
        }
        //... do your work on the item
        return Curator.CURATE_SUCCESS;
    }
    

    【讨论】:

    • 这样我可以跳过Community/Collection 对象,但社区的/收藏的items 仍在处理中。看来这个行为是在Curator类的curate方法中实现的,AbstractCurationTask中的distribute方法好像完全没有涉及到。
    • 你是对的!如果 dso 不是项目,您可能可以在策展任务上使用 @Suspendable 注释并返回 CURATE_FAIL 而不是 CURATE_SKIP(我尚未对此进行测试,但它应该通过代码检查工作)
    • 是的,如果您使用 CURATE_FAIL 而不是 CURATE_SKIP,它将起作用,但前提是您假设管理系统确实在单个项目之前处理容器(它在片刻)。但我找到了一个更好的解决方案,使用 @Distributive 注释。请参阅我自己的答案。
    【解决方案2】:

    答案可以在手册中找到:

    由于任务在 DSO 上运行,这些 DSO 既可以是简单的(项目),也可以是 容器(集合和社区),有一个基本的 调用任务的方式存在问题或不明确:如果 DSO 是 集合,如果 CS 调用每个成员的任务 收集,还是任务“知道”自己如何做到这一点?这 通过查找 @Distribution 注解做出决定:如果 目前,CS 假定任务将管理细节,否则 CS 将遍历集合,并在每个成员上调用任务。

    因此,为了使任务不可分发,您设置了@Distributive 注释,以告诉策展系统您自己处理分发,然后不在您的任务中实现分发。

    @Distributive 注释的意思是,“自行处理分发” 而不是 “让策展系统处理分发”。所以注解的名字有点误导。

    当您实现 org.dspace.curate.CurationTask 接口以及扩展 org.dspace.curate.AbstractCurationTask 类时,此方法有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多