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/
댓글 없음 :
댓글 쓰기