异步运行Plone订阅者事件

Fra*_*ine 5 events zope plone

在使用Plone 4时,我已成功创建订阅者事件,以便在保存自定义内容类型时执行额外处理.这是我通过使用Products.Archetypes.interfaces.IObjectInitializedEvent界面完成的.

configure.zcml中

<subscriber 
        for="mycustom.product.interfaces.IRepositoryItem
             Products.Archetypes.interfaces.IObjectInitializedEvent"
        handler=".subscribers.notifyCreatedRepositoryItem"
   /> 
Run Code Online (Sandbox Code Playgroud)

subscribers.py

def notifyCreatedRepositoryItem(repositoryitem, event):
    """
    This gets called on IObjectInitializedEvent - which occurs when a new object is created.
    """ 
    my custom processing goes here. Should be asynchronous
Run Code Online (Sandbox Code Playgroud)

但是,额外的处理有时可能需要很长时间,我想知道是否有办法在后台运行它,即异步.

是否可以异步运行订户事件,例如在保存对象时?

Mar*_*ers 6

没有开箱即用.您需要为您的环境添加异步支持.

看看plone.app.async; 你需要一个ZEO环境和至少一个额外的实例.后者将运行从您的站点进入队列的异步作业.

然后,您可以定义要异步执行的方法,并将任务推送到队列中,以异步方式执行此类方法.

示例代码,将任务推入队列:

from plone.app.async.interfaces import IAsyncService

async = getUtility(IAsyncService)
async.queueJob(an_async_task, someobject, arg1_value, arg2_value)
Run Code Online (Sandbox Code Playgroud)

和任务本身:

def an_async_task(someobject, arg1, arg2):
    # do something with someobject
Run Code Online (Sandbox Code Playgroud)

哪里someobject是ZODB中的持久对象.将IAsyncService.queueJob需要至少一个函数和一个上下文对象,但是当你需要执行你的任务,你可以添加任意多的进一步论证.参数必须是可选择的.

然后,任务将由异步工作器实例在当前请求的上下文之外执行.