2016년 1월 29일 금요일

stomp.js 사용하기 (2)

Heart-beating

STOMP broker가 STOMP 1.1 프레임을 허용하면, heart-beating은 기본적으로 사용이 된다.

client 객체는 heartbeat filed를 가지고 있고, incoming과 outgoing integer 필드를 설정할 수 있다.
(기본적으로 두 값은 10000ms로 설정되어 있다.)

client.heartbeat.outgoing = 20000; // client will send heartbeats every 20000ms
client.heartbeat.incoming = 0;     // client does not want to receive heartbeats
                                       // from the server

heart-beating은 주기적으로 heartbeat를 보내고 서버 heartbeat를 체크하기 위해, windows.setInterval()을 사용한다.

Send messages

client가 server에 연결되었을 때, send() 메서드를 통해 STOMP 메세지를 보내는 것이 가능하다.
이 메서드는 STOMP destination과 대응되는 destination 필수 변수를 가지고 있다.
또한, 선택적으로 두 가지 변수 headers (JavaScript object), body(String object)를 가지고 있다.

client.send("/queue/test", {priority: 9}, "Hello, STOMP");

client는 STOMP SEND 프레임을 /queue/test destination 으로 header인 {priority : 9}과 body인 "Hello, STOMP"를 보내게 될 것이다.
만약, 당신이 body를 message에 함께 보내고 싶다면, header를 반드시 보내야 한다. header가 없다면, {}을 사용하면 된다.

client.send(destination, {}, body);

Subscribe and receive messages

server로부터 browser가 메시지를 받기 위해서는, STOMP client는 우선 destination으로 subscribe을 하여야한다.

당신은 destination으로부터 subscribe하기 위해 subscribe() 메서드를 사용할 수 있다. 이 메서드에는 두가지 필수 변수가 있다.
destination : String이며 destination 값
callback : 하나의 메시지 값
또한, 선택적인 값으로 headers(JavaScript object)가 있다.

var subscription = client.subscribe("/queue/test", callback);

subscribe() 메서드는 JavaScript object를 돌려주며, 하나의 attribute(id : client subscription ID)를 가지고 있다.
unsubscribe() 메서드는 이 destination으로부터 subscribe을 중지할 때 사용된다.

var mysubid = '...';
var subscription = client.subscribe(destination, callback, { id: mysubid });

client는 STOMP SUBSCRIBE 프레임을 서버에게 보내고, callback을 등록한다. 서버가 client로 메시지를 보낼 때마다,
client는 메시지에 상응하는 callback을 호출하게 된다.

callback = function(message) {
    // called when the client receives a STOMP message from the server
    if (message.body) {
      alert("got message with body " + message.body)
    } else {
      alert("got empty message");
    }
  });

subscribe() 메서드는 destination에 subscribe을 할 때, 추가적인 headers를 명시하기 위해 선택적인 변수 headers를 제공한다.

var headers = {ack: 'client', 'selector': "location = 'Europe'"};
  client.subscribe("/queue/test", message_callback, headers);

클라이언트는 message acknowledgement를 다루고, 오직 selector location = europe인 메시지에만 반응한다.

만약, 당신이 여러 destination으로부터 subscribe을 원한다면, 당신은 모든 메시지를 받기위해 같은 callback을 사용할 수 있다.

onmessage = function(message) {
    // called every time the client receives a message
  }
  var sub1 = client.subscribe("queue/test", onmessage);
  var sub2 = client.subscribe("queue/another", onmessage);

메시지 받는 것을 중지하기 위해, 클라이언트는 unsubscribe() 메서드를 사용할 수 있다.

var subscription = client.subscribe(...);
  
  ...
  
  subscription.unsubscribe();

JSON support

STOMP 메시지는 반드시 string이어야한다. 만약 당신이 JSON object를 보내고 받기를 원한다면, JSON.stringfy()를 사용할 수 있고,
JSON object를 String으로 바꾸기 위해, JSON.parse()를 사용할 수 있다.

var quote = {symbol: 'APPL', value: 195.46};
  client.send("/topic/stocks", {}, JSON.stringify(quote));

  client.subcribe("/topic/stocks", function(message) {
    var quote = JSON.parse(message.body);
    alert(quote.symbol + " is at " + quote.value);
  };

Acknowledgment

기본적으로, STOMP 메시지는 client로 전송되기 전, 자동으로 server로부터 알려지게 된다.

클라이언트는 subcribe에 의한 메시지 acknowledgement 대신 ack header를 client나 client-individual에 명시할 수 있다.

이 경우에는, server에게 message를 알게 하는 것이 있다는 것을 알리기 위해 message.ack() 메서드를 사용하여야한다.

var subscription = client.subscribe("/queue/test",
    function(message) {
      // do something with the message
      ...
      // and acknowledge it
      message.ack();
    },
    {ack: 'client'}
  );

ack() 메서드는 메시지를 알리는 추가적인 headers를 위해서 headers 변수를 허용한다.
예를 들어, 메시지를 transaction의 부분으로 알리고, ACK STOMP 프레임이 효과적으로 broker에게 전송되었을 때,
receipt를 요청하는 것이 가능하다.

  var tx = client.begin();
  message.ack({ transaction: tx.id, receipt: 'my-receipt' });
  tx.commit();

nack() 메서드는 STOMP 1.1 broker에게 client가 메시지를 소비하지 않았다는 것을 알리기 위해 사용될 수 있다.
이 것은 ack()메서드와 같은 변수를 가진다.

Transactions

메시지는 transaction 안에서 알려지고 보내질 수 있다.

transaction은 begin()메서드를 사용함으로써 시작된다. begin() 메서드는 transaction(String : transaction 안에서 고유한 값으로 설정됨)이라는 선택적인 변수를 가지고 있다.
만약 transaction 값이 없다면, 자동으로 하나를 생성하게 된다.

이 메서드는 javascript object를 돌려주게 되며 transaction id와 매칭되는 id 변수와 두 가지 메서드가 있다.

- commit() to commit the transaction
- abort() to abort the transaction

클라이언트는 transaction id를 포함하는 transaction set을 명시함으로써, transaction 내에서 메시지를 보내거나 알릴 수 있다.

// start the transaction
  var tx = client.begin();
  // send the message in a transaction
  client.send("/queue/test", {transaction: tx.id}, "message in a transaction");
  // commit the transaction to effectively send the message
  tx.commit();

만약 send() 메서드를 호출할 때 transaction header를 넣는 것을 잊었다면, 메시지는 transaction 내에서 수행되지않고,
transaction의 완료를 기다리지 않고 곧바로 보내질 것이다.

var txid = "unique_transaction_identifier";
  // start the transaction
  var tx = client.begin();
  // oops! send the message outside the transaction
  client.send("/queue/test", {}, "I thought I was in a transaction!");
  tx.abort(); // Too late! the message has been sent

Debug

애플리케이셔을 debug하기 위해 어떤 것이 보내지고 받아졌는지를 볼 수 있는 몇몇 test가 code 내에 있다.

클라이언트는 debug property를 function으로 설정할 수 있다. 이 함수에는 모든 debug statement를 보기위한 string 변수가 포함된다.

client.debug = function(str) {
    // append the debug log to a #debug div somewhere in the page using JQuery:
    $("#debug").append(str + "\n");
  };

기본적으로, window의 console 안에서 debug 메시지는 로깅된다.


원본 출처 : http://jmesnil.net/stomp-websocket/doc/

댓글 없음 :

댓글 쓰기