Module: EventMachine::Protocols::Stomp

Includes:
LineText2
Defined in:
lib/protocols/stomp.rb

Overview

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

Usage example

class StompClient < EM::Connection
  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
}

Defined Under Namespace

Classes: Message

Constant Summary

Constants included from LineText2

LineText2::MaxBinaryLength, LineText2::MaxLineLength

Instance Method Summary collapse

Methods included from LineText2

#receive_data, #receive_end_of_binary_data, #set_binary_mode, #set_delimiter, #set_line_mode, #set_text_mode, #unbind

Instance Method Details

#ack(msgid) ⇒ Object



146
147
148
# File 'lib/protocols/stomp.rb', line 146

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

#connect(parms = {}) ⇒ Object

STOMP verbs



137
138
139
# File 'lib/protocols/stomp.rb', line 137

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

#init_message_readerObject



128
129
130
131
132
133
# File 'lib/protocols/stomp.rb', line 128

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

#receive_binary_data(data) ⇒ Object



122
123
124
125
126
# File 'lib/protocols/stomp.rb', line 122

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) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/protocols/stomp.rb', line 109

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

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



140
141
142
# File 'lib/protocols/stomp.rb', line 140

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

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



98
99
100
101
102
103
104
105
106
107
# File 'lib/protocols/stomp.rb', line 98

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

#subscribe(dest, ack = false) ⇒ Object



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

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