[ZODB-Dev] Re: Server Notification?

Chris Spencer gmane.20.evilspam at spamgourmet.com
Wed Oct 12 01:50:31 EDT 2005


Jim Fulton wrote:
> Chris Spencer wrote:
> 
> When a non-ghost object is invalidated, it's _p_invalidate method is
> called.  You could conceivably override this method, for example to
> reload state and update a display.

Could this be used in the chatter.py demo to directly notify the client 
of new messages instead of forcing the client to continually poll the 
server for changes?

For instance, using chatter.py as a guide, I wrote a simple script 
(shown below) that modifies a persistent object on a zeoserver, and 
recieves notifications of changes to the object, although the local 
callback is never called.

If you run two instances of the script, you should see one recieve a 
couple notifications and then crash, complaining of a 
TransactionFailedError, which itself complains of a previously failed 
ConflictError. I'm doing a conflict check, just like in chatter.py, so 
what would be causing this?

Regards,
Chris

#!/usr/bin/python
'''
Modifies an object on a ZEO server, and hopefully gets notified of 
modifications
made by others.
'''

import time
from random import randint

import transaction
from persistent import Persistent

from ZEO import ClientStorage
import ZODB
from ZODB import DB
from ZODB.POSException import ConflictError

class Node(Persistent):

     def __init__(self):
         self.value = 0
         self._v_update_cb = None

     def set(self, value):
         while 1:
             try:
                 # change
                 self.value = value
                 self._p_changed = 1
                 transaction.commit()
             except ConflictError:
                 # try again later
                 time.sleep(.2)
                 pass
             else:
                  # commited
                 break

     def _p_invalidate(self):
         Persistent._p_invalidate(self)
         print 'invalidated'
         if hasattr(self, '_v_update_cb') and callable(self._v_update_cb):
             self._v_update_cb()

def notify():
     print 'notified of new value!'

# Change next line to connect to your ZEO server
addr = 'localhost', 9090
storage = ClientStorage.ClientStorage(addr)
db = DB(storage)
conn = db.open()
root = conn.root()

# initialize object
obj = root.get('testobj')
if obj is None:
     root['testobj'] = Node()
     transaction.commit()
     obj = root.get('testobj')
obj._v_update_cb = notify

# constantly modify object
while 1:
     obj.set(obj.value+1)
     print 'obj =',obj.value
     time.sleep(randint(1,3))



More information about the ZODB-Dev mailing list