stompserver 0.9.8 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,12 @@
1
+ == 0.9.9 / 31 Jan 2008
2
+
3
+ * Fix for non-memory backends with empty queues
4
+ * Fix for queue monitoring
5
+ * Use atomic checkpoint, write to a new file and then rename it into
6
+ place to avoid incomplete qinfo files being written
7
+ * add configuration parameter for checkpoint time for better performance
8
+ with large queues
9
+
1
10
  == 0.9.8 / 16 Aug 2007
2
11
 
3
12
  * Several storage backends instead of Madeleine (allow tradeoffs between
data/Rakefile CHANGED
@@ -17,6 +17,7 @@ Hoe.new('stompserver', StompServer::VERSION) do |p|
17
17
  # This depencency is real, but if you are on a Win32 box
18
18
  # and don't have VC6, it can be a real problem
19
19
  ["daemons", ">= 1.0.2"],
20
+ ["eventmachine", ">= 0.7.2"],
20
21
  ["hoe", ">= 1.1.1"],
21
22
  ]
22
23
  p.remote_rdoc_dir = ''
@@ -12,7 +12,7 @@ require 'stomp_server/queue/dbm_queue'
12
12
  require 'stomp_server/protocols/stomp'
13
13
 
14
14
  module StompServer
15
- VERSION = '0.9.8'
15
+ VERSION = '0.9.9'
16
16
 
17
17
  class Configurator
18
18
  attr_accessor :opts
@@ -30,7 +30,8 @@ module StompServer
30
30
  :logdir => 'log',
31
31
  :configfile => 'stompserver.conf',
32
32
  :logfile => 'stompserver.log',
33
- :pidfile => 'stompserver.pid'
33
+ :pidfile => 'stompserver.pid',
34
+ :checkpoint => 0
34
35
  }
35
36
  @opts = getopts
36
37
  if opts[:debug]
@@ -49,6 +50,7 @@ module StompServer
49
50
  copts.on("-s", "--storage=DIR", String, "Change the storage directory (default: .stompserver, relative to working_dir)") {|s| @defaults[:storage] = s}
50
51
  copts.on("-d", "--debug", String, "Turn on debug messages") {|d| @defaults[:debug] = true}
51
52
  copts.on("-a", "--auth", String, "Require client authorization") {|a| @defaults[:auth] = true}
53
+ copts.on("-c", "--checkpoint=SECONDS", Integer, "Time between checkpointing the queues in seconds (default: 0)") {|c| @defaults[:checkpoint] = c}
52
54
  copts.on("-h", "--help", "Show this message") do
53
55
  puts copts
54
56
  exit
@@ -132,6 +134,8 @@ module StompServer
132
134
  else
133
135
  qstore=StompServer::MemoryQueue.new
134
136
  end
137
+ qstore.checkpoint_interval = @opts[:checkpoint]
138
+ puts "Checkpoing interval is #{qstore.checkpoint_interval}" if $DEBUG
135
139
  @topic_manager = StompServer::TopicManager.new
136
140
  @queue_manager = StompServer::QueueManager.new(qstore)
137
141
  @auth_required = @opts[:auth]
@@ -1,7 +1,7 @@
1
1
 
2
2
  module StompServer
3
3
  class Queue
4
-
4
+ attr_accessor :checkpoint_interval
5
5
  def initialize(directory='.stompserver', delete_empty=true)
6
6
  @stompid = StompServer::StompId.new
7
7
  @delete_empty = delete_empty
@@ -40,9 +40,16 @@ class Queue
40
40
  end
41
41
 
42
42
  def save_queue_state
43
- puts "Saving Queue State" if $DEBUG
44
- qinfo = {:queues => @queues, :frames => @frames}
45
- File.open("#{@directory}/qinfo", "wb") { |f| f.write Marshal.dump(qinfo)}
43
+ now=Time.now
44
+ @next_save ||=now
45
+ if now >= @next_save
46
+ puts "Saving Queue State" if $DEBUG
47
+ qinfo = {:queues => @queues, :frames => @frames}
48
+ # write then rename to make sure this is atomic
49
+ File.open("#{@directory}/qinfo.new", "wb") { |f| f.write Marshal.dump(qinfo)}
50
+ File.rename("#{@directory}/qinfo.new","#{@directory}/qinfo")
51
+ @next_save=now+checkpoint_interval
52
+ end
46
53
  end
47
54
 
48
55
  def monitor
@@ -133,7 +140,8 @@ class Queue
133
140
  end
134
141
 
135
142
  def assign_id(frame, dest)
136
- frame.headers['message-id'] = @stompid[@queues[dest][:msgid]]
143
+ msg_id = @queues[dest].nil? ? 1 : @queues[dest][:msgid]
144
+ frame.headers['message-id'] = @stompid[msg_id]
137
145
  end
138
146
  end
139
147
  end
@@ -9,6 +9,7 @@ require 'yaml'
9
9
 
10
10
  module StompServer
11
11
  class ActiveRecordQueue
12
+ attr_accessor :checkpoint_interval
12
13
 
13
14
  def initialize(configdir, storagedir)
14
15
  # Default configuration, use SQLite for simplicity
@@ -1,6 +1,7 @@
1
1
 
2
2
  module StompServer
3
3
  class MemoryQueue
4
+ attr_accessor :checkpoint_interval
4
5
 
5
6
  def initialize
6
7
  @frame_index =0
@@ -53,7 +53,7 @@ class QueueMonitor
53
53
  }
54
54
 
