stomper 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/{spec/spec.opts → .rspec} +0 -2
- data/Gemfile +4 -0
- data/LICENSE +201 -201
- data/README.md +130 -0
- data/Rakefile +5 -0
- data/examples/basic.rb +38 -0
- data/examples/events.rb +54 -0
- data/features/acking_messages.feature +147 -0
- data/features/disconnecting.feature +12 -0
- data/features/establish_connection.feature +44 -0
- data/features/protocol_version_negotiation.feature +61 -0
- data/features/receipts.feature +72 -0
- data/features/scopes.feature +32 -0
- data/features/secure_connections.feature +38 -0
- data/features/send_and_message.feature +28 -0
- data/features/steps/acking_messages_steps.rb +39 -0
- data/features/steps/disconnecting_steps.rb +8 -0
- data/features/steps/establish_connection_steps.rb +74 -0
- data/features/steps/frame_transmission_steps.rb +35 -0
- data/features/steps/protocol_version_negotiation_steps.rb +15 -0
- data/features/steps/receipts_steps.rb +79 -0
- data/features/steps/scopes_steps.rb +52 -0
- data/features/steps/secure_connections_steps.rb +41 -0
- data/features/steps/send_and_message_steps.rb +35 -0
- data/features/steps/subscribing_steps.rb +36 -0
- data/features/steps/threaded_receiver_steps.rb +8 -0
- data/features/steps/transactions_steps.rb +0 -0
- data/features/subscribing.feature +151 -0
- data/features/support/env.rb +11 -0
- data/features/support/header_helpers.rb +12 -0
- data/features/support/ssl/README +6 -0
- data/features/support/ssl/broker_cert.csr +17 -0
- data/features/support/ssl/broker_cert.pem +72 -0
- data/features/support/ssl/broker_key.pem +27 -0
- data/features/support/ssl/client_cert.csr +17 -0
- data/features/support/ssl/client_cert.pem +72 -0
- data/features/support/ssl/client_key.pem +27 -0
- data/features/support/ssl/demoCA/cacert.pem +17 -0
- data/features/support/ssl/demoCA/index.txt +2 -0
- data/features/support/ssl/demoCA/index.txt.attr +1 -0
- data/features/support/ssl/demoCA/index.txt.attr.old +1 -0
- data/features/support/ssl/demoCA/index.txt.old +1 -0
- data/features/support/ssl/demoCA/newcerts/01.pem +72 -0
- data/features/support/ssl/demoCA/newcerts/02.pem +72 -0
- data/features/support/ssl/demoCA/private/cakey.pem +17 -0
- data/features/support/ssl/demoCA/serial +1 -0
- data/features/support/ssl/demoCA/serial.old +1 -0
- data/features/support/test_stomp_server.rb +150 -0
- data/features/threaded_receiver.feature +11 -0
- data/features/transactions.feature +66 -0
- data/lib/stomper.rb +30 -20
- data/lib/stomper/connection.rb +442 -102
- data/lib/stomper/errors.rb +59 -0
- data/lib/stomper/extensions.rb +10 -0
- data/lib/stomper/extensions/common.rb +258 -0
- data/lib/stomper/extensions/events.rb +213 -0
- data/lib/stomper/extensions/heartbeat.rb +101 -0
- data/lib/stomper/extensions/scoping.rb +56 -0
- data/lib/stomper/frame.rb +54 -0
- data/lib/stomper/frame_serializer.rb +217 -0
- data/lib/stomper/headers.rb +15 -0
- data/lib/stomper/receipt_manager.rb +36 -0
- data/lib/stomper/receivers.rb +7 -0
- data/lib/stomper/receivers/threaded.rb +71 -0
- data/lib/stomper/scopes.rb +9 -0
- data/lib/stomper/scopes/header_scope.rb +49 -0
- data/lib/stomper/scopes/receipt_scope.rb +44 -0
- data/lib/stomper/scopes/transaction_scope.rb +109 -0
- data/lib/stomper/sockets.rb +66 -28
- data/lib/stomper/subscription_manager.rb +79 -0
- data/lib/stomper/support.rb +68 -0
- data/lib/stomper/support/1.8/frame_serializer.rb +53 -0
- data/lib/stomper/support/1.8/headers.rb +183 -0
- data/lib/stomper/support/1.9/frame_serializer.rb +64 -0
- data/lib/stomper/support/1.9/headers.rb +172 -0
- data/lib/stomper/support/ruby.rb +13 -0
- data/lib/stomper/uris.rb +49 -0
- data/lib/stomper/version.rb +7 -0
- data/spec/spec_helper.rb +13 -9
- data/spec/stomper/connection_spec.rb +712 -0
- data/spec/stomper/extensions/common_spec.rb +187 -0
- data/spec/stomper/extensions/events_spec.rb +78 -0
- data/spec/stomper/extensions/heartbeat_spec.rb +103 -0
- data/spec/stomper/extensions/scoping_spec.rb +21 -0
- data/spec/stomper/frame_serializer_1.8_spec.rb +318 -0
- data/spec/stomper/frame_serializer_spec.rb +316 -0
- data/spec/stomper/frame_spec.rb +36 -0
- data/spec/stomper/headers_spec.rb +224 -0
- data/spec/stomper/receipt_manager_spec.rb +91 -0
- data/spec/stomper/receivers/threaded_spec.rb +116 -0
- data/spec/stomper/scopes/header_scope_spec.rb +42 -0
- data/spec/stomper/scopes/receipt_scope_spec.rb +51 -0
- data/spec/stomper/scopes/transaction_scope_spec.rb +183 -0
- data/spec/stomper/sockets_spec.rb +113 -0
- data/spec/stomper/subscription_manager_spec.rb +107 -0
- data/spec/stomper/support_spec.rb +69 -0
- data/spec/stomper/uris_spec.rb +54 -0
- data/spec/stomper_spec.rb +9 -0
- data/spec/support/custom_argument_matchers.rb +57 -0
- data/spec/support/existential_frame_matchers.rb +19 -0
- data/spec/support/frame_header_matchers.rb +10 -0
- data/stomper.gemspec +30 -0
- metadata +272 -97
- data/AUTHORS +0 -21
- data/CHANGELOG +0 -20
- data/README.rdoc +0 -120
- data/lib/stomper/client.rb +0 -34
- data/lib/stomper/frame_reader.rb +0 -73
- data/lib/stomper/frame_writer.rb +0 -21
- data/lib/stomper/frames.rb +0 -39
- data/lib/stomper/frames/abort.rb +0 -10
- data/lib/stomper/frames/ack.rb +0 -25
- data/lib/stomper/frames/begin.rb +0 -11
- data/lib/stomper/frames/client_frame.rb +0 -89
- data/lib/stomper/frames/commit.rb +0 -10
- data/lib/stomper/frames/connect.rb +0 -10
- data/lib/stomper/frames/connected.rb +0 -30
- data/lib/stomper/frames/disconnect.rb +0 -10
- data/lib/stomper/frames/error.rb +0 -21
- data/lib/stomper/frames/message.rb +0 -48
- data/lib/stomper/frames/receipt.rb +0 -19
- data/lib/stomper/frames/send.rb +0 -10
- data/lib/stomper/frames/server_frame.rb +0 -38
- data/lib/stomper/frames/subscribe.rb +0 -42
- data/lib/stomper/frames/unsubscribe.rb +0 -19
- data/lib/stomper/open_uri_interface.rb +0 -41
- data/lib/stomper/receipt_handlers.rb +0 -23
- data/lib/stomper/receiptor.rb +0 -38
- data/lib/stomper/subscriber.rb +0 -76
- data/lib/stomper/subscription.rb +0 -128
- data/lib/stomper/subscriptions.rb +0 -95
- data/lib/stomper/threaded_receiver.rb +0 -59
- data/lib/stomper/transaction.rb +0 -185
- data/lib/stomper/transactor.rb +0 -50
- data/lib/stomper/uri.rb +0 -55
- data/spec/client_spec.rb +0 -29
- data/spec/connection_spec.rb +0 -22
- data/spec/frame_reader_spec.rb +0 -37
- data/spec/frame_writer_spec.rb +0 -27
- data/spec/frames/client_frame_spec.rb +0 -66
- data/spec/frames/indirect_frame_spec.rb +0 -45
- data/spec/frames/server_frame_spec.rb +0 -85
- data/spec/open_uri_interface_spec.rb +0 -132
- data/spec/receiptor_spec.rb +0 -35
- data/spec/shared_connection_examples.rb +0 -79
- data/spec/subscriber_spec.rb +0 -77
- data/spec/subscription_spec.rb +0 -157
- data/spec/subscriptions_spec.rb +0 -145
- data/spec/threaded_receiver_spec.rb +0 -33
- data/spec/transaction_spec.rb +0 -139
- data/spec/transactor_spec.rb +0 -46
@@ -1,10 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a "COMMIT" frame from the Stomp Protocol.
|
4
|
-
class Commit < Stomper::Frames::ClientFrame
|
5
|
-
def initialize(transaction_id, headers={})
|
6
|
-
super(headers.merge({ :transaction => transaction_id }))
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a "CONNECT" frame from the Stomp Protocol.
|
4
|
-
class Connect < Stomper::Frames::ClientFrame
|
5
|
-
def initialize(login='', passcode='', headers={})
|
6
|
-
super(headers.merge({ :login => login, :passcode => passcode }))
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a "CONNECTED" server side frame for the Stomp Protocol.
|
4
|
-
class Connected < Stomper::Frames::ServerFrame
|
5
|
-
|
6
|
-
# Builds a Connected frame instance with the supplied
|
7
|
-
# +headers+ and +body+
|
8
|
-
def initialize(headers, body)
|
9
|
-
super(headers, body)
|
10
|
-
end
|
11
|
-
|
12
|
-
# A convenience method that returns the value of
|
13
|
-
# the session header, if it is set.
|
14
|
-
#
|
15
|
-
# This value can also be accessed as:
|
16
|
-
# frame.headers[:session]
|
17
|
-
def session
|
18
|
-
@headers[:session]
|
19
|
-
end
|
20
|
-
|
21
|
-
def perform
|
22
|
-
# TODO: I want the frames, particularly the server frames, to know
|
23
|
-
# 'what to do' when they are received. For instance, when a CONNECTED
|
24
|
-
# frame is received, the connection it is received on should be marked
|
25
|
-
# as being "connected". This way we can get rid of the various conditional
|
26
|
-
# behavior based on Frame classes in connection and client.
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
data/lib/stomper/frames/error.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates an "ERROR" server side frame for the Stomp Protocol.
|
4
|
-
class Error < Stomper::Frames::ServerFrame
|
5
|
-
|
6
|
-
# Creates a new Error frame with the supplied +headers+ and +body+
|
7
|
-
def initialize(headers, body)
|
8
|
-
super(headers, body)
|
9
|
-
end
|
10
|
-
|
11
|
-
# Returns the message responsible for the generation of this Error frame,
|
12
|
-
# if applicable.
|
13
|
-
#
|
14
|
-
# This is a convenience method for:
|
15
|
-
# frame.headers[:message]
|
16
|
-
def message
|
17
|
-
@headers[:message]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a "MESSAGE" server side frame for the Stomp Protocol.
|
4
|
-
class Message < Stomper::Frames::ServerFrame
|
5
|
-
|
6
|
-
# Creates a new message frame with the given +headers+ and +body+
|
7
|
-
def initialize(headers, body)
|
8
|
-
super(headers, body)
|
9
|
-
end
|
10
|
-
|
11
|
-
# Returns the message id generated by the stomp broker.
|
12
|
-
#
|
13
|
-
# This is a convenience method for:
|
14
|
-
# frame.headers[:'message-id']
|
15
|
-
def id
|
16
|
-
@headers[:'message-id']
|
17
|
-
end
|
18
|
-
|
19
|
-
# Returns the destination from which this message was delivered.
|
20
|
-
#
|
21
|
-
# This is a convenience method for:
|
22
|
-
# frame.headers[:destination]
|
23
|
-
def destination
|
24
|
-
@headers[:destination]
|
25
|
-
end
|
26
|
-
|
27
|
-
# Returns the name of the subscription which is responsible for the
|
28
|
-
# client having received this message.
|
29
|
-
#
|
30
|
-
# This is a convenience method for:
|
31
|
-
# frame.headers[:subscription]
|
32
|
-
def subscription
|
33
|
-
@headers[:subscription]
|
34
|
-
end
|
35
|
-
|
36
|
-
def perform
|
37
|
-
# TODO: I want the frames, particularly the server frames, to know
|
38
|
-
# 'what to do' when they are received. For instance, when a MESSAGE
|
39
|
-
# frame is received, the message should be applied to all
|
40
|
-
# stored subscriptions on the receiving connection. This will
|
41
|
-
# remove the conditional branching in the Client class, and provide
|
42
|
-
# a more flexible means of adding additional behaviors, instead of
|
43
|
-
# relying on what is sure to become a giant case statement in Client
|
44
|
-
# if we must change state on other Frames later.
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a "RECEIPT" server side frame for the Stomp Protocol.
|
4
|
-
class Receipt < Stomper::Frames::ServerFrame
|
5
|
-
|
6
|
-
# Creates a new Receipt frame with the supplied +headers+ and +body+
|
7
|
-
def initialize(headers, body)
|
8
|
-
super(headers, body)
|
9
|
-
end
|
10
|
-
|
11
|
-
# Returns the 'receipt-id' header of the frame, which
|
12
|
-
# will correspond to the 'receipt' header of the message
|
13
|
-
# that caused this receipt to be sent by the stomp broker.
|
14
|
-
def for
|
15
|
-
@headers[:'receipt-id']
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/stomper/frames/send.rb
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a "SEND" frame from the Stomp Protocol.
|
4
|
-
class Send < Stomper::Frames::ClientFrame
|
5
|
-
def initialize(destination, body, headers={})
|
6
|
-
super(headers.merge({ :destination => destination }), body)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a server side frame for the Stomp Protocol.
|
4
|
-
class ServerFrame < IndirectFrame
|
5
|
-
|
6
|
-
# Creates a new server frame corresponding to the
|
7
|
-
# supplied +command+ with the given +headers+ and +body+.
|
8
|
-
def initialize(headers={}, body=nil, command = nil)
|
9
|
-
super
|
10
|
-
end
|
11
|
-
|
12
|
-
class << self
|
13
|
-
def inherited(server_frame) #:nodoc:
|
14
|
-
declared_frames << { :class => server_frame, :command => server_frame.name.split("::").last.downcase.to_sym }
|
15
|
-
end
|
16
|
-
|
17
|
-
def declared_frames
|
18
|
-
@declared_frames ||= []
|
19
|
-
end
|
20
|
-
|
21
|
-
# Builds a new ServerFrame instance by first checking to
|
22
|
-
# see if some subclass of ServerFrame has registered itself
|
23
|
-
# as a builder of the particular command. If so, a new
|
24
|
-
# instance of that subclass is created, otherwise a generic
|
25
|
-
# ServerFrame instance is created with its +command+ attribute
|
26
|
-
# set appropriately.
|
27
|
-
def build(command, headers, body)
|
28
|
-
com_sym = command.downcase.to_sym
|
29
|
-
if klass = declared_frames.detect { |frame| com_sym == frame[:command] }
|
30
|
-
klass[:class].new(headers, body)
|
31
|
-
else
|
32
|
-
ServerFrame.new(headers, body, command)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates a "SUBSCRIBE" frame from the Stomp Protocol.
|
4
|
-
class Subscribe < Stomper::Frames::ClientFrame
|
5
|
-
def initialize(destination, headers={})
|
6
|
-
super({ :ack => 'auto' }.merge(headers).merge({ :destination => destination }))
|
7
|
-
end
|
8
|
-
|
9
|
-
# Returns the ack mode of this subscription. (defaults to 'auto')
|
10
|
-
#
|
11
|
-
# This is a convenience method, and may also be accessed through
|
12
|
-
# frame.headers[:ack]
|
13
|
-
def ack
|
14
|
-
@headers[:ack]
|
15
|
-
end
|
16
|
-
|
17
|
-
# Returns the destination to which we are subscribing.
|
18
|
-
#
|
19
|
-
# This is a convenience method, and may also be accessed through
|
20
|
-
# frame.headers[:destination]
|
21
|
-
def destination
|
22
|
-
@headers[:destination]
|
23
|
-
end
|
24
|
-
|
25
|
-
# Returns the id of this subscription, if it has been set.
|
26
|
-
#
|
27
|
-
# This is a convenience method, and may also be accessed through
|
28
|
-
# frame.headers[:id]
|
29
|
-
def id
|
30
|
-
@headers[:id]
|
31
|
-
end
|
32
|
-
|
33
|
-
# Returns the selector header of this subscription, if it has been set.
|
34
|
-
#
|
35
|
-
# This is a convenience method, and may also be accessed through
|
36
|
-
# frame.headers[:selector]
|
37
|
-
def selector
|
38
|
-
@headers[:selector]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Frames
|
3
|
-
# Encapsulates an "UNSUBSCRIBE" frame from the Stomp Protocol.
|
4
|
-
class Unsubscribe < Stomper::Frames::ClientFrame
|
5
|
-
def initialize(destination, headers={})
|
6
|
-
super(headers.merge({ :destination => destination }))
|
7
|
-
end
|
8
|
-
|
9
|
-
# Returns the id of the subscription being unsubscribed from, if it
|
10
|
-
# exists.
|
11
|
-
#
|
12
|
-
# This is a convenience method, and may also be accessed through
|
13
|
-
# frame.headers[:id]
|
14
|
-
def id
|
15
|
-
@headers[:id]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module OpenUriInterface
|
3
|
-
def put(msg, headers={})
|
4
|
-
send(default_destination, msg, headers.merge(:generate_content_length => false))
|
5
|
-
end
|
6
|
-
alias_method :puts, :put
|
7
|
-
|
8
|
-
def write(msg, headers={})
|
9
|
-
send(default_destination, msg, headers.merge(:generate_content_length => true))
|
10
|
-
end
|
11
|
-
|
12
|
-
def first(n=1)
|
13
|
-
received = []
|
14
|
-
each do |m|
|
15
|
-
received << m
|
16
|
-
break if received.size == n
|
17
|
-
end
|
18
|
-
n == 1 ? received.first : received
|
19
|
-
end
|
20
|
-
alias_method :get, :first
|
21
|
-
alias_method :gets, :first
|
22
|
-
alias_method :read, :first
|
23
|
-
|
24
|
-
# This is the tricky one.
|
25
|
-
# The subscriber interface is not going to work here, because it is built
|
26
|
-
# for an entirely different use case (threaded receiving)
|
27
|
-
# This interface, by contrast, is blocking... fudge.
|
28
|
-
def each(&block)
|
29
|
-
subscription = subscribe(default_destination) { |m| m }
|
30
|
-
loop do
|
31
|
-
m = receive
|
32
|
-
yield m if m.is_a?(Stomper::Frames::Message) && subscription.accepts?(m)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
def default_destination
|
38
|
-
uri.path
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
class ReceiptHandlers
|
3
|
-
def initialize
|
4
|
-
@recps = {}
|
5
|
-
@recp_lock = Mutex.new
|
6
|
-
end
|
7
|
-
|
8
|
-
def add(receipt_id, callback)
|
9
|
-
@recp_lock.synchronize { @recps[receipt_id] = callback }
|
10
|
-
end
|
11
|
-
|
12
|
-
def size
|
13
|
-
@recps.size
|
14
|
-
end
|
15
|
-
|
16
|
-
def perform(receipt)
|
17
|
-
@recp_lock.synchronize do
|
18
|
-
callback = @recps.delete(receipt.for)
|
19
|
-
callback.call(receipt) if callback
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/stomper/receiptor.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Receiptor
|
3
|
-
def self.included(base)
|
4
|
-
if base.method_defined?(:receive)
|
5
|
-
base.instance_eval do
|
6
|
-
alias_method :receive_without_receipt_dispatch, :receive
|
7
|
-
alias_method :receive, :receive_with_receipt_dispatch
|
8
|
-
end
|
9
|
-
end
|
10
|
-
if base.method_defined?(:send)
|
11
|
-
base.instance_eval do
|
12
|
-
alias_method :send_without_receipt_handler, :send
|
13
|
-
alias_method :send, :send_with_receipt_handler
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# Receives a frame and dispatches it to the known receipt handlers, if the
|
19
|
-
# received frame is a RECEIPT frame.
|
20
|
-
def receive_with_receipt_dispatch
|
21
|
-
frame = receive_without_receipt_dispatch
|
22
|
-
receipt_handlers.perform(frame) if frame.is_a?(::Stomper::Frames::Receipt)
|
23
|
-
frame
|
24
|
-
end
|
25
|
-
|
26
|
-
def send_with_receipt_handler(destination, body, headers={}, &block)
|
27
|
-
if block_given?
|
28
|
-
headers[:receipt] ||= "rcpt-#{Time.now.to_f}"
|
29
|
-
receipt_handlers.add(headers[:receipt], block)
|
30
|
-
end
|
31
|
-
send_without_receipt_handler(destination, body, headers)
|
32
|
-
end
|
33
|
-
|
34
|
-
def receipt_handlers
|
35
|
-
@receipt_handlers ||= ::Stomper::ReceiptHandlers.new
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/stomper/subscriber.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
module Stomper
|
2
|
-
module Subscriber
|
3
|
-
def self.included(base)
|
4
|
-
if base.method_defined?(:receive)
|
5
|
-
base.instance_eval do
|
6
|
-
alias_method :receive_without_message_dispatch, :receive
|
7
|
-
alias_method :receive, :receive_with_message_dispatch
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
# Receives a frame and dispatches it to the known subscriptions, if the
|
13
|
-
# received frame is a MESSAGE frame.
|
14
|
-
def receive_with_message_dispatch
|
15
|
-
frame = receive_without_message_dispatch
|
16
|
-
subscriptions.perform(frame) if frame.is_a?(::Stomper::Frames::Message)
|
17
|
-
frame
|
18
|
-
end
|
19
|
-
|
20
|
-
# Subscribes to the specified +destination+, passing along
|
21
|
-
# the optional +headers+ inside the subscription frame. When a message
|
22
|
-
# is received for this subscription, the supplied +block+ is
|
23
|
-
# called with the received message as its argument.
|
24
|
-
#
|
25
|
-
# Examples:
|
26
|
-
#
|
27
|
-
# client.subscribe("/queue/test") { |msg| puts "Got message: #{msg.body}" }
|
28
|
-
#
|
29
|
-
# client.subscribe("/queue/test", :ack => 'client', 'id' => 'subscription-001') do |msg|
|
30
|
-
# puts "Got message: #{msg.body}"
|
31
|
-
# end
|
32
|
-
#
|
33
|
-
# client.subscribe("/queue/test", :selector => 'cost > 5') do |msg|
|
34
|
-
# puts "Got message: #{msg.body}"
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
# See also: unsubscribe, Stomper::Subscription
|
38
|
-
def subscribe(destination, headers={}, &block)
|
39
|
-
unless destination.is_a?(Subscription)
|
40
|
-
destination = Subscription.new(headers.merge(:destination => destination), &block)
|
41
|
-
end
|
42
|
-
subscriptions << destination
|
43
|
-
transmit(destination.to_subscribe)
|
44
|
-
destination
|
45
|
-
end
|
46
|
-
|
47
|
-
# Unsubscribes from the specified +destination+. The +destination+
|
48
|
-
# parameter may be either a string, such as "/queue/test", or Stomper::Subscription
|
49
|
-
# object. If the optional +sub_id+ is supplied, the client will unsubscribe
|
50
|
-
# from the subscription with an id matching +sub_id+, regardless if the
|
51
|
-
# +destination+ parameter matches that of the registered subscription. For
|
52
|
-
# this reason, it is vital that subscription ids, if manually specified, be
|
53
|
-
# unique.
|
54
|
-
#
|
55
|
-
# Examples:
|
56
|
-
#
|
57
|
-
# client.unsubscribe("/queue/test")
|
58
|
-
# # unsubscribes from all "naive" subscriptions for "/queue/test"
|
59
|
-
#
|
60
|
-
# client.unsubscribe("/queue/does/not/matter", "sub-0013012031")
|
61
|
-
# # unsubscribes from all subscriptions with id of "sub-0013012031"
|
62
|
-
#
|
63
|
-
# client.unsubscribe(some_subscription)
|
64
|
-
#
|
65
|
-
# See also: subscribe, Stomper::Subscription
|
66
|
-
def unsubscribe(destination, sub_id=nil)
|
67
|
-
subscriptions.remove(destination, sub_id).each do |unsub|
|
68
|
-
transmit(unsub.to_unsubscribe)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def subscriptions
|
73
|
-
@subscriptions ||= ::Stomper::Subscriptions.new
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|