stomp 1.1.10 → 1.2.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/CHANGELOG.rdoc +17 -0
- data/README.rdoc +11 -3
- data/Rakefile +2 -2
- data/bin/catstomp +3 -3
- data/examples/client11_ex1.rb +78 -0
- data/examples/client11_putget1.rb +57 -0
- data/examples/conn11_ex1.rb +101 -0
- data/examples/conn11_ex2.rb +75 -0
- data/examples/conn11_hb1.rb +46 -0
- data/examples/consumer.rb +2 -0
- data/examples/get11conn_ex1.rb +107 -0
- data/examples/get11conn_ex2.rb +67 -0
- data/examples/logexamp.rb +18 -2
- data/examples/publisher.rb +2 -0
- data/examples/put11conn_ex1.rb +43 -0
- data/examples/putget11_rh1.rb +81 -0
- data/examples/slogger.rb +79 -1
- data/examples/stomp11_common.rb +45 -0
- data/examples/topic_consumer.rb +19 -0
- data/examples/topic_publisher.rb +15 -0
- data/lib/stomp.rb +4 -0
- data/lib/stomp/client.rb +36 -4
- data/lib/stomp/codec.rb +41 -0
- data/lib/stomp/connection.rb +623 -29
- data/lib/stomp/constants.rb +78 -0
- data/lib/stomp/errors.rb +60 -2
- data/lib/stomp/ext/hash.rb +3 -1
- data/lib/stomp/message.rb +32 -3
- data/lib/stomp/version.rb +4 -2
- data/spec/client_shared_examples.rb +2 -0
- data/spec/client_spec.rb +2 -0
- data/spec/connection_spec.rb +30 -9
- data/spec/message_spec.rb +2 -0
- data/spec/spec_helper.rb +2 -0
- data/stomp.gemspec +25 -24
- data/test/test_client.rb +152 -44
- data/test/test_codec.rb +83 -0
- data/test/test_connection.rb +138 -25
- data/test/test_connection1p.rb +251 -0
- data/test/test_helper.rb +48 -0
- data/test/test_message.rb +69 -19
- data/test/tlogger.rb +155 -0
- metadata +52 -69
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
== 1.2.0 2011-14-12
|
2
|
+
|
3
|
+
* Stomp 1.1 protocol support. A significant change. Please test existing 1.0 code well. See the examples directory for 1.1 examples.
|
4
|
+
* Accept :reliable in a Stomp::Client connection hash
|
5
|
+
* Add connect timeout with hashed parameters
|
6
|
+
* Do not allow calls after close/disconnect
|
7
|
+
* Enhance supported logger callbacks
|
8
|
+
* Fix subscription id in find_listener
|
9
|
+
* Start to bootstrap STOMP 1.1 support
|
10
|
+
|
11
|
+
== 1.1.10 2011-07-11
|
12
|
+
|
13
|
+
* Fixes for JRuby support
|
14
|
+
* Fix EOF error on disconnect
|
15
|
+
* Refactoring and additional test
|
16
|
+
* Set up tests for use of RabbitMQ
|
17
|
+
|
1
18
|
== 1.1.9 2011-15-06
|
2
19
|
|
3
20
|
* Support wildcard destinations
|
data/README.rdoc
CHANGED
@@ -8,9 +8,11 @@
|
|
8
8
|
|
9
9
|
An implementation of the Stomp protocol for Ruby. See:
|
10
10
|
|
11
|
-
* [STOMP 1.0] (http://stomp.
|
12
|
-
* [STOMP 1.0 and 1.1 Draft] (http://stomp.github.com/index.html)
|
11
|
+
* [STOMP 1.0 and 1.1] (http://stomp.github.com/index.html)
|
13
12
|
|
13
|
+
===New
|
14
|
+
|
15
|
+
Support of Stomp protocol level 1.1 is announced as of gem version 1.2.0.
|
14
16
|
|
15
17
|
===Example Usage
|
16
18
|
|
@@ -83,7 +85,6 @@ Project Home :
|
|
83
85
|
Stomp Protocol Info :
|
84
86
|
|
85
87
|
http://stomp.github.com/index.html
|
86
|
-
http://stomp.codehaus.org/Protocol
|
87
88
|
|
88
89
|
= Contributors
|
89
90
|
|
@@ -104,4 +105,11 @@ The following people have contributed to Stomp:
|
|
104
105
|
* Dinesh Majrekar
|
105
106
|
* Kiall Mac Innes
|
106
107
|
* Rob Skaggs
|
108
|
+
* Tom May
|
109
|
+
* Lucas Hills
|
110
|
+
* Chris Needham
|
111
|
+
* R.I. Pienaar
|
112
|
+
* tworker
|
113
|
+
|
114
|
+
|
107
115
|
|
data/Rakefile
CHANGED
@@ -30,10 +30,10 @@ begin
|
|
30
30
|
gem.name = "stomp"
|
31
31
|
gem.version = Stomp::Version::STRING
|
32
32
|
gem.summary = %Q{Ruby client for the Stomp messaging protocol}
|
33
|
-
gem.description = %Q{Ruby client for the Stomp messaging protocol}
|
33
|
+
gem.description = %Q{Ruby client for the Stomp messaging protocol. Note that this gem is no longer supported on rubyforge.}
|
34
34
|
gem.email = ["brianm@apache.org", 'marius@stones.com', 'morellon@gmail.com',
|
35
35
|
'allard.guy.m@gmail.com' ]
|
36
|
-
gem.homepage = "https://
|
36
|
+
gem.homepage = "https://github.com/morellon/stomp"
|
37
37
|
gem.authors = ["Brian McCallister", 'Marius Mathiesen', 'Thiago Morello',
|
38
38
|
'Guy M. Allard']
|
39
39
|
gem.add_development_dependency "rspec", '>= 2.3'
|
data/bin/catstomp
CHANGED
@@ -18,13 +18,13 @@ begin; require 'rubygems'; rescue; end
|
|
18
18
|
require 'stomp'
|
19
19
|
|
20
20
|
#
|
21
|
-
# This simple script is inspired by the netcat utility. It allows you to
|
21
|
+
# This simple script is inspired by the netcat utility. It allows you to publish
|
22
22
|
# input into this process to stomp destination.
|
23
23
|
#
|
24
24
|
# Usage: catstomp (destination-name)
|
25
25
|
#
|
26
26
|
# Example: ls | catstomp /topic/foo
|
27
|
-
# Would
|
27
|
+
# Would publish the output of the ls command to the stomp destination /topic/foo
|
28
28
|
#
|
29
29
|
begin
|
30
30
|
|
@@ -47,7 +47,7 @@ begin
|
|
47
47
|
@headers['reply-to'] = $*[1] if $*[1] != nil
|
48
48
|
|
49
49
|
STDIN.each_line { |line|
|
50
|
-
@conn.
|
50
|
+
@conn.publish @destination, line, @headers
|
51
51
|
}
|
52
52
|
|
53
53
|
rescue
|
@@ -0,0 +1,78 @@
|
|
1
|
+
#
|
2
|
+
# The current require dance for different Ruby versions.
|
3
|
+
# Change this to suit your requirements.
|
4
|
+
#
|
5
|
+
if Kernel.respond_to?(:require_relative)
|
6
|
+
require_relative("./stomp11_common")
|
7
|
+
else
|
8
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
9
|
+
require "stomp11_common"
|
10
|
+
end
|
11
|
+
include Stomp11Common
|
12
|
+
#
|
13
|
+
# Stomp 1.1 Client Example 1
|
14
|
+
# ==============================
|
15
|
+
#
|
16
|
+
# Purpose: to demonstrate a clientect and disclientect sequence using Stomp 1.1
|
17
|
+
# with the Stomp#client intreface.
|
18
|
+
#
|
19
|
+
# Note: Stomp#client does not provide a positional set of parameters that
|
20
|
+
# contain a 'clientect_headers' parameter. To use the Stomp#client interface
|
21
|
+
# you _must_ use a 'hashed' set of parameters.
|
22
|
+
#
|
23
|
+
# Create connection headers
|
24
|
+
# =========================
|
25
|
+
#
|
26
|
+
# The two headers used here are _required_ by the specification.
|
27
|
+
#
|
28
|
+
client_hdrs = {"accept-version" => "1.1", # Demand a 1.1 connection (use a CSV list if you will consider multiple versions)
|
29
|
+
"host" => virt_host, # The 1.1 vhost (could be different than connection host)
|
30
|
+
} # No heartbeats here: there will be none for this connection
|
31
|
+
#
|
32
|
+
# Create the connect hash.
|
33
|
+
# ========================
|
34
|
+
#
|
35
|
+
client_hash = { :hosts => [
|
36
|
+
{:login => login, :passcode => passcode, :host => host, :port => port},
|
37
|
+
],
|
38
|
+
:connect_headers => client_hdrs,
|
39
|
+
}
|
40
|
+
#
|
41
|
+
# Get a connection
|
42
|
+
# ================
|
43
|
+
#
|
44
|
+
client = Stomp::Client.new(client_hash)
|
45
|
+
puts "Connection complete"
|
46
|
+
#
|
47
|
+
# Let's just do some sanity checks, and look around.
|
48
|
+
#
|
49
|
+
raise "Connection failed!!" unless client.open?
|
50
|
+
#
|
51
|
+
# Is this really a 1.1 conection? (For clients, 'protocol' is a public method.
|
52
|
+
# The value will be '1.0' for those types of connections.)
|
53
|
+
#
|
54
|
+
raise "Unexpected protocol level" if client.protocol() != Stomp::SPL_11
|
55
|
+
#
|
56
|
+
# The broker _could_ have returned an ERROR frame (unlikely).
|
57
|
+
# For clients, 'connection_frame' is a public method.
|
58
|
+
#
|
59
|
+
raise "Connect error: #{client.connection_frame().body}" if client.connection_frame().command == Stomp::CMD_ERROR
|
60
|
+
#
|
61
|
+
# Examine the CONNECT response (the connection_frame()).
|
62
|
+
#
|
63
|
+
puts "Connected Headers required to be present:"
|
64
|
+
puts "Connect version - \t#{client.connection_frame().headers['version']}"
|
65
|
+
puts
|
66
|
+
puts "Connected Headers that are optional:"
|
67
|
+
puts "Connect broker - \t\t#{client.connection_frame().headers['broker']}"
|
68
|
+
puts "Session ID - \t\t\t#{client.connection_frame().headers['session']}"
|
69
|
+
puts "Server requested heartbeats - \t#{client.connection_frame().headers['heart-beat']}"
|
70
|
+
#
|
71
|
+
# Finally close
|
72
|
+
# =============
|
73
|
+
#
|
74
|
+
client.close # Business as usual, just like 1.0
|
75
|
+
puts "Disclientect complete"
|
76
|
+
|
77
|
+
|
78
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#
|
2
|
+
# The current require dance for different Ruby versions.
|
3
|
+
# Change this to suit your requirements.
|
4
|
+
#
|
5
|
+
if Kernel.respond_to?(:require_relative)
|
6
|
+
require_relative("./stomp11_common")
|
7
|
+
else
|
8
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
9
|
+
require "stomp11_common"
|
10
|
+
end
|
11
|
+
include Stomp11Common
|
12
|
+
#
|
13
|
+
# Stomp 1.1 Client Putter/Getter Example 1
|
14
|
+
# ========================================
|
15
|
+
#
|
16
|
+
# This is much like sending and receiving with a Stomp::Connection.
|
17
|
+
#
|
18
|
+
client_hdrs = {"accept-version" => "1.1", # Demand a 1.1 connection (use a CSV list if you will consider multiple versions)
|
19
|
+
"host" => virt_host, # The 1.1 vhost (could be different than connection host)
|
20
|
+
} # No heartbeats here: there will be none for this connection
|
21
|
+
#
|
22
|
+
client_hash = { :hosts => [
|
23
|
+
{:login => login, :passcode => passcode, :host => host, :port => port},
|
24
|
+
],
|
25
|
+
:connect_headers => client_hdrs,
|
26
|
+
}
|
27
|
+
#
|
28
|
+
client = Stomp::Client.new(client_hash)
|
29
|
+
puts "Connection complete"
|
30
|
+
#
|
31
|
+
raise "Unexpected protocol level" if client.protocol() != Stomp::SPL_11
|
32
|
+
#
|
33
|
+
qname = "/queue/client.nodea.nodeb.nodec"
|
34
|
+
data = "message payload: #{Time.now.to_f}"
|
35
|
+
headers = {}
|
36
|
+
# Send it
|
37
|
+
client.publish qname, data
|
38
|
+
# Receive
|
39
|
+
uuid = client.uuid() # uuid for Stomp::Client is a public method
|
40
|
+
message = nil
|
41
|
+
# Clients must pass a receive block. This is business as usual, required for 1.0.
|
42
|
+
# For 1.1, a unique subscription id is required.
|
43
|
+
client.subscribe(qname, {'id' => uuid}) {|m|
|
44
|
+
message = m
|
45
|
+
}
|
46
|
+
sleep 0.1 until message # Wait for completion
|
47
|
+
# Unsubscribe, with the unique id
|
48
|
+
client.unsubscribe qname, {'id' => uuid}
|
49
|
+
# Sanity checks for this example ....
|
50
|
+
raise "Unexpected data" if data != message.body
|
51
|
+
raise "Bad subscription header" if uuid != message.headers['subscription']
|
52
|
+
#
|
53
|
+
client.close # Business as usual, just like 1.0
|
54
|
+
puts "Disclientect complete"
|
55
|
+
|
56
|
+
|
57
|
+
|
@@ -0,0 +1,101 @@
|
|
1
|
+
#
|
2
|
+
# The current require dance for different Ruby versions.
|
3
|
+
# Change this to suit your requirements.
|
4
|
+
#
|
5
|
+
if Kernel.respond_to?(:require_relative)
|
6
|
+
require_relative("./stomp11_common")
|
7
|
+
else
|
8
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
9
|
+
require "stomp11_common"
|
10
|
+
end
|
11
|
+
include Stomp11Common
|
12
|
+
#
|
13
|
+
# Stomp 1.1 Connection Example 1
|
14
|
+
# ==============================
|
15
|
+
#
|
16
|
+
# Purpose: to demonstrate a connect and disconnect sequence using Stomp 1.1.
|
17
|
+
#
|
18
|
+
# Note: this example assumes that you have at least the 1.1.11 gem release
|
19
|
+
# installed.
|
20
|
+
#
|
21
|
+
# When you:
|
22
|
+
#
|
23
|
+
# * Use a Stomp 1.1 compliant broker
|
24
|
+
# * Want a Stomp 1.1 level connection and functionality
|
25
|
+
#
|
26
|
+
# then your code *must* specifically request that environment.
|
27
|
+
#
|
28
|
+
# You need to supply all of the normal values expected of course:
|
29
|
+
#
|
30
|
+
# * login - the user name
|
31
|
+
# * passcode - the password
|
32
|
+
# * host - the host to connect to
|
33
|
+
# * port - the port to connect to
|
34
|
+
#
|
35
|
+
# Additionaly you are required to supply the 1.1 connection data as documented
|
36
|
+
# in the Stomp 1.1 specification: http://stomp.github.com/stomp-specification-1.1.html
|
37
|
+
# You are urged to become familiar with the spec. It is a short document.
|
38
|
+
#
|
39
|
+
# This includes:
|
40
|
+
#
|
41
|
+
# * The Stomp version(s) you wish the broker to consider
|
42
|
+
# * The broker vhost to connect to
|
43
|
+
#
|
44
|
+
# You may optionally specify other 1.1 data:
|
45
|
+
#
|
46
|
+
# * heartbeat request
|
47
|
+
#
|
48
|
+
# Using the stomp gem, you specify this data in the "connect_headers" Hash
|
49
|
+
# parameter.
|
50
|
+
#
|
51
|
+
# So .........
|
52
|
+
#
|
53
|
+
# Create connection headers
|
54
|
+
# =========================
|
55
|
+
#
|
56
|
+
# The two headers used here are _required_ by the specification.
|
57
|
+
#
|
58
|
+
conn_hdrs = {"accept-version" => "1.1", # Demand a 1.1 connection (use a CSV list if you will consider multiple versions)
|
59
|
+
"host" => virt_host, # The 1.1 vhost (could be different than connection host)
|
60
|
+
} # No heartbeats here: there will be none for this connection
|
61
|
+
#
|
62
|
+
# Get a connection
|
63
|
+
# ================
|
64
|
+
#
|
65
|
+
conn = Stomp::Connection.new(login, passcode, host, port, # Normal connect parms
|
66
|
+
false, # Not reliable, the default
|
67
|
+
5, # Connect redelay, the default
|
68
|
+
conn_hdrs) # The 1.1 connection parameters
|
69
|
+
puts "Connection complete"
|
70
|
+
#
|
71
|
+
# Let's just do some sanity checks, and look around.
|
72
|
+
#
|
73
|
+
raise "Connection failed!!" unless conn.open?
|
74
|
+
#
|
75
|
+
# Is this really a 1.1 conection? ('protocol' is a read only connection
|
76
|
+
# instance variable. The value will be '1.0' for those types of connections.)
|
77
|
+
#
|
78
|
+
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
79
|
+
#
|
80
|
+
# The broker _could_ have returned an ERROR frame (unlikely).
|
81
|
+
#
|
82
|
+
raise "Connect error: #{conn.connection_frame.body}" if conn.connection_frame.command == Stomp::CMD_ERROR
|
83
|
+
#
|
84
|
+
# Examine the CONNECT response (the connection_frame).
|
85
|
+
#
|
86
|
+
puts "Connected Headers required to be present:"
|
87
|
+
puts "Connect version - \t#{conn.connection_frame.headers['version']}"
|
88
|
+
puts
|
89
|
+
puts "Connected Headers that are optional:"
|
90
|
+
puts "Connect broker - \t\t#{conn.connection_frame.headers['broker']}"
|
91
|
+
puts "Session ID - \t\t\t#{conn.connection_frame.headers['session']}"
|
92
|
+
puts "Server requested heartbeats - \t#{conn.connection_frame.headers['heart-beat']}"
|
93
|
+
#
|
94
|
+
# Finally disconnect
|
95
|
+
# ==================
|
96
|
+
#
|
97
|
+
conn.disconnect # Business as usual, just like 1.0
|
98
|
+
puts "Disconnect complete"
|
99
|
+
|
100
|
+
|
101
|
+
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#
|
2
|
+
# The current require dance for different Ruby versions.
|
3
|
+
# Change this to suit your requirements.
|
4
|
+
#
|
5
|
+
if Kernel.respond_to?(:require_relative)
|
6
|
+
require_relative("./stomp11_common")
|
7
|
+
else
|
8
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
9
|
+
require "stomp11_common"
|
10
|
+
end
|
11
|
+
include Stomp11Common
|
12
|
+
#
|
13
|
+
# Stomp 1.1 Connection Example 1
|
14
|
+
# ==============================
|
15
|
+
#
|
16
|
+
# Purpose: to demonstrate a connect and disconnect sequence using Stomp 1.1.
|
17
|
+
#
|
18
|
+
# This example is like the 'conn11_ex1.rb' example except that a 'hashed'
|
19
|
+
# connect request is made.
|
20
|
+
#
|
21
|
+
# Create connection headers
|
22
|
+
# =========================
|
23
|
+
#
|
24
|
+
# The two headers used here are _required_ by the specification.
|
25
|
+
#
|
26
|
+
conn_hdrs = {"accept-version" => "1.1", # Demand a 1.1 connection (use a CSV list if you will consider multiple versions)
|
27
|
+
"host" => virt_host, # The 1.1 vhost (could be different than connection host)
|
28
|
+
} # No heartbeats here: there will be none for this connection
|
29
|
+
#
|
30
|
+
# Create the connect hash.
|
31
|
+
# ========================
|
32
|
+
#
|
33
|
+
conn_hash = { :hosts => [
|
34
|
+
{:login => login, :passcode => passcode, :host => host, :port => port},
|
35
|
+
],
|
36
|
+
:connect_headers => conn_hdrs,
|
37
|
+
}
|
38
|
+
#
|
39
|
+
# Get a connection
|
40
|
+
# ================
|
41
|
+
#
|
42
|
+
conn = Stomp::Connection.new(conn_hash)
|
43
|
+
puts "Connection complete"
|
44
|
+
#
|
45
|
+
# Let's just do some sanity checks, and look around.
|
46
|
+
#
|
47
|
+
raise "Connection failed!!" unless conn.open?
|
48
|
+
#
|
49
|
+
# Is this really a 1.1 conection? ('protocol' is a read only connection
|
50
|
+
# instance variable. The value will be '1.0' for those types of connections.)
|
51
|
+
#
|
52
|
+
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
53
|
+
#
|
54
|
+
# The broker _could_ have returned an ERROR frame (unlikely).
|
55
|
+
#
|
56
|
+
raise "Connect error: #{conn.connection_frame.body}" if conn.connection_frame.command == Stomp::CMD_ERROR
|
57
|
+
#
|
58
|
+
# Examine the CONNECT response (the connection_frame).
|
59
|
+
#
|
60
|
+
puts "Connected Headers required to be present:"
|
61
|
+
puts "Connect version - \t#{conn.connection_frame.headers['version']}"
|
62
|
+
puts
|
63
|
+
puts "Connected Headers that are optional:"
|
64
|
+
puts "Connect broker - \t\t#{conn.connection_frame.headers['broker']}"
|
65
|
+
puts "Session ID - \t\t\t#{conn.connection_frame.headers['session']}"
|
66
|
+
puts "Server requested heartbeats - \t#{conn.connection_frame.headers['heart-beat']}"
|
67
|
+
#
|
68
|
+
# Finally disconnect
|
69
|
+
# ==================
|
70
|
+
#
|
71
|
+
conn.disconnect # Business as usual, just like 1.0
|
72
|
+
puts "Disconnect complete"
|
73
|
+
|
74
|
+
|
75
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#
|
2
|
+
# The current require dance for different Ruby versions.
|
3
|
+
# Change this to suit your requirements.
|
4
|
+
#
|
5
|
+
if Kernel.respond_to?(:require_relative)
|
6
|
+
require_relative("./stomp11_common")
|
7
|
+
require_relative("./slogger")
|
8
|
+
else
|
9
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
10
|
+
require "stomp11_common"
|
11
|
+
require "slogger"
|
12
|
+
end
|
13
|
+
include Stomp11Common
|
14
|
+
#
|
15
|
+
# Stomp 1.1 Heartbeat Example 1
|
16
|
+
# =============================
|
17
|
+
#
|
18
|
+
# Purpose: to demonstrate that heart beats can work.
|
19
|
+
#
|
20
|
+
# Create connection headers
|
21
|
+
# =========================
|
22
|
+
#
|
23
|
+
conn_hdrs = {"accept-version" => "1.1", # 1.1
|
24
|
+
"host" => virt_host, # vhost
|
25
|
+
"heart-beat" => "5000,10000", # heartbeats
|
26
|
+
}
|
27
|
+
# Create a logger for demonstration purposes
|
28
|
+
logger = Slogger.new
|
29
|
+
# Connect
|
30
|
+
conn = Stomp::Connection.new(login, passcode, host, port, # Normal connect parms
|
31
|
+
false, # Not reliable, the default
|
32
|
+
5, # Connect redelay, the default
|
33
|
+
conn_hdrs) # The 1.1 connection parameters
|
34
|
+
puts "Connection complete"
|
35
|
+
#
|
36
|
+
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
37
|
+
#
|
38
|
+
conn.set_logger(logger) # Connection uses a logger
|
39
|
+
sleep 65
|
40
|
+
conn.set_logger(nil) # No logging
|
41
|
+
#
|
42
|
+
conn.disconnect # Get out
|
43
|
+
puts "Disconnect complete"
|
44
|
+
|
45
|
+
|
46
|
+
|