2016-03-29 31 views
0

私はdjango、django rest frameworkとRabbitmqを使用しています。ユーザーがコメントを作成した後(長いポーリングのように)Rabbitmqを使用してクライアントに通知を送信します。 私はここにRabbitMQ Tutorialsに従います。 Rabbitmqで通知を送信

ここでコメントを作成するには、私のview.pyです:私は、キューコール「task_queue」、および送信されたメッセージを作成

class CommentList(generics.ListCreateAPIView): 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,) 
    queryset = Comment.objects.all() 
    serializer_class = CommentSerializer 

    def perform_create(self, serializer): 
     serializer.save(user=self.request.user) 

    def create(self, request, *args, **kwargs): 
     #use pika and rabbitmq to notifity user 
     connection = pika.BlockingConnection(pika.ConnectionParameters(
       host='localhost')) 
     channel = connection.channel() 
     channel.queue_declare(queue='task_queue', durable=True) 
     message = 'Hello, world' 
     channel.basic_publish(exchange='', 
           routing_key='task_queue', 
           body=message, 
           properties=pika.BasicProperties(
           delivery_mode = 2, # make message persistent 
          )) 
     connection.close()   
     return super().create(request, args, kwargs) 

の「Hello、world」の私が作成するたびに、私はコメント。私が作成した後、私がメッセージを送信することができる

function poll() { 
    var poll_interval=0; 

    $.ajax({ 
     url: "/sub", //sub calls get_notifications() 
     type: 'GET', 
     dataType: 'json', 
     success: function(data) { 
      append_circle(); 
      poll_interval=0; 
     }, 
     error: function() { 
      poll_interval=1000; 
     }, 
     complete: function() { 
      setTimeout(poll, poll_interval); 
     }, 
    }); 
} 

:クライアント側で

def get_notifications(request): 
    connection = pika.BlockingConnection(pika.ConnectionParameters(
     host='localhost')) 
    channel = connection.channel() 

    channel.queue_declare(queue='task_queue', durable=True) 

    def callback(ch, method, properties, body): 
     return HttpResponse("ok") 
     ch.basic_ack(delivery_tag = method.delivery_tag) 

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

    channel.start_consuming() 

、私はデータを要求するためにjqueryのAJAX機能を使用します。ここでは

は、メッセージを受信するための私のview.pyですコメントはありますが、クライアント側にデータが届かない場合は、クロームコンソールで次のように見つけます:

sub/ (pending) xhr 

どうすればいいですか?

+0

これは本当にrabbitmqの目的ではありません。 –

+0

だから私は代わりにdjango-socketioまたはdjangoチャンネルを使うべきですか? – Windsooon

答えて

4

このタイプのアプリケーションでは、Webソケットが最適です。長いポーリングの代わりにWebSocketを使用することをお勧めします。長いポーリングはリソースを必要とするプロセスなので、 Webソケットを使用するには、channels

関連する問題