[Twisted-Python] MultiService puzzler

Don Smith donwsmith at gmail.com
Wed Dec 12 10:10:31 MST 2007


Thanks for your response, Christian!

However, this still does not work and I think it is related to the
StompClientFactory and the StompProtocol I'm using. I'm including those at
the end of this email so you can see what they do.

I changed my GetUDP class to this:

class GetUDP(DatagramProtocol):

    def datagramReceived(self, datagram, address):
        print datagram,address
        #Send datagram to the queue server
        stompclient.send(datagram)

And I changed the instantiation to what you gave me, but I get this error
when I get a UDP packet:

        File "Agent_service_test.py", line 103, in datagramReceived
          stompclient.send(datagram)
      exceptions.NameError: global name 'stompclient' is not defined


Here are my stomp classes:

class StompProtocol(Protocol, stomper.Engine):

    def __init__(self, username='', password='', queue=''):
        stomper.Engine.__init__(self)
        self.username = username
        self.password = password
        self.counter = 1
        self.log = logging.getLogger("sender")
        self.queue = queue

    def connected(self, msg):
        """Once I've connected I want to subscribe to the message queue.
        """
        stomper.Engine.connected(self, msg)

        #self.log.info("Connected: session %s. Begining say hello." %
msg['headers']['session'])
        #lc = LoopingCall(self.send)
        #lc.start(1)

        f = stomper.Frame()
        f.unpack(stomper.subscribe(self.queue))

        # ActiveMQ specific headers:
        #
        # prevent the messages we send comming back to us.
        f.headers['activemq.noLocal'] = 'true'

        return f.pack()


    def ack(self, msg):
        """Processes the received message. I don't need to
        generate an ack message.

        """
        self.log.info("SENDER - received: %s " % msg['body'])
        return stomper.NO_REPONSE_NEEDED


    def send(self):
        """Send out a hello message periodically.
        """
        self.log.info("Saying hello (%d)." % self.counter)
        self.counter += 1

        f = stomper.Frame()
        f.unpack(stomper.send(self.queue, 'hello there (%d)' % self.counter
))

        # ActiveMQ specific headers:
        #
        f.headers['persistent'] = 'true'

        self.transport.write(f.pack())


    def connectionMade(self):
        """Register with stomp server.
        """
        cmd = stomper.connect(self.username, self.password)
        self.transport.write(cmd)


    def dataReceived(self, data):
        """Data received, react to it and respond if needed.
        """
        msg = stomper.unpack_frame(data)

        returned = self.react(msg)

        if returned:
            self.transport.write(returned)

class StompClientFactory(ReconnectingClientFactory):
    def __init__(self, username='', password='',
queue='',queue_type='',config=''):
        self.username=username
        self.password=password
        self.queue=queue
        self.queue_type=queue_type
        self.config_file=config


    def buildProtocol(self, addr):
        if self.queue_type =='config':
            return ConfigurationProtocol(self.queue,self.config_file,
self.username, self.password)
        else:
            return StompProtocol(self.username, self.password, self.queue)

    def clientConnectionLost(self, connector, reason):
        """Lost connection
        """
        print 'Lost connection.  Reason:', reason


    def clientConnectionFailed(self, connector, reason):
        """Connection failed
        """
        print 'Connection failed. Reason:', reason
        ReconnectingClientFactory.clientConnectionFailed(self, connector,
reason)

On Dec 12, 2007 8:16 AM, Christian Simms <christian.simms at gmail.com> wrote:

> On Dec 12, 2007 12:08 AM, Don Smith <donwsmith at gmail.com> wrote:
> > Hi all,
> >
> > I'm trying to build an app using MultiService. I need to have 2
> services,
> > one that listens for UDP datagrams and another that can send those
> datagrams
> > to an ActiveMQ server via a Stomp client.
> >
> > I can set up the two services just fine, but I'm stuck with how to call
> the
> > MQ service send method from the UDPServer instance.
> >
> > Some code to illustrate:
> >
> >
> >
> > class GetUDP(DatagramProtocol):
> >
> >     def datagramReceived(self, datagram, address):
> >         print datagram,address
> >         #Send datagram to the queue server
> >         # I don't know how to access the send method for the Stomp
> client
> > service!
> >
> >
> >
> > testq = internet.TCPClient(APPVARIABLES['queue_server'],
> > int(APPVARIABLES['queue_port']), connections.StompClientFactory
> > (username='',password='',queue='/queue/test'))
> > testq.setName('Testq')
> > testq.setServiceParent(MQService)
> >
> >
> > #create a UDP listener
> > #TODO: this should be driven by the config file
> > #reactor.listenUDP(42000, GetUDP())
> > internet.UDPServer(42000,GetUDP()).setServiceParent(MQService)
> > # Create an application as normal
> > application = service.Application("MQExample")
> >
> > # Connect our MultiService to the application, just like a normal
> service.
> > MQService.setServiceParent(application)
> >
> >
> > Note: this is won't run exactly as is, but should give an idea of my
> > problem. I've setup the ActiveMQ Stomp client as 'testq'. I've setup the
> > UDPServer service to listen for UDP packets. I can get the UDP packets
> and
> > print them, but I can't figure out how to hand them to my Stomp client's
> > send() method. This is possible, right?
> >
> > Thanks,
> >
> > Don
> >
> > _______________________________________________
> > Twisted-Python mailing list
> > Twisted-Python at twistedmatrix.com
> > http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
> >
>
> The answer is really easy -- you don't need any twisted magic to do
> this, you just need to use standard Python mechanisms.  Your UDP
> listener, when it receives some data, just needs a Python reference to
> your Stomp client. You could have stuffed a reference to the Stomp
> client in a module global variable (naughty!), or better, you could
> have stuffed it in an attribute of your GetUDP object. So you could
> change this line:
>
>   internet.UDPServer(42000,GetUDP()).setServiceParent(MQService)
>
> to these lines:
>
>   udpService = GetUDP()
>   udpService.stompClient = testq  # stuff it in!
>   internet.UDPServer(42000,udpService).setServiceParent(MQService)
>
> Cheers,
> Christian
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20071212/6d88ac3d/attachment.html>


More information about the Twisted-Python mailing list