2016-05-16 2 views
1

Я разработал приложение для верблюдов, которое имеет возможности для общения с внешними системами через посредника Active MQ, и в настоящий момент я собираю короткую презентацию, чтобы показать, как она работает.Отправка ответного сообщения из сценария python

Для этого я выбрал python как внешнюю систему, так как он свободен, прост в установке и немного подвержен воздействию предыдущих сценариев jython. Что я хочу показать в своей презентации, так это то, что всякий раз, когда моя система отправляет сообщение внешнему клиенту через определенную очередь, этот клиент получит его для обработки и ответа на очередь «ответ на», как указано в сообщении заголовок.

Поэтому я немного изменил один из сценариев примера python, которые поставляются с Active MQ distribution. Здесь есть мой измененный скрипт:

import time 
import sys 
import os 
import stomp 

user = os.getenv("ACTIVEMQ_USER") or "admin" 
password = os.getenv("ACTIVEMQ_PASSWORD") or "password" 
host = os.getenv("ACTIVEMQ_HOST") or "localhost" 
port = os.getenv("ACTIVEMQ_PORT") or 61613 
destination = sys.argv[1] 

class MyListener(stomp.ConnectionListener): 

    def __init__(self, receiver, sender): 
    self.receiver = receiver 
    self.sender = sender 
    self.count = 0 
    self.start = time.time() 

    def on_error(self, headers, message): 
    print('received an error %s' % message) 

    def on_message(self, headers, message): 
    if message == "SHUTDOWN": 

     diff = time.time() - self.start 
     print("Received %s in %f seconds" % (self.count, diff)) 
     self.receiver.disconnect() 
     self.sender.disconnect() 
     sys.exit(0) 

    else: 
     if self.count==0: 
     self.start = time.time() 

     self.count += 1 
     if self.count % 1000 == 0: 
     print("Received %s messages." % self.count) 

     if 'reply-to' in headers: 
     replyTo = headers['reply-to'] 
     response = '%s Python says: this is very good indeed' % self.count 
     self.sender.send(response, destination=replyTo, persistent='false') 

sender = stomp.Connection(host_and_ports = [(host, port)]) 
sender.start() 
sender.connect(login=user, passcode=password) 

receiver = stomp.Connection(host_and_ports = [(host, port)]) 
receiver.set_listener('', MyListener(receiver, sender)) 
receiver.start() 
receiver.connect(login=user, passcode=password) 
receiver.subscribe(destination=destination, id=1, ack='auto') 

print("Waiting for messages...") 
while 1: 
    time.sleep(10) 

Затем изнутри моей системы отправляю десять тысяч сообщений. Если я прокомментирую часть отправителя, я могу увидеть на выходе консоли, что клиент python получает все мои сообщения. Однако, как только я пытаюсь ответить назад Ia получаю сообщение об ошибке:

TypeError: send() got multiple values for argument 'destination' 

UPDATE: Это полный стек трассировки я получаю

Waiting for messages... 
Exception in thread Thread-2: 
Traceback (most recent call last): 
    File "D:\Dev\python\lib\threading.py", line 920, in _bootstrap_inner 
    self.run() 
    File "D:\Dev\python\lib\threading.py", line 868, in run 
    self._target(*self._args, **self._kwargs) 
    File "D:\Dev\python\lib\site-packages\stomp\transport.py", line 317, in __receiver_loop 
    self.process_frame(f, frame) 
    File "D:\Dev\python\lib\site-packages\stomp\transport.py", line 166, in process_frame 
    self.notify(frame_type, f.headers, f.body) 
    File "D:\Dev\python\lib\site-packages\stomp\transport.py", line 227, in notify 
    rtn = notify_func(headers, body) 
    File "D:/work/cls-message-router/gradle/scripts/listener4.py", line 42, in on_message 
    self.sender.send(response, destination=replyTo, persistent='false') 
TypeError: send() got multiple values for argument 'destination' 

Можете ли вы пятну из что я делаю неправильно здесь и как его исправить. Мои знания python действительно очень ограничены, поэтому немного объяснений было бы очень желанным.

Заранее благодарим за входные данные.

+0

Пожалуйста, добавьте полный ответ на свой вопрос. –

ответ

0

Вопрос был на этой линии:

self.sender.send(response, destination=replyTo, persistent='false') 

После того, как я добавил body=response все работало отлично. Таким образом, фиксированный вызов send выглядит следующим образом:

self.sender.send(body=response, destination=replyTo, persistent='false') 
Смежные вопросы