stomp 1.2.4 → 1.2.5
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 +11 -0
- data/README.rdoc +38 -26
- data/Rakefile +3 -0
- data/bin/catstomp +34 -34
- data/bin/stompcat +36 -36
- data/examples/client11_ex1.rb +64 -55
- data/examples/client11_putget1.rb +47 -35
- data/examples/conn11_ex1.rb +59 -51
- data/examples/conn11_ex2.rb +59 -50
- data/examples/conn11_hb1.rb +35 -26
- data/examples/consumer.rb +25 -12
- data/examples/get11conn_ex1.rb +97 -89
- data/examples/get11conn_ex2.rb +55 -47
- data/examples/logexamp.rb +66 -52
- data/examples/logexamp_ssl.rb +66 -52
- data/examples/publisher.rb +21 -10
- data/examples/put11conn_ex1.rb +35 -24
- data/examples/putget11_rh1.rb +66 -56
- data/examples/slogger.rb +65 -52
- data/examples/ssl_uc1.rb +24 -13
- data/examples/ssl_uc1_ciphers.rb +28 -15
- data/examples/ssl_uc2.rb +26 -16
- data/examples/ssl_uc2_ciphers.rb +31 -18
- data/examples/ssl_uc3.rb +25 -14
- data/examples/ssl_uc3_ciphers.rb +31 -18
- data/examples/ssl_uc4.rb +26 -15
- data/examples/ssl_uc4_ciphers.rb +32 -19
- data/examples/ssl_ucx_default_ciphers.rb +25 -12
- data/examples/stomp11_common.rb +16 -15
- data/examples/topic_consumer.rb +23 -10
- data/examples/topic_publisher.rb +22 -8
- data/lib/client/utils.rb +116 -0
- data/lib/connection/heartbeats.rb +173 -0
- data/lib/connection/netio.rb +322 -0
- data/lib/connection/utf8.rb +294 -0
- data/lib/connection/utils.rb +104 -0
- data/lib/stomp/client.rb +127 -179
- data/lib/stomp/codec.rb +5 -2
- data/lib/stomp/connection.rb +109 -865
- data/lib/stomp/constants.rb +52 -33
- data/lib/stomp/errors.rb +56 -5
- data/lib/stomp/ext/hash.rb +4 -0
- data/lib/stomp/message.rb +49 -29
- data/lib/stomp/sslparams.rb +83 -71
- data/lib/stomp/version.rb +3 -1
- data/lib/stomp.rb +18 -9
- data/stomp.gemspec +58 -3
- data/test/test_client.rb +28 -1
- data/test/test_codec.rb +8 -2
- data/test/test_connection.rb +29 -0
- data/test/test_connection1p.rb +31 -16
- data/test/test_helper.rb +20 -3
- data/test/test_message.rb +8 -3
- data/test/test_ssl.rb +10 -4
- data/test/tlogger.rb +16 -15
- metadata +59 -4
data/examples/conn11_ex2.rb
CHANGED
@@ -11,68 +11,77 @@ else
|
|
11
11
|
require "stomp11_common"
|
12
12
|
end
|
13
13
|
include Stomp11Common
|
14
|
+
|
14
15
|
#
|
15
|
-
# Stomp 1.1 Connection Example
|
16
|
-
# ==============================
|
16
|
+
# == Stomp 1.1 Connection Example 2
|
17
17
|
#
|
18
18
|
# Purpose: to demonstrate a connect and disconnect sequence using Stomp 1.1.
|
19
19
|
#
|
20
20
|
# This example is like the 'conn11_ex1.rb' example except that a 'hashed'
|
21
21
|
# connect request is made.
|
22
22
|
#
|
23
|
-
|
24
|
-
#
|
25
|
-
|
26
|
-
|
27
|
-
#
|
28
|
-
|
23
|
+
class Connection11Example2
|
24
|
+
# Initialize.
|
25
|
+
def initialize
|
26
|
+
end
|
27
|
+
# Run example.
|
28
|
+
def run
|
29
|
+
# Create connection headers
|
30
|
+
# =========================
|
31
|
+
#
|
32
|
+
# The two headers used here are _required_ by the specification.
|
33
|
+
#
|
34
|
+
conn_hdrs = {"accept-version" => "1.1", # Demand a 1.1 connection (use a CSV list if you will consider multiple versions)
|
29
35
|
"host" => virt_host, # The 1.1 vhost (could be different than connection host)
|
30
36
|
} # No heartbeats here: there will be none for this connection
|
31
|
-
#
|
32
|
-
# Create the connect hash.
|
33
|
-
# ========================
|
34
|
-
#
|
35
|
-
conn_hash = { :hosts => [
|
36
|
-
|
37
|
+
#
|
38
|
+
# Create the connect hash.
|
39
|
+
# ========================
|
40
|
+
#
|
41
|
+
conn_hash = { :hosts => [
|
42
|
+
{:login => login, :passcode => passcode, :host => host, :port => port},
|
37
43
|
],
|
38
44
|
:reliable => false, # Override default
|
39
45
|
:connect_headers => conn_hdrs,
|
40
46
|
}
|
47
|
+
#
|
48
|
+
# Get a connection
|
49
|
+
# ================
|
50
|
+
#
|
51
|
+
conn = Stomp::Connection.new(conn_hash)
|
52
|
+
puts "Connection complete"
|
53
|
+
#
|
54
|
+
# Let's just do some sanity checks, and look around.
|
55
|
+
#
|
56
|
+
raise "Connection failed!!" unless conn.open?
|
57
|
+
#
|
58
|
+
# Is this really a 1.1 conection? ('protocol' is a read only connection
|
59
|
+
# instance variable. The value will be '1.0' for those types of connections.)
|
60
|
+
#
|
61
|
+
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
62
|
+
#
|
63
|
+
# The broker _could_ have returned an ERROR frame (unlikely).
|
64
|
+
#
|
65
|
+
raise "Connect error: #{conn.connection_frame.body}" if conn.connection_frame.command == Stomp::CMD_ERROR
|
66
|
+
#
|
67
|
+
# Examine the CONNECT response (the connection_frame).
|
68
|
+
#
|
69
|
+
puts "Connected Headers required to be present:"
|
70
|
+
puts "Connect version - \t#{conn.connection_frame.headers['version']}"
|
71
|
+
puts
|
72
|
+
puts "Connected Headers that are optional:"
|
73
|
+
puts "Connect server - \t\t#{conn.connection_frame.headers['server']}"
|
74
|
+
puts "Session ID - \t\t\t#{conn.connection_frame.headers['session']}"
|
75
|
+
puts "Server requested heartbeats - \t#{conn.connection_frame.headers['heart-beat']}"
|
76
|
+
#
|
77
|
+
# Finally disconnect
|
78
|
+
# ==================
|
79
|
+
#
|
80
|
+
conn.disconnect # Business as usual, just like 1.0
|
81
|
+
puts "Disconnect complete"
|
82
|
+
end
|
83
|
+
end
|
41
84
|
#
|
42
|
-
|
43
|
-
|
44
|
-
#
|
45
|
-
conn = Stomp::Connection.new(conn_hash)
|
46
|
-
puts "Connection complete"
|
47
|
-
#
|
48
|
-
# Let's just do some sanity checks, and look around.
|
49
|
-
#
|
50
|
-
raise "Connection failed!!" unless conn.open?
|
51
|
-
#
|
52
|
-
# Is this really a 1.1 conection? ('protocol' is a read only connection
|
53
|
-
# instance variable. The value will be '1.0' for those types of connections.)
|
54
|
-
#
|
55
|
-
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
56
|
-
#
|
57
|
-
# The broker _could_ have returned an ERROR frame (unlikely).
|
58
|
-
#
|
59
|
-
raise "Connect error: #{conn.connection_frame.body}" if conn.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#{conn.connection_frame.headers['version']}"
|
65
|
-
puts
|
66
|
-
puts "Connected Headers that are optional:"
|
67
|
-
puts "Connect broker - \t\t#{conn.connection_frame.headers['broker']}"
|
68
|
-
puts "Session ID - \t\t\t#{conn.connection_frame.headers['session']}"
|
69
|
-
puts "Server requested heartbeats - \t#{conn.connection_frame.headers['heart-beat']}"
|
70
|
-
#
|
71
|
-
# Finally disconnect
|
72
|
-
# ==================
|
73
|
-
#
|
74
|
-
conn.disconnect # Business as usual, just like 1.0
|
75
|
-
puts "Disconnect complete"
|
76
|
-
|
77
|
-
|
85
|
+
e = Connection11Example2.new
|
86
|
+
e.run
|
78
87
|
|
data/examples/conn11_hb1.rb
CHANGED
@@ -13,36 +13,45 @@ else
|
|
13
13
|
require "slogger"
|
14
14
|
end
|
15
15
|
include Stomp11Common
|
16
|
+
|
16
17
|
#
|
17
|
-
# Stomp 1.1 Heartbeat Example 1
|
18
|
-
# =============================
|
18
|
+
# == Stomp 1.1 Heartbeat Example 1
|
19
19
|
#
|
20
20
|
# Purpose: to demonstrate that heart beats can work.
|
21
21
|
#
|
22
|
-
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
class HeartBeatExample1
|
23
|
+
# Initialize.
|
24
|
+
def initialize
|
25
|
+
end
|
26
|
+
# Run example.
|
27
|
+
def run
|
28
|
+
# Create connection headers
|
29
|
+
# =========================
|
30
|
+
#
|
31
|
+
conn_hdrs = {"accept-version" => "1.1", # 1.1
|
32
|
+
"host" => virt_host, # vhost
|
33
|
+
"heart-beat" => "5000,10000", # heartbeats
|
28
34
|
}
|
29
|
-
# Create a logger for demonstration purposes
|
30
|
-
logger = Slogger.new
|
31
|
-
# Connect - a paramaterized request.
|
32
|
-
conn = Stomp::Connection.new(login, passcode, host, port, # Normal connect parms
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
puts "Connection connect complete"
|
37
|
-
#
|
38
|
-
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
39
|
-
#
|
40
|
-
conn.set_logger(logger) # Connection uses a logger
|
41
|
-
sleep 65
|
42
|
-
conn.set_logger(nil) # No logging
|
35
|
+
# Create a logger for demonstration purposes
|
36
|
+
logger = Slogger.new
|
37
|
+
# Connect - a paramaterized request.
|
38
|
+
conn = Stomp::Connection.new(login, passcode, host, port, # Normal connect parms
|
39
|
+
false, # Not reliable, the default for a paramaterized connection
|
40
|
+
5, # Connect redelay, the default for a paramaterized connection
|
41
|
+
conn_hdrs) # The 1.1 connection parameters / headers
|
42
|
+
puts "Connection connect complete"
|
43
|
+
#
|
44
|
+
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
45
|
+
#
|
46
|
+
conn.set_logger(logger) # Connection uses a logger
|
47
|
+
sleep 65
|
48
|
+
conn.set_logger(nil) # No logging
|
49
|
+
#
|
50
|
+
conn.disconnect # Get out
|
51
|
+
puts "Connection disconnect complete"
|
52
|
+
end
|
53
|
+
end
|
43
54
|
#
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
55
|
+
e = HeartBeatExample1.new
|
56
|
+
e.run
|
48
57
|
|
data/examples/consumer.rb
CHANGED
@@ -2,20 +2,33 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'stomp'
|
5
|
+
#
|
6
|
+
# == Example message consumer.
|
7
|
+
#
|
8
|
+
class ExampleConsumer
|
9
|
+
# Initialize.
|
10
|
+
def initialize
|
11
|
+
end
|
12
|
+
# Run example.
|
13
|
+
def run
|
14
|
+
client = Stomp::Client.new("failover://(stomp://:@localhost:61613,stomp://:@remotehost:61613)?initialReconnectDelay=5000&randomize=false&useExponentialBackOff=false")
|
15
|
+
puts "Subscribing ronaldo"
|
16
|
+
client.subscribe("/queue/ronaldo", {:ack => "client", "activemq.prefetchSize" => 1, "activemq.exclusive" => true }) do |msg|
|
17
|
+
File.open("file", "a") do |f|
|
18
|
+
f.write(msg.body)
|
19
|
+
f.write("\n----------------\n")
|
20
|
+
end
|
5
21
|
|
22
|
+
client.acknowledge(msg)
|
23
|
+
end
|
6
24
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
f.write(msg.body)
|
12
|
-
f.write("\n----------------\n")
|
25
|
+
loop do
|
26
|
+
sleep(1)
|
27
|
+
puts "."
|
28
|
+
end
|
13
29
|
end
|
14
|
-
|
15
|
-
client.acknowledge(msg)
|
16
30
|
end
|
31
|
+
#
|
32
|
+
e = ExampleConsumer.new
|
33
|
+
e.run
|
17
34
|
|
18
|
-
loop do
|
19
|
-
sleep(1)
|
20
|
-
puts "."
|
21
|
-
end
|
data/examples/get11conn_ex1.rb
CHANGED
@@ -12,98 +12,106 @@ else
|
|
12
12
|
end
|
13
13
|
include Stomp11Common
|
14
14
|
#
|
15
|
-
# Stomp 1.1 Receive Example 1
|
16
|
-
# ===========================
|
15
|
+
# == Stomp 1.1 Receive Example 1
|
17
16
|
#
|
18
17
|
# Purpose: to demonstrate receiving messages using Stomp 1.1.
|
19
18
|
#
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
#
|
25
|
-
|
26
|
-
#
|
27
|
-
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
19
|
+
class Receive11Example1
|
20
|
+
# Initialize.
|
21
|
+
def initialize
|
22
|
+
end
|
23
|
+
# Run example.
|
24
|
+
def run
|
25
|
+
conn = get_connection() # Use helper method to obtain a Stomp#connection
|
26
|
+
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
27
|
+
#
|
28
|
+
# To start receiving messages, you must first subscribe. This is similar
|
29
|
+
# to using Stomp 1.0.
|
30
|
+
#
|
31
|
+
# However, with Stomp 1.1:
|
32
|
+
#
|
33
|
+
# * for subscribe, the 'id' header is now _required_
|
34
|
+
# * for unsubscribe, the 'id' header is now _required_
|
35
|
+
#
|
36
|
+
# The 'id' header specifies a 'subscription id' that _must_ be unique for
|
37
|
+
# the current session.
|
38
|
+
#
|
39
|
+
qname = "/queue/nodea.nodeb.nodec"
|
40
|
+
#
|
41
|
+
# Here is an example of allowed functionality in 1.0 that is not allowed in 1.1:
|
42
|
+
#
|
43
|
+
begin
|
44
|
+
conn.subscribe qname
|
45
|
+
rescue RuntimeError => sre
|
46
|
+
puts "Rescue: #{sre}, #{sre.message}"
|
47
|
+
end
|
48
|
+
#
|
49
|
+
# So, you must specify an 'id' header. And it must be unique within the
|
50
|
+
# current session.
|
51
|
+
#
|
52
|
+
# You can build your own unique ids of course. That is a valid option.
|
53
|
+
# In order to provide you with some assistance in generating unique ids,
|
54
|
+
# two convenience methods are provided with the connection:
|
55
|
+
#
|
56
|
+
# * sha1 - generate a sha1 hash of some data you supply. This may be sufficient for many purposes.
|
57
|
+
# * uuid - generate a type 4 UUID. This would be sufficient in all cases.
|
58
|
+
#
|
59
|
+
# Get a sha1:
|
60
|
+
#
|
61
|
+
sha1 = conn.sha1(qname) # sha1 of the queue name perhaps
|
62
|
+
puts "Queue name: #{qname}, sha1: #{sha1}"
|
63
|
+
#
|
64
|
+
# Or perhaps a different sha1:
|
65
|
+
#
|
66
|
+
tn = Time.now.to_f.to_s # Maybe unique itself.
|
67
|
+
sha1 = conn.sha1(tn)
|
68
|
+
puts "Time now: #{tn}, sha1: #{sha1}"
|
69
|
+
#
|
70
|
+
# Or a Type 4 UUID:
|
71
|
+
#
|
72
|
+
uuid = conn.uuid()
|
73
|
+
puts "Type 4 UUID: #{uuid}"
|
74
|
+
#
|
75
|
+
# You can specify the 'id' in the subscribe call in one of two ways:
|
76
|
+
#
|
77
|
+
# a) In the headers parameter
|
78
|
+
# b) In the third positional parameter, the subId
|
79
|
+
#
|
80
|
+
# So, using the 'uuid', either:
|
81
|
+
#
|
82
|
+
# a) conn.subscribe qname, {'id' => uuid}
|
83
|
+
# b) conn.subscribe qname, {}, uuid
|
84
|
+
#
|
85
|
+
conn.subscribe qname, {'id' => uuid} # First style
|
86
|
+
#
|
87
|
+
# Within a session, you may not subscribe to the same subscription id.
|
88
|
+
#
|
89
|
+
begin
|
90
|
+
conn.subscribe qname, {'id' => uuid} # Second time
|
91
|
+
rescue RuntimeError => sre
|
92
|
+
puts "Rescue: #{sre}, #{sre.message}"
|
93
|
+
end
|
94
|
+
#
|
95
|
+
# Once you have subscribed, you may receive as usual
|
96
|
+
#
|
97
|
+
1.upto(nmsgs()) do
|
98
|
+
received = conn.receive
|
99
|
+
puts "Received data: #{received.body}"
|
100
|
+
end
|
101
|
+
#
|
102
|
+
# For unsubscribe, you must use the 'id' you used on subscribe.
|
103
|
+
#
|
104
|
+
# You have the same options for placing this id in the headers or in the 3rd
|
105
|
+
# positional parameter.
|
106
|
+
#
|
107
|
+
conn.unsubscribe qname, {}, uuid # Second style
|
108
|
+
#
|
109
|
+
# And finally, disconnect.
|
110
|
+
#
|
111
|
+
conn.disconnect
|
112
|
+
end
|
42
113
|
end
|
43
114
|
#
|
44
|
-
|
45
|
-
|
46
|
-
#
|
47
|
-
# You can build your own unique ids of course. That is a valid option.
|
48
|
-
# In order to provide you with some assistance in generating unique ids,
|
49
|
-
# two convenience methods are provided with the connection:
|
50
|
-
#
|
51
|
-
# * sha1 - generate a sha1 hash of some data you supply. This may be sufficient for many purposes.
|
52
|
-
# * uuid - generate a type 4 UUID. This would be sufficient in all cases.
|
53
|
-
#
|
54
|
-
# Get a sha1:
|
55
|
-
#
|
56
|
-
sha1 = conn.sha1(qname) # sha1 of the queue name perhaps
|
57
|
-
puts "Queue name: #{qname}, sha1: #{sha1}"
|
58
|
-
#
|
59
|
-
# Or perhaps a different sha1:
|
60
|
-
#
|
61
|
-
tn = Time.now.to_f.to_s # Maybe unique itself.
|
62
|
-
sha1 = conn.sha1(tn)
|
63
|
-
puts "Time now: #{tn}, sha1: #{sha1}"
|
64
|
-
#
|
65
|
-
# Or a Type 4 UUID:
|
66
|
-
#
|
67
|
-
uuid = conn.uuid()
|
68
|
-
puts "Type 4 UUID: #{uuid}"
|
69
|
-
#
|
70
|
-
# You can specify the 'id' in the subscribe call in one of two ways:
|
71
|
-
#
|
72
|
-
# a) In the headers parameter
|
73
|
-
# b) In the third positional parameter, the subId
|
74
|
-
#
|
75
|
-
# So, using the 'uuid', either:
|
76
|
-
#
|
77
|
-
# a) conn.subscribe qname, {'id' => uuid}
|
78
|
-
# b) conn.subscribe qname, {}, uuid
|
79
|
-
#
|
80
|
-
conn.subscribe qname, {'id' => uuid} # First style
|
81
|
-
#
|
82
|
-
# Within a session, you may not subscribe to the same subscription id.
|
83
|
-
#
|
84
|
-
begin
|
85
|
-
conn.subscribe qname, {'id' => uuid} # Second time
|
86
|
-
rescue RuntimeError => sre
|
87
|
-
puts "Rescue: #{sre}, #{sre.message}"
|
88
|
-
end
|
89
|
-
#
|
90
|
-
# Once you have subscribed, you may receive as usual
|
91
|
-
#
|
92
|
-
1.upto(nmsgs()) do
|
93
|
-
received = conn.receive
|
94
|
-
puts "Received data: #{received.body}"
|
95
|
-
end
|
96
|
-
#
|
97
|
-
# For unsubscribe, you must use the 'id' you used on subscribe.
|
98
|
-
#
|
99
|
-
# You have the same options for placing this id in the headers or in the 3rd
|
100
|
-
# positional parameter.
|
101
|
-
#
|
102
|
-
conn.unsubscribe qname, {}, uuid # Second style
|
103
|
-
#
|
104
|
-
# And finally, disconnect.
|
105
|
-
#
|
106
|
-
conn.disconnect
|
107
|
-
|
108
|
-
|
115
|
+
e = Receive11Example1.new
|
116
|
+
e.run
|
109
117
|
|
data/examples/get11conn_ex2.rb
CHANGED
@@ -12,58 +12,66 @@ else
|
|
12
12
|
end
|
13
13
|
include Stomp11Common
|
14
14
|
#
|
15
|
-
# Stomp 1.1 Receive Example 2
|
16
|
-
# ===========================
|
15
|
+
# == Stomp 1.1 Receive Example 2
|
17
16
|
#
|
18
17
|
# Purpose: to demonstrate receiving messages using Stomp 1.1, and using
|
19
18
|
# 'ack => client'.
|
20
19
|
#
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
#
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
#
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
20
|
+
class Receive11Example2
|
21
|
+
# Initialize.
|
22
|
+
def initialize
|
23
|
+
end
|
24
|
+
# Run example.
|
25
|
+
def run
|
26
|
+
conn = get_connection() # Use helper method to obtain a Stomp#connection
|
27
|
+
raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
|
28
|
+
#
|
29
|
+
qname = "/queue/nodea.nodeb.nodec"
|
30
|
+
#
|
31
|
+
uuid = conn.uuid()
|
32
|
+
puts "Subscribe id: #{uuid}"
|
33
|
+
#
|
34
|
+
# Subscribe with client ack mode
|
35
|
+
#
|
36
|
+
conn.subscribe qname, {'id' => uuid, 'ack' => 'client'} #
|
37
|
+
#
|
38
|
+
# Once you have subscribed, you may receive as usual
|
39
|
+
#
|
40
|
+
1.upto(nmsgs()) do
|
41
|
+
received = conn.receive
|
42
|
+
puts "Received data: #{received.body}"
|
43
|
+
#
|
44
|
+
# We want now to ACK this message. In Stomp 1.0, a 'message-id' header was
|
45
|
+
# required for the ACK. In Stomp 1.1, and additional header is required:
|
46
|
+
#
|
47
|
+
# * 'subscription' => id
|
48
|
+
#
|
49
|
+
msgid = received.headers['message-id']
|
50
|
+
#
|
51
|
+
# What you cannot do:
|
52
|
+
#
|
53
|
+
begin
|
54
|
+
conn.ack msgid
|
55
|
+
rescue RuntimeError => sre
|
56
|
+
puts "Rescue: #{sre}, #{sre.message}"
|
57
|
+
end
|
58
|
+
#
|
59
|
+
# Try a valid 1.1 ACK
|
60
|
+
#
|
61
|
+
conn.ack msgid, {'subscription' => uuid}
|
62
|
+
puts "ACK - msgid: #{msgid}, subscription: #{uuid}"
|
63
|
+
end
|
64
|
+
#
|
65
|
+
# Unsubscribe
|
66
|
+
#
|
67
|
+
conn.unsubscribe qname, {}, uuid # Second style
|
68
|
+
#
|
69
|
+
# And finally, disconnect.
|
70
|
+
#
|
71
|
+
conn.disconnect
|
52
72
|
end
|
53
|
-
#
|
54
|
-
# Try a valid 1.1 ACK
|
55
|
-
#
|
56
|
-
conn.ack msgid, {'subscription' => uuid}
|
57
|
-
puts "ACK - msgid: #{msgid}, subscription: #{uuid}"
|
58
73
|
end
|
59
74
|
#
|
60
|
-
|
61
|
-
|
62
|
-
conn.unsubscribe qname, {}, uuid # Second style
|
63
|
-
#
|
64
|
-
# And finally, disconnect.
|
65
|
-
#
|
66
|
-
conn.disconnect
|
67
|
-
|
68
|
-
|
75
|
+
e = Receive11Example2.new
|
76
|
+
e.run
|
69
77
|
|