stomp 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,11 @@
1
+ == 1.2.4 20120625
2
+
3
+ * Add ability for client to request flush on write to the connection (Issue #45)
4
+ * Add ability for client to retrieve heartbeat intervals and counters
5
+ * Fix I/O errors with heartbeats and multithreaded clients (Issue #46)
6
+ * Enhance tests for heartbeats
7
+ * Correct typos and clarify comments in many examples
8
+
1
9
  == 1.2.3 20120616
2
10
 
3
11
  * Fix UnsupportedProtocol on connect to a 1.0 broker
@@ -10,6 +10,7 @@ An implementation of the Stomp protocol for Ruby. See:
10
10
 
11
11
  ===New
12
12
 
13
+ * Gem version 1.2.2. Stomp 1.1 heartbeat fix, autoflush capability, miscellaneous fixes
13
14
  * Gem version 1.2.3. Miscellaneous fixes, see changelog for details.
14
15
  * Gem version 1.2.2. Performance and more SSL enhancements.
15
16
  * Full support of SSL certificates is announced as of gem version 1.2.1.
@@ -106,4 +107,5 @@ The following people have contributed to Stomp:
106
107
  * James Pearson
107
108
  * Craig
108
109
  * Tommy Bishop
110
+ * Jeremy Gailor
109
111
 
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -13,11 +15,11 @@ include Stomp11Common
13
15
  # Stomp 1.1 Client Example 1
14
16
  # ==============================
15
17
  #
16
- # Purpose: to demonstrate a clientect and disclientect sequence using Stomp 1.1
17
- # with the Stomp#client intreface.
18
+ # Purpose: to demonstrate a connect and disconnect sequence using Stomp 1.1
19
+ # with the Stomp#Client interface.
18
20
  #
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
+ # Note: Stomp#Client does not provide a positional set of parameters that
22
+ # contain a 'connect_headers' parameter. To use the Stomp#Client interface
21
23
  # you _must_ use a 'hashed' set of parameters.
22
24
  #
23
25
  # Create connection headers
@@ -26,8 +28,8 @@ include Stomp11Common
26
28
  # The two headers used here are _required_ by the specification.
27
29
  #
28
30
  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
+ "host" => virt_host, # The 1.1 vhost (could be different than connection host)
32
+ } # No heartbeats here: there will be none for this connection
31
33
  #
32
34
  # Create the connect hash.
33
35
  # ========================
@@ -42,7 +44,7 @@ client_hash = { :hosts => [
42
44
  # ================
43
45
  #
44
46
  client = Stomp::Client.new(client_hash)
45
- puts "Connection complete"
47
+ puts "Client Connect complete"
46
48
  #
47
49
  # Let's just do some sanity checks, and look around.
48
50
  #
@@ -72,7 +74,7 @@ puts "Server requested heartbeats - \t#{client.connection_frame().headers['heart
72
74
  # =============
73
75
  #
74
76
  client.close # Business as usual, just like 1.0
75
- puts "Disclientect complete"
77
+ puts "Client close complete"
76
78
 
77
79
 
78
80
 
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -26,7 +28,7 @@ client_hash = { :hosts => [
26
28
  }
27
29
  #
28
30
  client = Stomp::Client.new(client_hash)
29
- puts "Connection complete"
31
+ puts "Client Connect complete"
30
32
  #
31
33
  raise "Unexpected protocol level" if client.protocol() != Stomp::SPL_11
32
34
  #
@@ -51,7 +53,7 @@ raise "Unexpected data" if data != message.body
51
53
  raise "Bad subscription header" if uuid != message.headers['subscription']
52
54
  #
53
55
  client.close # Business as usual, just like 1.0
54
- puts "Disclientect complete"
56
+ puts "Client close complete"
55
57
 
56
58
 
57
59
 
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -15,7 +17,7 @@ include Stomp11Common
15
17
  #
16
18
  # Purpose: to demonstrate a connect and disconnect sequence using Stomp 1.1.
17
19
  #
18
- # Note: this example assumes that you have at least the 1.1.11 gem release
20
+ # Note: this example assumes that you have at least the 1.2.0 gem release
19
21
  # installed.
20
22
  #
21
23
  # When you:
@@ -45,8 +47,9 @@ include Stomp11Common
45
47
  #
46
48
  # * heartbeat request
47
49
  #
48
- # Using the stomp gem, you specify this data in the "connect_headers" Hash
49
- # parameter.
50
+ # Using the stomp gem, you can specify this data in the "connect_headers" Hash
51
+ # parameter or a paramaterized connection request. This example uses a
52
+ # parameterized request.
50
53
  #
51
54
  # So .........
52
55
  #
@@ -63,10 +66,10 @@ conn_hdrs = {"accept-version" => "1.1", # Demand a 1.1 connection (use a CSV
63
66
  # ================
64
67
  #
65
68
  conn = Stomp::Connection.new(login, passcode, host, port, # Normal connect parms
66
- false, # Not reliable, the default
69
+ false, # Not reliable, the default for a parameter connection
67
70
  5, # Connect redelay, the default
68
71
  conn_hdrs) # The 1.1 connection parameters
69
- puts "Connection complete"
72
+ puts "Connection connect complete"
70
73
  #
71
74
  # Let's just do some sanity checks, and look around.
72
75
  #
@@ -95,7 +98,7 @@ puts "Server requested heartbeats - \t#{conn.connection_frame.headers['heart-bea
95
98
  # ==================
96
99
  #
97
100
  conn.disconnect # Business as usual, just like 1.0
98
- puts "Disconnect complete"
101
+ puts "Connection disconnect complete"
99
102
 
100
103
 
101
104
 
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -33,6 +35,7 @@ conn_hdrs = {"accept-version" => "1.1", # Demand a 1.1 connection (use a CSV
33
35
  conn_hash = { :hosts => [
34
36
  {:login => login, :passcode => passcode, :host => host, :port => port},
35
37
  ],
38
+ :reliable => false, # Override default
36
39
  :connect_headers => conn_hdrs,
37
40
  }
38
41
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -26,12 +28,12 @@ conn_hdrs = {"accept-version" => "1.1", # 1.1
26
28
  }
27
29
  # Create a logger for demonstration purposes
28
30
  logger = Slogger.new
29
- # Connect
31
+ # Connect - a paramaterized request.
30
32
  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"
33
+ false, # Not reliable, the default for a paramaterized connection
34
+ 5, # Connect redelay, the default for a paramaterized connection
35
+ conn_hdrs) # The 1.1 connection parameters / headers
36
+ puts "Connection connect complete"
35
37
  #
36
38
  raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
37
39
  #
@@ -40,7 +42,7 @@ sleep 65
40
42
  conn.set_logger(nil) # No logging
41
43
  #
42
44
  conn.disconnect # Get out
43
- puts "Disconnect complete"
45
+ puts "Connection disconnect complete"
44
46
 
45
47
 
46
48
 
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -26,7 +28,7 @@ raise "Unexpected protocol level" if conn.protocol != Stomp::SPL_11
26
28
  # * for subscribe, the 'id' header is now _required_
27
29
  # * for unsubscribe, the 'id' header is now _required_
28
30
  #
29
- # The 'id' header specifies a 'subscription id' that must be unique for
31
+ # The 'id' header specifies a 'subscription id' that _must_ be unique for
30
32
  # the current session.
31
33
  #
32
34
  qname = "/queue/nodea.nodeb.nodec"
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require 'rubygems'
2
4
  require 'stomp'
3
5
  require 'logger' # for the 'local' logger
@@ -6,7 +8,7 @@ $:.unshift(File.dirname(__FILE__))
6
8
  #
7
9
  require 'slogger'
8
10
  #
9
- # A STOMP client program which uses the callback logging facility.
11
+ # A STOMP::Connection program which uses the callback logging facility.
10
12
  #
11
13
  llog = Logger::new(STDOUT)
12
14
  llog.level = Logger::DEBUG
@@ -14,7 +16,6 @@ llog.debug "LE Starting"
14
16
 
15
17
  # //////////////////////////////////////////////////////////////////////////////
16
18
  mylog = Slogger::new # The client provided STOMP callback logger
17
- # -*- encoding: utf-8 -*-
18
19
 
19
20
  # //////////////////////////////////////////////////////////////////////////////
20
21
  user = ENV['STOMP_USER'] ? ENV['STOMP_USER'] : 'guest'
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require 'rubygems'
2
4
  require 'stomp'
3
5
  require 'logger' # for the 'local' logger
@@ -6,7 +8,7 @@ $:.unshift(File.dirname(__FILE__))
6
8
  #
7
9
  require 'slogger'
8
10
  #
9
- # A STOMP client program which uses the callback logging facility.
11
+ # A STOMP::Connection program which uses the callback logging facility.
10
12
  #
11
13
  llog = Logger::new(STDOUT)
12
14
  llog.level = Logger::DEBUG
@@ -14,7 +16,6 @@ llog.debug "LESSL Starting"
14
16
 
15
17
  # //////////////////////////////////////////////////////////////////////////////
16
18
  mylog = Slogger::new # The client provided STOMP callback logger
17
- # -*- encoding: utf-8 -*-
18
19
 
19
20
  # //////////////////////////////////////////////////////////////////////////////
20
21
  user = ENV['STOMP_USER'] ? ENV['STOMP_USER'] : 'guest'
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # The current require dance for different Ruby versions.
3
5
  # Change this to suit your requirements.
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Reference: https://github.com/stompgem/stomp/wiki/extended-ssl-overview
3
5
  #
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  #
2
4
  # Common Stomp 1.1 code.
3
5
  #
@@ -35,7 +35,7 @@ module Stomp
35
35
  # stomp://login:passcode@host:port
36
36
  # stomp://login:passcode@host.domain.tld:port
37
37
  #
38
- def initialize(login = '', passcode = '', host = 'localhost', port = 61613, reliable = false)
38
+ def initialize(login = '', passcode = '', host = 'localhost', port = 61613, reliable = false, autoflush = false)
39
39
 
40
40
  # Parse stomp:// URL's or set params
41
41
  if login.is_a?(Hash)
@@ -49,7 +49,6 @@ module Stomp
49
49
  @port = first_host[:port] || Connection::default_port(first_host[:ssl])
50
50
 
51
51
  @reliable = true
52
-
53
52
  elsif login =~ /^stomp:\/\/#{url_regex}/ # e.g. stomp://login:passcode@host:port or stomp://host:port
54
53
  @login = $2 || ""
55
54
  @passcode = $3 || ""
@@ -94,6 +93,7 @@ module Stomp
94
93
  @connection = Connection.new(@parameters)
95
94
  else
96
95
  @connection = Connection.new(@login, @passcode, @host, @port, @reliable)
96
+ @connection.autoflush = autoflush
97
97
  end
98
98
 
99
99
  start_listeners
@@ -265,12 +265,40 @@ module Stomp
265
265
  @connection.uuid()
266
266
  end
267
267
 
268
+ # Retrieve heartbeat send interval
269
+ def hbsend_interval
270
+ @connection.hbsend_interval
271
+ end
272
+
273
+ # Retrieve heartbeat receive interval
274
+ def hbrecv_interval
275
+ @connection.hbrecv_interval
276
+ end
277
+
278
+ # Retrieve heartbeat send count
279
+ def hbsend_count
280
+ @connection.hbsend_count
281
+ end
282
+
283
+ # Retrieve heartbeat receive count
284
+ def hbrecv_count
285
+ @connection.hbrecv_count
286
+ end
287
+
268
288
  # Poll for asynchronous messages issued by broker.
269
289
  # Return nil of no message available, else the message
270
290
  def poll
271
291
  @connection.poll
272
292
  end
273
293
 
294
+ def autoflush=(af)
295
+ @connection.autoflush = af
296
+ end
297
+
298
+ def autoflush
299
+ @connection.autoflush
300
+ end
301
+
274
302
  private
275
303
  # Set a subscription id in the headers hash if one does not already exist.
276
304
  # For simplicities sake, all subscriptions have a subscription ID.
@@ -10,12 +10,13 @@ module Stomp
10
10
  # Low level connection which maps commands and supports
11
11
  # synchronous receives
12
12
  class Connection
13
- attr_reader :connection_frame
14
- attr_reader :disconnect_receipt
15
- attr_reader :protocol
16
- attr_reader :session
17
- attr_reader :hb_received # Heartbeat received on time
18
- attr_reader :hb_sent # Heartbeat sent successfully
13
+ attr_reader :connection_frame
14
+ attr_reader :disconnect_receipt
15
+ attr_reader :protocol
16
+ attr_reader :session
17
+ attr_reader :hb_received # Heartbeat received on time
18
+ attr_reader :hb_sent # Heartbeat sent successfully
19
+ attr_accessor :autoflush
19
20
  #alias :obj_send :send
20
21
 
21
22
  def self.default_port(ssl)
@@ -87,6 +88,7 @@ module Stomp
87
88
  @parse_timeout = 5 # To override, use hashed parameters
88
89
  @connect_timeout = 0 # To override, use hashed parameters
89
90
  @logger = nil # To override, use hashed parameters
91
+ @autoflush = false # To override, use hashed parameters or setter
90
92
  warn "login looks like a URL, do you have the correct parameters?" if @login =~ /:\/\//
91
93
  end
92
94
 
@@ -112,6 +114,7 @@ module Stomp
112
114
  @parse_timeout = @parameters[:parse_timeout]
113
115
  @connect_timeout = @parameters[:connect_timeout]
114
116
  @logger = @parameters[:logger]
117
+ @autoflush = @parameters[:autoflush]
115
118
  #sets the first host to connect
116
119
  change_host
117
120
  end
@@ -488,6 +491,30 @@ module Stomp
488
491
  rs
489
492
  end
490
493
 
494
+ # Retrieve heartbeat send interval
495
+ def hbsend_interval
496
+ return 0 unless @hbsend_interval
497
+ @hbsend_interval / 1000.0 # ms
498
+ end
499
+
500
+ # Retrieve heartbeat receive interval
501
+ def hbrecv_interval
502
+ return 0 unless @hbrecv_interval
503
+ @hbrecv_interval / 1000.0 # ms
504
+ end
505
+
506
+ # Retrieve heartbeat send count
507
+ def hbsend_count
508
+ return 0 unless @hbsend_count
509
+ @hbsend_count
510
+ end
511
+
512
+ # Retrieve heartbeat receive count
513
+ def hbrecv_count
514
+ return 0 unless @hbrecv_count
515
+ @hbrecv_count
516
+ end
517
+
491
518
  private
492
519
 
493
520
  def _expand_hosts(hash)
@@ -516,7 +543,17 @@ module Stomp
516
543
 
517
544
  def _receive( read_socket )
518
545
  @read_semaphore.synchronize do
519
- line = read_socket.gets
546
+ line = ''
547
+ if @protocol == Stomp::SPL_10 || (@protocol >= Stomp::SPL_11 && !@hbr)
548
+ line = read_socket.gets # The old way
549
+ else # We are >= 1.1 and receiving heartbeats.
550
+ while true
551
+ line = read_socket.gets # Data from wire
552
+ break unless line == "\n"
553
+ line = ''
554
+ @lr = Time.now.to_f
555
+ end
556
+ end
520
557
  return nil if line.nil?
521
558
  # If the reading hangs for more than X seconds, abort the parsing process.
522
559
  # X defaults to 5. Override allowed in connection hash parameters.
@@ -638,6 +675,7 @@ module Stomp
638
675
  used_socket.puts
639
676
  used_socket.write body
640
677
  used_socket.write "\0"
678
+ used_socket.flush if autoflush
641
679
 
642
680
  if @protocol >= Stomp::SPL_11
643
681
  @ls = Time.now.to_f if @hbs
@@ -870,7 +908,9 @@ module Stomp
870
908
  #
871
909
  @cx = @cy = @sx = @sy = 0, # Variable names as in spec
872
910
  #
873
- @sti = @rti = 0.0 # Send/Receive ticker interval.
911
+ @hbsend_interval = @hbrecv_interval = 0.0 # Send/Receive ticker interval.
912
+ #
913
+ @hbsend_count = @hbrecv_count = 0 # Send/Receive ticker counts.
874
914
  #
875
915
  @ls = @lr = -1.0 # Last send/receive time (from Time.now.to_f)
876
916
  #
@@ -899,7 +939,7 @@ module Stomp
899
939
  # If sending
900
940
  if @hbs
901
941
  sm = @cx >= @sy ? @cx : @sy # ticker interval, ms
902
- @sti = 1000.0 * sm # ticker interval, μs
942
+ @hbsend_interval = 1000.0 * sm # ticker interval, μs
903
943
  @ls = Time.now.to_f # best guess at start
904
944
  _start_send_ticker
905
945
  end
@@ -907,7 +947,7 @@ module Stomp
907
947
  # If receiving
908
948
  if @hbr
909
949
  rm = @sx >= @cy ? @sx : @cy # ticker interval, ms
910
- @rti = 1000.0 * rm # ticker interval, μs
950
+ @hbrecv_interval = 1000.0 * rm # ticker interval, μs
911
951
  @lr = Time.now.to_f # best guess at start
912
952
  _start_receive_ticker
913
953
  end
@@ -915,7 +955,7 @@ module Stomp
915
955
  end
916
956
 
917
957
  def _start_send_ticker
918
- sleeptime = @sti / 1000000.0 # Sleep time secs
958
+ sleeptime = @hbsend_interval / 1000000.0 # Sleep time secs
919
959
  @st = Thread.new {
920
960
  while true do
921
961
  sleep sleeptime
@@ -924,7 +964,7 @@ module Stomp
924
964
  @logger.on_hbfire(log_params, "send_fire", curt)
925
965
  end
926
966
  delta = curt - @ls
927
- if delta > (@sti - (@sti/5.0)) / 1000000.0 # Be tolerant (minus)
967
+ if delta > (@hbsend_interval - (@hbsend_interval/5.0)) / 1000000.0 # Be tolerant (minus)
928
968
  if @logger && @logger.respond_to?(:on_hbfire)
929
969
  @logger.on_hbfire(log_params, "send_heartbeat", curt)
930
970
  end
@@ -934,10 +974,11 @@ module Stomp
934
974
  @socket.puts
935
975
  @ls = curt # Update last send
936
976
  @hb_sent = true # Reset if necessary
977
+ @hbsend_count += 1
937
978
  rescue Exception => sendex
938
979
  @hb_sent = false # Set the warning flag
939
980
  if @logger && @logger.respond_to?(:on_hbwrite_fail)
940
- @logger.on_hbwrite_fail(log_params, {"ticker_interval" => @sti,
981
+ @logger.on_hbwrite_fail(log_params, {"ticker_interval" => @hbsend_interval,
941
982
  "exception" => sendex})
942
983
  end
943
984
  raise # Re-raise. What else could be done here?
@@ -950,7 +991,7 @@ module Stomp
950
991
  end
951
992
 
952
993
  def _start_receive_ticker
953
- sleeptime = @rti / 1000000.0 # Sleep time secs
994
+ sleeptime = @hbrecv_interval / 1000000.0 # Sleep time secs
954
995
  @rt = Thread.new {
955
996
  while true do
956
997
  sleep sleeptime
@@ -959,7 +1000,7 @@ module Stomp
959
1000
  @logger.on_hbfire(log_params, "receive_fire", curt)
960
1001
  end
961
1002
  delta = curt - @lr
962
- if delta > ((@rti + (@rti/5.0)) / 1000000.0) # Be tolerant (plus)
1003
+ if delta > ((@hbrecv_interval + (@hbrecv_interval/5.0)) / 1000000.0) # Be tolerant (plus)
963
1004
  if @logger && @logger.respond_to?(:on_hbfire)
964
1005
  @logger.on_hbfire(log_params, "receive_heartbeat", curt)
965
1006
  end
@@ -975,11 +1016,12 @@ module Stomp
975
1016
  @socket.ungetc(last_char)
976
1017
  end
977
1018
  @read_semaphore.unlock
1019
+ @hbrecv_count += 1
978
1020
  else
979
1021
  # Shrug. Have not received one. Just set warning flag.
980
1022
  @hb_received = false
981
1023
  if @logger && @logger.respond_to?(:on_hbread_fail)
982
- @logger.on_hbread_fail(log_params, {"ticker_interval" => @rti})
1024
+ @logger.on_hbread_fail(log_params, {"ticker_interval" => @hbrecv_interval})
983
1025
  end
984
1026
  end
985
1027
  else
@@ -4,7 +4,7 @@ module Stomp
4
4
  module Version #:nodoc: all
5
5
  MAJOR = 1
6
6
  MINOR = 2
7
- PATCH = 3
7
+ PATCH = 4
8
8
  STRING = "#{MAJOR}.#{MINOR}.#{PATCH}"
9
9
  end
10
10
  end
@@ -7,7 +7,7 @@ require 'client_shared_examples'
7
7
  describe Stomp::Client do
8
8
 
9
9
  before(:each) do
10
- @mock_connection = mock('connection')
10
+ @mock_connection = mock('connection', :autoflush= => true)
11
11
  Stomp::Connection.stub!(:new).and_return(@mock_connection)
12
12
  end
13
13
 
@@ -33,6 +33,23 @@ describe Stomp::Client do
33
33
 
34
34
  end
35
35
 
36
+ describe "(autoflush)" do
37
+ it "should delegate to the connection for accessing the autoflush property" do
38
+ @mock_connection.should_receive(:autoflush)
39
+ Stomp::Client.new.autoflush
40
+ end
41
+
42
+ it "should delegate to the connection for setting the autoflush property" do
43
+ @mock_connection.should_receive(:autoflush=).with(true)
44
+ Stomp::Client.new.autoflush = true
45
+ end
46
+
47
+ it "should set the autoflush property on the connection when passing in autoflush as a parameter to the Stomp::Client" do
48
+ @mock_connection.should_receive(:autoflush=).with(true)
49
+ Stomp::Client.new("login", "password", 'localhost', 61613, false, true)
50
+ end
51
+ end
52
+
36
53
  describe "(created with invalid params)" do
37
54
 
38
55
  it "should return ArgumentError if host is nil" do
@@ -21,7 +21,7 @@ describe Stomp::Connection do
21
21
  :connect_timeout => 0,
22
22
  :parse_timeout => 5,
23
23
  :connect_headers => {},
24
- :dmh => false,
24
+ :dmh => false
25
25
  }
26
26
 
27
27
  #POG:
@@ -33,10 +33,43 @@ describe Stomp::Connection do
33
33
  # clone() does a shallow copy, we want a deep one so we can garantee the hosts order
34
34
  normal_parameters = Marshal::load(Marshal::dump(@parameters))
35
35
 
36
- @tcp_socket = mock(:tcp_socket, :close => nil, :puts => nil, :write => nil, :setsockopt => nil)
36
+ @tcp_socket = mock(:tcp_socket, :close => nil, :puts => nil, :write => nil, :setsockopt => nil, :flush => true)
37
37
  TCPSocket.stub!(:open).and_return @tcp_socket
38
38
  @connection = Stomp::Connection.new(normal_parameters)
39
39
  end
40
+
41
+ describe "autoflush" do
42
+ let(:parameter_hash) {
43
+ {
44
+ "hosts" => [
45
+ {:login => "login2", :passcode => "passcode2", :host => "remotehost", :port => 61617, :ssl => false},
46
+ {:login => "login1", :passcode => "passcode1", :host => "localhost", :port => 61616, :ssl => false}
47
+ ],
48
+ "reliable" => true,
49
+ "initialReconnectDelay" => 0.01,
50
+ "maxReconnectDelay" => 30.0,
51
+ "useExponentialBackOff" => true,
52
+ "backOffMultiplier" => 2,
53
+ "maxReconnectAttempts" => 0,
54
+ "randomize" => false,
55
+ "backup" => false,
56
+ "connect_timeout" => 0,
57
+ "parse_timeout" => 5,
58
+ }
59
+ }
60
+
61
+ it "should call flush on the socket when autoflush is true" do
62
+ @tcp_socket.should_receive(:flush)
63
+ @connection = Stomp::Connection.new(parameter_hash.merge("autoflush" => true))
64
+ @connection.publish "/queue", "message", :suppress_content_length => false
65
+ end
66
+
67
+ it "should not call flush on the socket when autoflush is false" do
68
+ @tcp_socket.should_not_receive(:flush)
69
+ @connection = Stomp::Connection.new(parameter_hash)
70
+ @connection.publish "/queue", "message", :suppress_content_length => false
71
+ end
72
+ end
40
73
 
41
74
  describe "(created using a hash)" do
42
75
  it "should uncamelize and symbolize the main hash keys" do
@@ -54,7 +87,7 @@ describe Stomp::Connection do
54
87
  "randomize" => false,
55
88
  "backup" => false,
56
89
  "connect_timeout" => 0,
57
- "parse_timeout" => 5,
90
+ "parse_timeout" => 5
58
91
  }
59
92
 
60
93
  @connection = Stomp::Connection.new(used_hash)
@@ -233,7 +266,7 @@ describe Stomp::Connection do
233
266
 
234
267
  before(:each) do
235
268
  ssl_parameters = {:hosts => [{:login => "login2", :passcode => "passcode2", :host => "remotehost", :ssl => true}]}
236
- @ssl_socket = mock(:ssl_socket, :puts => nil, :write => nil, :setsockopt => nil)
269
+ @ssl_socket = mock(:ssl_socket, :puts => nil, :write => nil, :setsockopt => nil, :flush => true)
237
270
 
238
271
  TCPSocket.should_receive(:open).and_return @tcp_socket
239
272
  OpenSSL::SSL::SSLSocket.should_receive(:new).and_return(@ssl_socket)
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{stomp}
8
- s.version = "1.2.3"
8
+ s.version = "1.2.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian McCallister", "Marius Mathiesen", "Thiago Morello", "Guy M. Allard"]
12
- s.date = %q{2012-06-16}
12
+ s.date = %q{2012-06-25}
13
13
  s.description = %q{Ruby client for the Stomp messaging protocol. Note that this gem is no longer supported on rubyforge.}
14
14
  s.email = ["brianm@apache.org", "marius@stones.com", "morellon@gmail.com", "allard.guy.m@gmail.com"]
15
15
  s.executables = ["catstomp", "stompcat"]
@@ -69,7 +69,7 @@ class TestClient < Test::Unit::TestCase
69
69
  assert_equal message_text, received2.body
70
70
  assert_equal received.body, received2.body
71
71
  assert_equal received.headers['message-id'], received2.headers['message-id'] unless ENV['STOMP_RABBIT']
72
- end
72
+ end unless RUBY_ENGINE =~ /jruby/
73
73
 
74
74
  def test_receipts
75
75
  receipt = false
@@ -104,7 +104,7 @@ class TestClient < Test::Unit::TestCase
104
104
  assert_raise(RuntimeError) do
105
105
  @client.subscribe make_destination
106
106
  end
107
- end
107
+ end unless RUBY_ENGINE =~ /jruby/
108
108
 
109
109
  def test_transactional_publish
110
110
  @client.begin 'tx1'
@@ -131,7 +131,7 @@ class TestClient < Test::Unit::TestCase
131
131
  @client.subscribe(make_destination) {|m| message = m}
132
132
  sleep 0.01 until message
133
133
  assert_equal "second_message", message.body
134
- end
134
+ end unless RUBY_ENGINE =~ /jruby/
135
135
 
136
136
  def test_transaction_ack_rollback_with_new_client
137
137
  @client.publish make_destination, message_text
@@ -312,7 +312,7 @@ class TestClient < Test::Unit::TestCase
312
312
 
313
313
  def test_connection_frame
314
314
  assert_not_nil @client.connection_frame
315
- end
315
+ end unless RUBY_ENGINE =~ /jruby/
316
316
 
317
317
  def test_unsubscribe
318
318
  message = nil
@@ -372,7 +372,7 @@ class TestClient < Test::Unit::TestCase
372
372
  @client.publish(dest, message_text)
373
373
  sleep 1
374
374
  assert_not_nil msg
375
- end
375
+ end unless RUBY_ENGINE =~ /jruby/
376
376
 
377
377
  def test_thread_multi_subscribe
378
378
  #
@@ -382,7 +382,7 @@ class TestConnection < Test::Unit::TestCase
382
382
  msg2 = @conn.receive
383
383
  assert_equal smsg, msg2.body
384
384
  end
385
- end
385
+ end unless ENV['STOMP_AMQ11'] # AMQ sends NACK'd messages to a DLQ
386
386
 
387
387
  # Test to illustrate Issue #44. Prior to a fix for #44, these tests would
388
388
  # fail only when connecting to a pure STOMP 1.0 server that does not
@@ -102,6 +102,8 @@ class TestConnection1P < Test::Unit::TestCase
102
102
  conn = Stomp::Connection.open(user, passcode, host, port, false, 5, cha)
103
103
  conn.disconnect
104
104
  end
105
+ assert conn.hbsend_interval > 0
106
+ assert conn.hbrecv_interval > 0
105
107
  end
106
108
 
107
109
  #
@@ -109,7 +111,7 @@ class TestConnection1P < Test::Unit::TestCase
109
111
  #
110
112
  cha = {:host => "localhost", "accept-version" => "1.1"}
111
113
  cha[:host] = "/" if ENV['STOMP_RABBIT']
112
- cha["heart-beat"] = "5000,0" # Valid heart beat headers, send only
114
+ cha["heart-beat"] = "10000,0" # Valid heart beat headers, send only
113
115
  conn = nil
114
116
  logger = Tlogger.new
115
117
  assert_nothing_raised do
@@ -119,6 +121,7 @@ class TestConnection1P < Test::Unit::TestCase
119
121
  conn.set_logger(nil)
120
122
  conn.disconnect
121
123
  end
124
+ hb_asserts_send(conn)
122
125
  end if ENV['STOMP_HB11LONG']
123
126
 
124
127
  #
@@ -126,7 +129,7 @@ class TestConnection1P < Test::Unit::TestCase
126
129
  #
127
130
  cha = {:host => "localhost", "accept-version" => "1.1"}
128
131
  cha[:host] = "/" if ENV['STOMP_RABBIT']
129
- cha["heart-beat"] = "0,10000" # Valid heart beat headers, receive only
132
+ cha["heart-beat"] = "0,6000" # Valid heart beat headers, receive only
130
133
  conn = nil
131
134
  logger = Tlogger.new
132
135
  assert_nothing_raised do
@@ -137,6 +140,7 @@ class TestConnection1P < Test::Unit::TestCase
137
140
  conn.set_logger(nil)
138
141
  conn.disconnect
139
142
  end
143
+ hb_asserts_recv(conn)
140
144
  end if ENV['STOMP_HB11LONG']
141
145
 
142
146
  #
@@ -155,7 +159,9 @@ class TestConnection1P < Test::Unit::TestCase
155
159
  conn.set_logger(nil)
156
160
  conn.disconnect
157
161
  end
162
+ hb_asserts_both(conn)
158
163
  end if ENV['STOMP_HB11LONG']
164
+
159
165
  #
160
166
  def test_conn_1p_0110
161
167
  #
@@ -255,5 +261,86 @@ class TestConnection1P < Test::Unit::TestCase
255
261
  @conn.subscribe dest, :id => sid
256
262
  }
257
263
  end
264
+
265
+ #
266
+ def test_conn_1p_0130
267
+ #
268
+ cha = {:host => "localhost", "accept-version" => "1.1"}
269
+ cha[:host] = "/" if ENV['STOMP_RABBIT']
270
+ cha["heart-beat"] = "10000,6000" # Valid heart beat headers, send and receive
271
+ conn = nil
272
+ logger = Tlogger.new
273
+ assert_nothing_raised do
274
+ conn = Stomp::Connection.open(user, passcode, host, port, false, 5, cha)
275
+ # m = conn.receive # This will hang forever .....
276
+ conn.set_logger(logger)
277
+ sleep 65
278
+ conn.set_logger(nil)
279
+ conn.disconnect
280
+ end
281
+ hb_asserts_both(conn)
282
+ end if ENV['STOMP_HB11LONG']
283
+
284
+ #
285
+ def test_conn_1p_0130
286
+ #
287
+ cha = {:host => "localhost", "accept-version" => "1.1"}
288
+ cha[:host] = "/" if ENV['STOMP_RABBIT']
289
+ cha["heart-beat"] = "10000,1000" # Valid heart beat headers, send and receive
290
+ conn = nil
291
+ logger = Tlogger.new
292
+ assert_nothing_raised do
293
+ conn = Stomp::Connection.open(user, passcode, host, port, false, 5, cha)
294
+ # m = conn.receive # This will hang forever .....
295
+ conn.set_logger(logger)
296
+ sleep 65
297
+ conn.set_logger(nil)
298
+ conn.disconnect
299
+ end
300
+ hb_asserts_both(conn)
301
+ end if ENV['STOMP_HB11LONG']
302
+
303
+ #
304
+ def test_conn_1p_0140
305
+ #
306
+ cha = {:host => "localhost", "accept-version" => "1.1"}
307
+ cha[:host] = "/" if ENV['STOMP_RABBIT']
308
+ cha["heart-beat"] = "1000,10000" # Valid heart beat headers, send and receive
309
+ conn = nil
310
+ logger = Tlogger.new
311
+ assert_nothing_raised do
312
+ conn = Stomp::Connection.open(user, passcode, host, port, false, 5, cha)
313
+ # m = conn.receive # This will hang forever .....
314
+ conn.set_logger(logger)
315
+ sleep 65
316
+ conn.set_logger(nil)
317
+ conn.disconnect
318
+ end
319
+ hb_asserts_both(conn)
320
+ end if ENV['STOMP_HB11LONG']
321
+
322
+ private
323
+
324
+ def hb_asserts_both(conn)
325
+ assert conn.hbsend_interval > 0
326
+ assert conn.hbrecv_interval > 0
327
+ assert conn.hbsend_count > 0
328
+ assert conn.hbrecv_count > 0
329
+ end
330
+
331
+ def hb_asserts_send(conn)
332
+ assert conn.hbsend_interval > 0
333
+ assert conn.hbrecv_interval == 0
334
+ assert conn.hbsend_count > 0
335
+ assert conn.hbrecv_count == 0
336
+ end
337
+
338
+ def hb_asserts_recv(conn)
339
+ assert conn.hbsend_interval == 0
340
+ assert conn.hbrecv_interval > 0
341
+ assert conn.hbsend_count == 0
342
+ assert conn.hbrecv_count > 0
343
+ end
344
+
258
345
  end if ENV['STOMP_TEST11']
259
346
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stomp
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
- - 3
10
- version: 1.2.3
9
+ - 4
10
+ version: 1.2.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Brian McCallister
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2012-06-16 00:00:00 -04:00
21
+ date: 2012-06-25 00:00:00 -04:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency