123456789_123456789_123456789_123456789_123456789_

Module: EventMachine::Protocols::Stomp

Relationships & Source Files
Namespace Children
Classes:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, LineText2
Defined in: lib/em/protocols/stomp.rb

Overview

Implements Stomp (http://docs.codehaus.org/display/STOMP/Protocol).

Usage example

module StompClient include EM::Protocols::Stomp

def connection_completed connect :login => 'guest', :passcode => 'guest' end

def receive_msg msg if msg.command == "CONNECTED" subscribe '/some/topic' else p ['got a message', msg] puts msg.body end end end

EM.run{ EM.connect 'localhost', 61613, StompClient }

Constant Summary

LineText2 - Included

MaxBinaryLength

Instance Method Summary

LineText2 - Included

#receive_binary_data

S

#receive_data,
#receive_end_of_binary_data

S

#receive_line

S

#set_binary_mode

Alias for #set_text_mode, added for back-compatibility with LineAndTextProtocol.

#set_delimiter

The line delimiter may be a regular expression or a string.

#set_line_mode

Called internally but also exposed to user code, for the case in which processing of binary data creates a need to transition back to line mode.

#set_text_mode,
#unbind

In case of a dropped connection, we'll send a partial buffer to user code when in sized text mode.

Instance Method Details

#ack(msgid)

ACK command, for acknowledging receipt of messages

module StompClient include EM::P::Stomp

def connection_completed connect :login => 'guest', :passcode => 'guest' # subscribe with ack mode subscribe '/some/topic', true end

def receive_msg msg if msg.command == "MESSAGE" ack msg.headers['message-id'] puts msg.body end end end

[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 198

def ack msgid
  send_frame "ACK", 'message-id'=> msgid
end

#connect(parms = {})

CONNECT command, for authentication

connect :login => 'guest', :passcode => 'guest'

[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 159

def connect parms={}
  send_frame "CONNECT", parms
end

#init_message_reader

This method is for internal use only.
[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 143

def init_message_reader
  @stomp_initialized = true
  set_delimiter "\n"
  set_line_mode
  @stomp_message = Message.new
end

#receive_binary_data(data)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 136

def receive_binary_data data
  @stomp_message.body = data[0..-2]
  receive_msg(@stomp_message) if respond_to?(:receive_msg)
  init_message_reader
end

#receive_line(line)

This method is for internal use only.
[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 121

def receive_line line
  @stomp_initialized || init_message_reader
  @stomp_message.consume_line(line) {|outcome|
    if outcome.first == :sized_text
      set_text_mode outcome[1]
    elsif outcome.first == :unsized_text
      set_delimiter "\0"
    elsif outcome.first == :dispatch
      receive_msg(@stomp_message) if respond_to?(:receive_msg)
      init_message_reader
    end
  }
end

#receive_msg(msg)

Invoked with an incoming Stomp::Message received from the STOMP server

[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 151

def receive_msg msg
  # stub, overwrite this in your handler
end

#send(destination, body, parms = {})

SEND command, for publishing messages to a topic

send '/topic/name', 'some message here'

[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 167

def send destination, body, parms={}
  send_frame "SEND", parms.merge( :destination=>destination ), body.to_s
end

#send_frame(verb, headers = {}, body = "")

This method is for internal use only.
[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 106

def send_frame verb, headers={}, body=""
  body = body.to_s
  ary = [verb, "\n"]
  body_bytesize = body.bytesize if body.respond_to? :bytesize
  body_bytesize ||= body.size
  headers.each {|k,v| ary << "#{k}:#{v}\n" }
  ary << "content-length: #{body_bytesize}\n"
  ary << "content-type: text/plain; charset=UTF-8\n" unless headers.has_key? 'content-type'
  ary << "\n"
  ary << body
  ary << "\0"
  send_data ary.join
end

#subscribe(dest, ack = false)

SUBSCRIBE command, for subscribing to topics

subscribe '/topic/name', false

[ GitHub ]

  
# File 'lib/em/protocols/stomp.rb', line 175

def subscribe dest, ack=false
  send_frame "SUBSCRIBE", {:destination=>dest, :ack=>(ack ? "client" : "auto")}
end