2013-04-08 9 views
5

In Plone 4 habe ich erfolgreich ein Subscriber-Ereignis erstellt, um zusätzliche Verarbeitung durchzuführen, wenn ein benutzerdefinierter Inhaltstyp gespeichert wird. Dies habe ich mit der Schnittstelle Products.Archetypes.interfaces.IObjectInitializedEvent erreicht.Laufende Plone-Abonnentenereignisse asynchron

configure.zcml

<subscriber 
     for="mycustom.product.interfaces.IRepositoryItem 
      Products.Archetypes.interfaces.IObjectInitializedEvent" 
     handler=".subscribers.notifyCreatedRepositoryItem" 
    /> 

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 

jedoch die zusätzliche Verarbeitung kann manchmal zu lange dauern, und ich frage mich, ob es einen Weg gibt es im Hintergrund laufen zu lassen dh asynchron.

Ist es möglich, Abonnentenereignisse asynchron auszuführen, wenn zum Beispiel ein Objekt gespeichert wird?

Antwort

6

Nicht im Lieferumfang enthalten. Sie müssten der Umgebung asynchrone Unterstützung hinzufügen.

Werfen Sie einen Blick auf plone.app.async; Sie benötigen eine ZEO-Umgebung und mindestens eine zusätzliche Instanz. Letzteres führt asynchrone Jobs aus, die Sie von Ihrer Site in die Warteschlange schieben.

Sie können dann Methoden definieren, die asynchron ausgeführt werden, und Tasks in die Warteschlange schieben, um eine solche Methode asynchron auszuführen.

Beispiel-Code, drücken Sie eine Aufgabe in die Warteschlange:

from plone.app.async.interfaces import IAsyncService 

async = getUtility(IAsyncService) 
async.queueJob(an_async_task, someobject, arg1_value, arg2_value) 

und die Aufgabe selbst:

def an_async_task(someobject, arg1, arg2): 
    # do something with someobject 

wo someobject ein persistentes Objekt in Ihrem ZODB ist. Die IAsyncService.queueJob dauert mindestens eine Funktion und ein Kontextobjekt, aber Sie können so viele weitere Argumente hinzufügen, die Sie zum Ausführen Ihrer Aufgabe benötigen. Die Argumente müssen auswählbar sein.

Die Task wird dann von einer asynchronen Worker-Instanz ausgeführt, wenn dies möglich ist, und zwar außerhalb des Kontextes der aktuellen Anforderung.

1

Nur um mehr Optionen zu geben, könnten Sie versuchen collective.taskqueue dafür, wirklich einfach und wirklich mächtig (und vermeiden Sie einige der Nachteile von plone.app.async).

Die Beschreibung auf PyPI hat bereits genug, um Sie in kürzester Zeit auf den neuesten Stand zu bringen, und Sie können redis für das Warteschlangenmanagement verwenden, was ein großes Plus ist.