lib/onstomp/interfaces/frame_methods.rb in onstomp-1.0.0 vs lib/onstomp/interfaces/frame_methods.rb in onstomp-1.0.1
- old
+ new
@@ -1,10 +1,26 @@
# -*- encoding: utf-8 -*-
# Mixin for {OnStomp::Client clients} to provide methods that create
# and transmit STOMP {OnStomp::Components::Frame frames}.
module OnStomp::Interfaces::FrameMethods
+ # I'm using @api tags in here to provide a bit of data, here's the format:
+ # gem:<major version>[,<major version>,...] STOMP:<version>[,<version>,...]
+ # The first chunk indicates the MAJOR versions of the OnStomp gem that support
+ # the method. The second chunk indicates the STOMP protocol versions that
+ # support the frame generated by this method. A single '*' after the STOMP
+ # versions indicates that there are minor changes between protocols
+ # (eg: new acceptable values for an optional header.) A single '!' after
+ # the STOMP versions indicates that there are major changes between protocols
+ # (eg: a new header is required, as with ACK) indicating that some ways of
+ # calling the method may produce errors with newer versions of the STOMP
+ # protocol. All other text after the severity markers is for my own reference
+ # to remind me of the changes. These API tags will be queried and put into
+ # a document to provide a quick reference of changes between protocols or
+ # major gem versions for end users.
+
+ # @api gem:1 STOMP:1.0,1.1
# Transmits a SEND frame generated by the client's connection
# @param [String] dest destination for the frame
# @param [String] body body of the frame
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
@@ -12,15 +28,42 @@
# @yield [receipt] block to invoke when a RECEIPT frame is received for the
# transmitted SEND frame
# @yieldparam [OnStomp::Components::Frame] receipt RECEIPT for the frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# SEND frames
+ # @option headers [String] :'content-type' The content type of the SEND
+ # frame's body. If the body is text (ie: has a non-binary `encoding`)
+ # `onstomp` will set the :'content-type' header to 'text/plain' if it
+ # has not been set. See {file:docs/Encodings.md Encodings} for more
+ # details.
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
+ # @option headers [String] :transaction The ID of an existing transaction
+ # to add this frame to.
+ # @option headers [String] :'content-length' If you set this header, it
+ # will be overwritten, so save your fingers from a few keystrokes by not
+ # setting it. All SEND frames generated by `onstomp` will have a
+ # :'content-length' header.
+ # @example
+ # # Transmit a simple SEND frame to the broker
+ # client.send '/queue/example', 'Hello STOMP'
+ #
+ # # Everything's better with umlauts.
+ # client.send '/topic/example', "Hëllo Wörld",
+ # :'content-type' => 'text/plain;charset=UTF-8'
+ #
+ # # Get a receipt for the SEND frame
+ # client.send '/queue/example', "Did you get that thing I sent you?" do |r|
+ # puts "The broker received our SEND frame"
+ # end
def send dest, body, headers={}, &cb
transmit connection.send_frame(dest, body, headers), :receipt => cb
end
alias :puts :send
+ # @api gem:1 STOMP:1.0,1.1* [+ack:client-individual]
# Transmits a SUBSCRIBE frame generated by the client's connection. Depending
# upon the connection, a subscription can be set to various MESSAGE
# acknowledgement modes by setting the +:ack+ header.
# STOMP 1.0 and STOMP 1.1 connections support:
# * :ack => 'auto'
@@ -48,143 +91,261 @@
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# SUBSCRIBE frames
# @see #unsubscribe
# @see #ack
# @see #nack
+ # @option headers [String] :id A unique ID for the subscription. If you
+ # do not set this header, an subscription ID will be automatically
+ # generated ensuring that all `onstomp` SUBSCRIBE frames have an ID.
+ # @option headers [String] :ack ('auto') The ack mode to use with this
+ # subscription. A value of 'auto' means MESSAGE frames are assumed
+ # received and no ACK frame is necessary. A value of 'client' or
+ # 'client-individual' means all MESSAGE frames should be acknowledged
+ # with an ACK (or un-acknowledged with a NACK.)
+ # @option headers [String] :selector A SQL style filter to use against
+ # MESSAGE frames (the form and availability of this will vary by
+ # broker.)
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
+ # @example
+ # # A basic subscription
+ # client.subscribe '/queue/example' do |m|
+ # puts "Got a MESSAGE: #{m.body}"
+ # end
+ #
+ # # ACK our MESSAGE frames
+ # client.subscribe '/queue/example', :ack => 'client' do |m|
+ # client.ack m
+ # puts "Got (and ACK'd) a MESSAGE: #{m.body}"
+ # end
def subscribe dest, headers={}, &cb
transmit connection.subscribe_frame(dest, headers), :subscribe => cb
end
+ # @api gem:1 STOMP:1.0,1.1
# Transmits an UNSUBSCRIBE frame generated by the client's connection.
# @overload unsubscribe(subscribe_frame, headers={})
# Generates an UNSUBSCRIBE frame to match the given SUBSCRIBE frame
# @param [OnStomp::Components::Frame] subscribe_frame
# @param [{#to_sym => #to_s}] headers optional headers to include in
# the UNSUBSCRIBE frame
+ # @example
+ # sub = client.subscribe('/queue/test') { |m| ... }
+ # client.unsubscribe sub
# @overload unsubscribe(id, headers={})
# Generates an UNSUBSCRIBE frame with the given id
# @param [String] id
# @param [{#to_sym => #to_s}] headers optional headers to include in
# the UNSUBSCRIBE frame
+ # @example
+ # client.subscribe('/queue/test', :id => 's-1234') { |m| ... }
+ # client.unsubscribe 's-1234'
# @return [OnStomp::Components::Frame] UNSUBSCRIBE frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# UNSUBSCRIBE frames
# @see #subscribe
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
def unsubscribe frame_or_id, headers={}
transmit connection.unsubscribe_frame(frame_or_id, headers)
end
-
+
+ # @api gem:1 STOMP:1.0,1.1
# Transmits a BEGIN frame generated by the client's connection to start
# a transaction.
# @param [String] tx_id identifier for the transaction
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
# @return [OnStomp::Components::Frame] BEGIN frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# BEGIN frames
# @see #abort
# @see #commit
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
+ # @example
+ # client.begin 't-1234'
+ # client.send '/queue/test', 'hello transaction!', :transaction => 't-1234'
+ # client.commit 't-1234'
def begin tx_id, headers={}
transmit connection.begin_frame(tx_id, headers)
end
-
+
+ # @api gem:1 STOMP:1.0,1.1
# Transmits an ABORT frame generated by the client's connection to rollback
# a transaction.
# @param [String] tx_id identifier for the transaction
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
# @return [OnStomp::Components::Frame] ABORT frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# ABORT frames
# @see #begin
# @see #commit
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
+ # @example
+ # client.begin 't-1234'
+ # client.send '/queue/test', 'hello transaction!', :transaction => 't-1234'
+ # client.abort 't-1234'
def abort tx_id, headers={}
transmit connection.abort_frame(tx_id, headers)
end
-
+
+ # @api gem:1 STOMP:1.0,1.1
# Transmits a COMMIT frame generated by the client's connection to complete
# a transaction.
# @param [String] tx_id identifier for the transaction
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
# @return [OnStomp::Components::Frame] COMMIT frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# COMMIT frames
# @see #abort
# @see #begin
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
+ # @example
+ # client.begin 't-1234'
+ # client.send '/queue/test', 'hello transaction!', :transaction => 't-1234'
+ # client.commit 't-1234'
def commit tx_id, headers={}
transmit connection.commit_frame(tx_id, headers)
end
+ # @api gem:1 STOMP:1.0,1.1* [DISCONNECTs are now always RECEIPTable]
# Transmits a DISCONNECT frame generated by the client's connection to end
# the STOMP session.
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
# @return [OnStomp::Components::Frame] DISCONNECT frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# DISCONNECT frames
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
+ # @example
+ # client.connect
+ # client.send '/queue/test', 'a quick message'
+ # client.disconnect
def disconnect headers={}
transmit connection.disconnect_frame headers
end
+ # @api gem:1 STOMP:1.0,1.1! [+subscription:id]
# Transmits an ACK frame generated by the client's connection.
# @overload ack(message_frame, headers={})
+ # @api gem:1 STOMP:1.0,1.1
# @note Users should use this form whenever possible as it will work
# with STOMP 1.0 and 1.1 connections.
# @param [OnStomp::Components::Frame] message_frame the MESSAGE frame to
# acknowledge.
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
+ # @example
+ # client.subscribe '/queue/test', :ack => 'client' do |m|
+ # if m[:'x-of-interest-to-me'] == 'hells yes'
+ # client.ack m
+ # end
+ # end
# @overload ack(message_id, headers={})
- # @note This form will raise an +ArgumentError+ with STOMP 1.1 connections
+ # @api gem:1 STOMP:1.0
+ # @note This form will raise an `ArgumentError` with STOMP 1.1 connections
# as a subscription ID is also required to ACK a received MESSAGE.
# @param [String] message_id +message-id+ header of MESSAGE frame to
# acknowledge.
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
- # @overload ack(message_id, subscription_id, heders={})
+ # @example
+ # client.subscribe '/queue/test', :ack => 'client' do |m|
+ # if m[:'x-of-interest-to-me'] == 'hells yes'
+ # client.ack m[:'message-id']
+ # end
+ # end
+ # @overload ack(message_id, subscription_id, headers={})
+ # @api gem:1 STOMP:1.0,1.1
# @note This form should be used with STOMP 1.1 connections when it is
# not possible to provide the actual MESSAGE frame.
# @param [String] message_id +message-id+ header of MESSAGE frame to
# acknowledge.
- # @param [String] subscription_id +subscription+ header of MESSAGE frame to
+ # @param [String] subscription_id `subscription` header of MESSAGE frame to
# acknowledge.
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
+ # @example
+ # client.subscribe '/queue/test', :ack => 'client' do |m|
+ # if m[:'x-of-interest-to-me'] == 'hells yes'
+ # client.ack m[:'message-id'], m[:subscription]
+ # end
+ # end
# @return [OnStomp::Components::Frame] ACK frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# ACK frames
# @see #nack
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
+ # @option headers [String] :transaction The ID of an existing transaction
+ # to add this frame to.
def ack *args
transmit connection.ack_frame(*args)
end
+ # @api gem:1 STOMP:1.1
# Transmits a NACK frame generated by the client's connection.
# @overload nack(message_frame, headers={})
# Generates a NACK frame for the given MESSAGE frame.
# @param [OnStomp::Components::Frame] message_frame the MESSAGE frame to
# un-acknowledge.
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
+ # @example
+ # client.subscribe '/queue/test', :ack => 'client' do |m|
+ # if m[:'x-of-interest-to-me'] == 'hells no!'
+ # client.nack m
+ # end
+ # end
# @overload nack(message_id, subscription_id, heders={})
# @param [String] message_id +message-id+ header of MESSAGE frame to
# un-acknowledge.
- # @param [String] subscription_id +subscription+ header of MESSAGE frame to
+ # @param [String] subscription_id `subscription` header of MESSAGE frame to
# un-acknowledge.
# @param [{#to_sym => #to_s}] headers additional headers to include in
# the frame
+ # @example
+ # client.subscribe '/queue/test', :ack => 'client' do |m|
+ # if m[:'x-of-interest-to-me'] == 'hells no!'
+ # client.nack m[:'message-id'], m[:subscription]
+ # end
+ # end
# @return [OnStomp::Components::Frame] NACK frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# NACK frames
# @see #ack
+ # @option headers [String] :receipt A receipt ID for the frame, this
+ # will be matched by the :'receipt-id' header in the broker's RECEIPT
+ # response.
+ # @option headers [String] :transaction The ID of an existing transaction
+ # to add this frame to.
def nack *args
transmit connection.nack_frame(*args)
end
-
+
+ # @api gem:1 STOMP:1.1
# Transmits a client heartbeat frame generated by the client's connection.
# @return [OnStomp::Components::Frame] heartbeat frame
# @raise OnStomp::UnsupportedCommandError if the connection does not support
# heartbeat frames
+ # @example
+ # # If it's been a while since you've sent any data to the broker:
+ # client.beat
+ # # Now the broker knows you're still listening, nay hanging on its every
+ # # every word.
def beat
transmit connection.heartbeat_frame
end
end