2014-02-27 3 views
4

http://www.rabbitmq.com/tutorials/tutorial-two-python.html에서 "hello world"자습서를 사용하고 있습니다. worker.pypython에서 rabbitmq를 사용하는 중에 "pika.exceptions.ConnectionClosed"오류가 발생합니다

import pika 
import time 


connection = pika.BlockingConnection(pika.ConnectionParameters(
     host='localhost')) 
channel = connection.channel() 

channel.queue_declare(queue='task_queue', durable=True) 
print ' [*] Waiting for messages. To exit press CTRL+C' 

def callback(ch, method, properties, body): 
    print " [x] Received %r" % (body,) 
    time.sleep(body.count('.')) 
    print " [x] Done" 
    ch.basic_ack(delivery_tag = method.delivery_tag) 

channel.basic_qos(prefetch_count=1) 
channel.basic_consume(callback, 
         queue='task_queue') 

channel.start_consuming() 

처럼 나는 내 작품에 구현하기 위해이 코드를 사용했습니다 보인다. 이 [x] Done

Traceback (most recent call last): 
    File "hullworker2.py", line 242, in <module> 
    channel.basic_consume(callback,queue='test_queue2') 
    File "/usr/local/lib/python2.7/dist-packages/pika/channel.py", line 211, in basic_consume 
    {'consumer_tag': consumer_tag})]) 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 904, in _rpc 
    self.connection.process_data_events() 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 88, in process_data_events 
    if self._handle_read(): 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 184, in _handle_read 
    super(BlockingConnection, self)._handle_read() 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/base_connection.py", line 300, in _handle_read 
    return self._handle_error(error) 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/base_connection.py", line 264, in _handle_error 
    self._handle_disconnect() 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 181, in _handle_disconnect 
    self._on_connection_closed(None, True) 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 232, in _on_connection_closed 
    self._channels[channel]._on_close(method_frame) 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 817, in _on_close 
    self._send_method(spec.Channel.CloseOk(), None, False) 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 920, in _send_method 
    self.connection.send_method(self.channel_number, method_frame, content) 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 120, in send_method 
    self._send_method(channel_number, method_frame, content) 
    File "/usr/local/lib/python2.7/dist-packages/pika/connection.py", line 1331, in _send_method 
    self._send_frame(frame.Method(channel_number, method_frame)) 
    File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 245, in _send_frame 
    super(BlockingConnection, self)._send_frame(frame_value) 
    File "/usr/local/lib/python2.7/dist-packages/pika/connection.py", line 1312, in _send_frame 
    raise exceptions.ConnectionClosed 
pika.exceptions.ConnectionClosed 

연결이 과정 사이에 자동으로 폐쇄하는 방법을 이해하지 않습니다를 인쇄 한 후 예외가 발생하는 큐의 포인트가 제공됩니다 전까지 모든 것이 원활하게 작동합니다. 프로세스가 큐의 메시지 100에 대해 정상적으로 실행되면 갑자기이 오류가 발생합니다. 도움을 주시면 감사하겠습니다.

+0

스택 추적 오류를 복사하거나 붙여 넣을 수 있습니까? 그것은 역 추적 같은 (가장 최근 통화 마지막)로 시작해야합니다 파일 "", 라인 1, 에 ..... 나는 QUES를 업데이트 한 @kobejohn – KobeJohn

+0

을 내가 그렇게 rabbitmq 설정이없는 그것을 – sau

+0

를 참조하십시오 나는 단지 짐작하고있다. traceback이 basic_consume에 오류를 표시하는 것이 이상하게 보입니다. start_consuming() 이후까지 콜백이 실행되지 않아야합니다. 충돌 전에 얼마나 오래 작동합니까? – KobeJohn

답변

8

heartbeats의 개념이 있습니다. 이는 기본적으로 서버가 클라이언트가 여전히 연결되어 있는지 확인할 수있는 방법입니다.

당신은 당신은 초 N 번호로 코드를 차단

time.sleep(body.count('.')) 

할 때. 즉, 클라이언트가 아직 살아 있는지 확인하기 위해 서버가 heartbeat 프레임을 보내려고하면 코드가 차단되고 하트 비트가 도착했는지 알 수 없으므로 응답을받지 못합니다. 대신이 또한 초 N 수에 대한 코드 "잠"을 만들 것입니다, 그러나 또한 서버와 통신하고 다시 응답 connection.sleep() 사용해야 time.sleep()를 사용

.

sleep(duration)[source] 

    A safer way to sleep than calling time.sleep() directly which will keep the adapter from ignoring frames sent from RabbitMQ. The connection will “sleep” or block the number of seconds specified in duration in small intervals. 
+0

이 답변으로 질문에서 문제가 해결되는 것 같습니다. 나는 그것이 긴 작업과 청취자의 문제를 적절하게 해결하지 못했다고 생각한다. – aitorhh

관련 문제