RabitMQ föratt ta emot meddelanden på en websida med JS?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av RoPa »

Hej,

Jag har lekt lite med RabbitMQ som alternativ till att använda repetitiv pollning av en databas som meddelande kanal.
Det fungerar utmärkt mellan olika python program på servern men nu vill jag få ut meddelandena till en websida.

Idag har jag long polling med XMLHttprequest mot ett PHP server script som i sin tur pollar databasen.
Denna long polling skulle jag vilja byta mot events. Kan man göra det direkt med RabbitMQ eller krävs det något mer?
Har hittat lite info om node.js och rabbit.js men hittar inte tillräckligt med "how to do it" för att jag ska förstå hur jag ska komma igång...

Någon som kan tipsa mig hur eller peka på någon bre tutorial?
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av johano »

RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av RoPa »

Tack,

Har sett den "klicka förbi" men inte fastnat för den.
Har nu provat det spåret och fastnar på

Kod: Markera allt

<script>
    var ws = new SockJS('http://rpi-3:15674/stomp');
    var client = Stomp.over(ws);

    var on_connect = function() {
Med felmeddelande

Kod: Markera allt

Uncaught ReferenceError: Stomp is not defined
Jag kör Rabbit MQ på en raspberry pi, om det kan vara till en ledtråd (kanske framgår av hostnamnet... rpi-3...)
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av RoPa »

Mera...

Genom att använda dessa

Kod: Markera allt

<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.m$
//<script src="http://rpi-3/stomp.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/0.3.4/so$
Så får jag inte längre det felet utan detta fel

Kod: Markera allt

Web Socket Opened...
stomp.min.js:8 >>> CONNECT
login:guest
passcode:guest
host:/
accept-version:1.1,1.0
heart-beat:10000,10000

<<< ERROR
message:Bad CONNECT
content-type:text/plain
version:1.0,1.1,1.2
content-length:26

non-loopback access denied
Tror det har med att guest inte får ansluta utanför localhost och att jag måste skapa en config fil som ändrar default configen...
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av RoPa »

Hej igen,

Då var jag förbi det problemet men nu fastnar jag på detta

Kod: Markera allt

<<< CONNECTED
session:session-WY7CD5rvGjPGqHYq94ROHw
heart-beat:10000,10000
server:RabbitMQ/3.5.1
version:1.1

connected to server RabbitMQ/3.5.1
send PING every 10000ms
check PONG every 10000ms
connected

>>> PING
did not receive server activity for the last 20008ms
Whoops! Lost connection to undefined
error
Jag har med detta i config filen för att försöka stänga av heartbeat vilket jag har för mig att jag såg inte skulle funka på Pi.

Kod: Markera allt

[
    {rabbit,[
    {loopback_users,[]},
    {heartbeat, 0}
    ]}
].
Irriterande nog kan jag inte längre hitta någon sida om RabbitMQ och Web Stomp på Pi... :(
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av RoPa »

Hittade detta...

Kod: Markera allt

    // SockJS does not support heart-beat: disable heart-beats
    client.heartbeat.outgoing = 0;
    client.heartbeat.incoming = 0;
Så nu fastnar jag inte där längre, var inte Pi'n som inte kunde det utan SockJS! :D
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av RoPa »

Små steg...

Nu kan jag skicka data från ett Py script via RabbitMQ til lett annat script och till ett web javascript :)

Men... de skickas ut som man delar ut kort, "roundrobin" :(
Försöker få till det med fanout och publish/subscribe men det vill inte... kanske för trött :wacko:
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av RoPa »

Där satt den! :whoho:
Nu kan jag skicka meddelanden från en process och ta emot dem i en annan process och i en webbsida! (fanout)
Nu används databasen enbart för att skapa en logg och kunna visa historik.
Nästa steg att att skicka data från webbsidan också men det känns som att det kommer att funka nu.

@johano, tack för länken!
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av johano »

Kul!
Jag har inte använt RabbitMQ från webbklient själv så det är intressant att följa.

/johan
RoPa
Inlägg: 630
Blev medlem: 13 januari 2006, 10:32:06

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av RoPa »

Slå bara på web-stomp tillägget i RabbitMQ så är det klart att köra.
Här är min test klient (lite orensad från rester av tester), kastar upp en alert ruta för varje meddelande.
Denna lyssnar till en exchange av typ fanout så fler kan lyssna.

Kod: Markera allt

<html>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
//<script src="sockjs-0.3.js"></script>
<script src="stomp.js"></script>
//  <script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
// <script src="http://rpi-3/stomp.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/0.3.4/sockjs.min.js"></script>

<h1>Did it work?</h1>
<script>
    var ws = new SockJS('http://rpi-3:15674/stomp');
    var client = Stomp.over(ws);

    // SockJS does not support heart-beat: disable heart-beats
    client.heartbeat.outgoing = 0;
    client.heartbeat.incoming = 0;

    var callback = function(message) {
      if (message.body) {
        alert("got message with body " + message.body)
      } else {
        alert("got empty message");
      }
    };

    var on_connect = function() {
      console.log('connected');
      id = client.subscribe('/exchange/broadcast', callback);
    };

    var on_error =  function() {
        console.log('error');
    };

    client.connect('guest', 'guest', on_connect, on_error, '/');

</script>
<p>This is the RabbitMQ web stomp test page.</p>
<p>No functionality has been added to this server yet!</p>
</body>
</html>
Larsson90
Inlägg: 646
Blev medlem: 24 december 2008, 21:43:25
Ort: Göteborg

Re: RabitMQ föratt ta emot meddelanden på en websida med JS?

Inlägg av Larsson90 »

SockJS (nodejs) och RabbitMQ är utvecklade av samma utvecklare om jag inte missminner mig (i alla fall multiplex modulen). Kör RabbitMQ tillsammans med Asterisk som publiceras till diverse plattformar på jobbet.
Skriv svar