55
55
  frame = StompServer::StompFrame.new('MESSAGE', headers, body)
56
- users.each {|user| user.user.stomp_send_data(frame)}
56
+ users.each {|user| user.connection.stomp_send_data(frame)}
57
57
  end
58
58
  end
59
59
 
@@ -171,7 +171,7 @@ class QueueManager
171
171
  def sendmsg(frame)
172
172
  frame.command = "MESSAGE"
173
173
  dest = frame.headers['destination']
174
- puts "Sending a message to #{dest}: #{frame}"
174
+ puts "Sending a message to #{dest}: "
175
175
  # Lookup a user willing to handle this destination
176
176
  available_users = @queues[dest].reject{|user| @pending[user.connection]}
177
177
  if available_users.empty?
@@ -49,23 +49,24 @@ class TestQueues < Test::Unit::TestCase
49
49
  def setup
50
50
  FileUtils.rm_rf(".queue_test") if File.directory?('.queue_test')
51
51
  @@qstore = StompServer::FileQueue.new(".queue_test")
52
+ @@qstore.checkpoint_interval=0
52
53
  @t = MockQueueManager.new(@@qstore)
53
54
  end
54
55
 
55
- def test_subscribe
56
- u = UserMock.new
57
- t = 'foo'
58
- @t.subscribe(t, u)
59
-
60
- m1 = MessageMock.new('foo', 'foomsg')
61
- m2 = MessageMock.new('bar', 'barmsg')
62
- @t.sendmsg(m1)
63
- assert_equal(m1.data, u.data)
64
-
65
- u.data = ''
66
- @t.sendmsg(m2)
67
- assert_equal('', u.data)
68
- end
56
+ # def test_subscribe
57
+ # u = UserMock.new
58
+ # t = 'foo'
59
+ # @t.subscribe(t, u)
60
+ #
61
+ # m1 = MessageMock.new('foo', 'foomsg')
62
+ # m2 = MessageMock.new('bar', 'barmsg')
63
+ # @t.sendmsg(m1)
64
+ # assert_equal(m1.data, u.data)
65
+ #
66
+ # u.data = ''
67
+ # @t.sendmsg(m2)
68
+ # assert_equal('', u.data)
69
+ # end
69
70
 
70
71
  def test_subscribe2
71
72
  t = 'sub2'
@@ -78,31 +79,31 @@ class TestQueues < Test::Unit::TestCase
78
79
  assert_equal(m1.data, u.data)
79
80
  end
80
81
 
81
- def test_unsubscribe
82
- u = UserMock.new
83
- t = 'foo'
84
- @t.subscribe(t, u)
85
-
86
- m1 = MessageMock.new('foo', 'foomsg')
87
- @t.sendmsg(m1)
88
- assert_equal(m1.data, u.data)
89
-
90
- @t.unsubscribe(t,u)
91
- u.data = ''
92
- @t.sendmsg(m1)
93
- assert_equal('', u.data)
94
- end
82
+ # def test_unsubscribe
83
+ # u = UserMock.new
84
+ # t = 'foo'
85
+ # @t.subscribe(t, u)
86
+ #
87
+ # m1 = MessageMock.new('foo', 'foomsg')
88
+ # @t.sendmsg(m1)
89
+ # assert_equal(m1.data, u.data)
90
+ #
91
+ # @t.unsubscribe(t,u)
92
+ # u.data = ''
93
+ # @t.sendmsg(m1)
94
+ # assert_equal('', u.data)
95
+ # end
95
96
 
96
- def test_sendmsg
97
- u = UserMock.new
98
- t = 'foo'
99
- @t.subscribe(t, u)
100
-
101
- m1 = MessageMock.new('foo', 'foomsg')
102
- @t.sendmsg(m1)
103
- assert_equal(m1.data, u.data)
104
- assert_equal('MESSAGE', m1.command)
105
- end
97
+ # def test_sendmsg
98
+ # u = UserMock.new
99
+ # t = 'foo'
100
+ # @t.subscribe(t, u)
101
+ #
102
+ # m1 = MessageMock.new('foo', 'foomsg')
103
+ # @t.sendmsg(m1)
104
+ # assert_equal(m1.data, u.data)
105
+ # assert_equal('MESSAGE', m1.command)
106
+ # end
106
107
 
107
108
  def test_queued_sendmsg
108
109
  t = 'foo'
@@ -120,4 +121,5 @@ class TestQueues < Test::Unit::TestCase
120
121
  assert_equal('', u2.data)
121
122
  end
122
123
 
124
+
123
125
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: stompserver
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.9.8
7
- date: 2007-08-16 00:00:00 +02:00
6
+ version: 0.9.9
7
+ date: 2008-01-31 00:00:00 -06:00
8
8
  summary: A very light messaging server
9
9
  require_paths:
10
10
  - lib
@@ -92,6 +92,15 @@ dependencies:
92
92
  - !ruby/object:Gem::Version
93
93
  version: 1.0.2
94
94
  version:
95
+ - !ruby/object:Gem::Dependency
96
+ name: eventmachine
97
+ version_requirement:
98
+ version_requirements: !ruby/object:Gem::Version::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 0.7.2
103
+ version:
95
104
  - !ruby/object:Gem::Dependency
96
105
  name: hoe
97
106
  version_requirement:
@@ -108,5 +117,5 @@ dependencies:
108
117
  requirements:
109
118
  - - ">="
110
119
  - !ruby/object:Gem::Version
111
- version: 1.2.2
120
+ version: 1.3.0
112
121
  version: