Node.js 通过WebSocket发送RabbitMQ消息
正在查找一些代码示例以解决此问题:- 希望编写一些代码(Python或Javascript),充当RabbitMQ队列的订户,以便在接收到消息时通过WebSocket将消息广播到任何连接的客户端 我已经查看了Autobahn和node.js(使用“”和“”),但无法根据需要进行工作。以下是使用node.js的javascript服务器代码:-Node.js 通过WebSocket发送RabbitMQ消息,node.js,websocket,rabbitmq,node-amqp,python-pika,Node.js,Websocket,Rabbitmq,Node Amqp,Python Pika,正在查找一些代码示例以解决此问题:- 希望编写一些代码(Python或Javascript),充当RabbitMQ队列的订户,以便在接收到消息时通过WebSocket将消息广播到任何连接的客户端 我已经查看了Autobahn和node.js(使用“”和“”),但无法根据需要进行工作。以下是使用node.js的javascript服务器代码:- var amqp = require('amqp'); var WebSocketServer = require('ws').Server var c
var amqp = require('amqp');
var WebSocketServer = require('ws').Server
var connection = amqp.createConnection({host: 'localhost'});
var wss = new WebSocketServer({port:8000});
wss.on('connection',function(ws){
ws.on('open', function() {
console.log('connected');
ws.send(Date.now().toString());
});
ws.on('message',function(message){
console.log('Received: %s',message);
ws.send(Date.now().toString());
});
});
connection.on('ready', function(){
connection.queue('MYQUEUE', {durable:true,autoDelete:false},function(queue){
console.log(' [*] Waiting for messages. To exit press CTRL+C')
queue.subscribe(function(msg){
console.log(" [x] Received from MYQUEUE %s",msg.data.toString('utf-8'));
payload = msg.data.toString('utf-8');
// HOW DOES THIS NOW GET SENT VIA WEBSOCKETS ??
});
});
});
使用这段代码,我可以在Rabbit中成功订阅队列,并接收发送到队列的任何消息。同样,我可以将websocket客户端(例如浏览器)连接到服务器并发送/接收消息。但是如何在指定的点以websocket消息的形式发送兔子队列消息的有效负载(“现在如何通过websocket发送此消息”)?我认为这与被困在错误的回调中有关,或者它们需要以某种方式嵌套
或者,如果可以用Python(通过高速公路和皮卡)更轻松地实现这一点,那就太好了
谢谢 实现系统的一种方法是使用python 这里是服务器:
import tornado.ioloop
import tornado.web
import tornado.websocket
import os
import pika
from threading import Thread
clients = []
def threaded_rmq():
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"));
print 'Connected:localhost'
channel = connection.channel()
channel.queue_declare(queue="my_queue")
print 'Consumer ready, on my_queue'
channel.basic_consume(consumer_callback, queue="my_queue", no_ack=True)
channel.start_consuming()
def consumer_callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
for itm in clients:
itm.write_message(body)
class SocketHandler(tornado.websocket.WebSocketHandler):
def open(self):
print "WebSocket opened"
clients.append(self)
def on_message(self, message):
self.write_message(u"You said: " + message)
def on_close(self):
print "WebSocket closed"
clients.remove(self)
class MainHandler(tornado.web.RequestHandler):
def get(self):
print "get page"
self.render("websocket.html")
application = tornado.web.Application([
(r'/ws', SocketHandler),
(r"/", MainHandler),
])
if __name__ == "__main__":
thread = Thread(target = threaded_rmq)
thread.start()
application.listen(8889)
tornado.ioloop.IOLoop.instance().start()
这里是html页面:
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
$(document).ready(function() {
var ws;
if ('WebSocket' in window) {
ws = new WebSocket('ws://localhost:8889/ws');
}
else if ('MozWebSocket' in window) {
ws = new MozWebSocket('ws://localhost:8889/ws');
}
else {
alert("<tr><td> your browser doesn't support web socket </td></tr>");
return;
}
ws.onopen = function(evt) { alert("Connection open ...")};
ws.onmessage = function(evt){
alert(evt.data);
};
function closeConnect(){
ws.close();
}
});
</script>
</head>
<html>
$(文档).ready(函数(){
var-ws;
如果('WebSocket'在窗口中){
ws=newwebsocket('ws://localhost:8889/ws');
}
else if(窗口中的“MozWebSocket”){
ws=new-MozWebSocket('ws://localhost:8889/ws');
}
否则{
警报(“您的浏览器不支持web套接字”);
返回;
}
ws.onopen=函数(evt){alert(“连接打开…”)};
ws.onmessage=函数(evt){
警报(evt.数据);
};
函数closeConnect(){
ws.close();
}
});
因此,当您将消息发布到“my_queue”时,消息将重定向到所有连接的网页
我希望它能有用
编辑**
在这里您可以找到完整的示例如果网页直接访问RabbitMQ是否有问题。?因为更快的方法是:谢谢你的建议。我看过这个插件,但我不想让网页直接访问MQ消息,因为它们需要在可用于网页之前进行处理。谢谢不客气。这只是一个框架,您必须处理close应用程序,现在它不会关闭与rabbitmq的连接!