reliable-msg-agent 0.0.1

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/History.txt ADDED
@@ -0,0 +1,5 @@
1
+
2
+ == 0.0.1 2011-03-18
3
+
4
+ * minimum feature
5
+
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+
2
+ Permission is hereby granted, free of charge, to any person obtaining
3
+ a copy of this software and associated documentation files (the
4
+ "Software"), to deal in the Software without restriction, including
5
+ without limitation the rights to use, copy, modify, merge, publish,
6
+ distribute, sublicense, and/or sell copies of the Software, and to
7
+ permit persons to whom the Software is furnished to do so, subject to
8
+ the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be
11
+ included in all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
17
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
18
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
19
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
+
data/README.rdoc ADDED
@@ -0,0 +1,90 @@
1
+ == Reliable-msg-agent
2
+
3
+ reliable-msg-agent is consumer for reliable-msg.
4
+
5
+ The pull type approach that acquires the message accumulated
6
+ in A and processes it is taken.
7
+
8
+
9
+ === System configuration
10
+
11
+ +-------------+
12
+ | Application |
13
+ +-------------+
14
+ |
15
+ | Push Message
16
+ +
17
+ +-------------+
18
+ | ReliableMsg |+------+
19
+ +-------------+ |
20
+ + | <-- Agent regularly acquires
21
+ | | the message from ReliableMsg.
22
+ + +
23
+ +-------+ +-------+
24
+ | Agent | ... + Agent +
25
+ +-------+ +-------+
26
+
27
+ == Getting started
28
+
29
+ === Install
30
+
31
+ gem install reliable-msg-agent
32
+
33
+ === Set configuration file
34
+
35
+ * {GEM_INSTALL_DIR}/resources/agent.conf
36
+ please arrange agent.conf in appropriate path.
37
+ (default: /etc/reliable-msg-agent/agent.conf)
38
+ * {GEM_INSTALL_DIR}/resources/agent.rb
39
+ please arrange agent.conf in appropriate path.
40
+ (default: /etc/reliable-msg-agent/agent.rb)
41
+
42
+ == Reliable-msg-agent commands
43
+
44
+ $ reliable-msg-agent
45
+ reliable-msg-agent available commands:
46
+ stop
47
+ start
48
+
49
+ === start
50
+
51
+ $ reliable-msg-agent start --help
52
+ Usage: reliable-msg-agent start [options]
53
+ -v, --verbose Verbose output
54
+ -c, --conf=CONFFILE Config file
55
+ -l, --log=LOGFILE Log file
56
+ -p, --pid=PIDFILE PID file
57
+ -h, --help Show this message
58
+ --version Show version
59
+
60
+ * -v, --verbose
61
+ verbose output.
62
+ * -c, --conf=CONFFILE
63
+ path for config file. default is /etc/reliable-msg-agent/agent.conf
64
+ * -l, --log=LOGFILE
65
+ path for log file. default is /var/reliable-msg-agent/agent.log
66
+ * -p, --pid=PIDFILE
67
+ path for pid file. default is /var/reliable-msg-agent/agent.pid
68
+ * -h, --help
69
+ show this message.
70
+ * --version
71
+ show version.
72
+
73
+ === stop
74
+
75
+ $ reliable-msg-agent stop --help
76
+ Usage: reliable-msg-agent stop [options]
77
+ -v, --verbose Verbose output
78
+ -p, --pid=PIDFILE PID file (only for the daemon mode)
79
+ -h, --help Show this message
80
+ --version Show version
81
+
82
+ * -v, --verbose
83
+ verbose output.
84
+ * -p, --pid=PIDFILE
85
+ path for pid file. default is /var/reliable-msg-agent/agent.pid
86
+ * -h, --help
87
+ show this message.
88
+ * --version
89
+ show version.
90
+
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+
2
+ require "rubygems"
3
+ require "rake"
4
+ require "rake/clean"
5
+ require "rake/gempackagetask"
6
+ require "rake/rdoctask"
7
+
8
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
9
+ require "reliable-msg/agent/version"
10
+
11
+ spec = Gem::Specification.new do |s|
12
+ s.name = "reliable-msg-agent"
13
+ s.version = ReliableMsg::Agent::Version::STRING
14
+ s.has_rdoc = true
15
+ s.extra_rdoc_files = ["README.rdoc"]
16
+ s.summary = "This(it) is agent daemon for reliable-msg queue"
17
+ s.description = s.summary
18
+ s.executables = Dir.glob("bin/**/*").map { |f| File.basename(f) }
19
+ s.files = %w(History.txt MIT-LICENSE README.rdoc Rakefile) + Dir.glob("{bin,ext,lib,spec}/**/*")
20
+ s.require_path = "lib"
21
+ s.bindir = "bin"
22
+ s.author = "hamajyotan"
23
+ s.email = "hamajyotan@gmail.com"
24
+ s.homepage = "https://github.com/hamajyotan/reliable-msg-agent"
25
+
26
+ s.add_dependency("reliable-msg")
27
+ end
28
+
29
+ Rake::GemPackageTask.new(spec) do |p|
30
+ p.gem_spec = spec
31
+ p.need_tar = true
32
+ p.need_zip = true
33
+ end
34
+
35
+ Rake::RDocTask.new do |rdoc|
36
+ files =["README.rdoc", "MIT-LICENSE", "lib/**/*.rb"]
37
+ rdoc.rdoc_files.add(files)
38
+ rdoc.main = "README.rdoc" # page to start on
39
+ rdoc.title = "reliable-msg-agent Docs"
40
+ rdoc.rdoc_dir = "doc/rdoc" # rdoc output folder
41
+ rdoc.options << "--line-numbers"
42
+ end
43
+
44
+ Dir["tasks/**/*.rake"].each { |t| load t }
45
+ task :default => [:spec]
46
+
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "optparse"
4
+
5
+ require "rubygems"
6
+ require "reliable-msg/agent"
7
+
8
+ parsers = {}
9
+ options = {}
10
+
11
+ parsers["start"] = OptionParser.new { |parser|
12
+ parser.program_name += " start"
13
+
14
+ parser.on("-v", "--verbose", "Verbose output") {
15
+ options[:verbose] = true
16
+ }
17
+ parser.on("-c", "--conf=CONFFILE", "Config file") { |v|
18
+ options[:conf] = v
19
+ }
20
+ parser.on("-l", "--log=LOGFILE", "Log file") { |v|
21
+ options[:log] = v
22
+ }
23
+ parser.on("-p", "--pid=PIDFILE", "PID file") { |v|
24
+ options[:pid] = v
25
+ }
26
+ }
27
+ parsers["stop"] = OptionParser.new { |parser|
28
+ parser.program_name += " stop"
29
+
30
+ parser.on("-v", "--verbose", "Verbose output") {
31
+ options[:verbose] = true
32
+ }
33
+ parser.on("-p", "--pid=PIDFILE", "PID file (only for the daemon mode)") { |v|
34
+ options[:pid] = v
35
+ }
36
+ }
37
+ parsers.each { |k,v| parser = v
38
+ parser.version = ReliableMsg::Agent::Version::STRING
39
+
40
+ parser.on_tail("-h", "--help", "Show this message") {
41
+ $stderr.puts parser
42
+ exit
43
+ }
44
+ parser.on_tail("--version", "Show version") {
45
+ $stdout.puts ReliableMsg::Agent::Version::STRING
46
+ exit
47
+ }
48
+ }
49
+
50
+ subcommand = ARGV.shift
51
+ unless parsers.keys.include?(subcommand)
52
+ $stderr.puts "#{File.basename($0, ".*")} available commands:"
53
+ $stderr.puts parsers.keys.map { |cmd| "\t#{cmd}" }.join("\n")
54
+ $stderr.puts
55
+ exit 1
56
+ end
57
+ parsers[subcommand].parse! ARGV
58
+
59
+ require "reliable-msg/agent/scripts/script_runner"
60
+ ReliableMsg::Agent::ScriptRunner.new.send subcommand.to_sym, options
61
+
@@ -0,0 +1,16 @@
1
+
2
+ require "rubygems"
3
+ require "reliable-msg/agent"
4
+
5
+ module ReliableMsg::Agent #:nodoc:
6
+ class Agent
7
+ def initialize logger
8
+ @logger = logger
9
+ end
10
+
11
+ def call msg, options = {}
12
+ raise AgentError, "#call(msg,options={}) not implemented!"
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,8 @@
1
+
2
+ require "rubygems"
3
+ require "reliable-msg/agent"
4
+
5
+ module ReliableMsg::Agent #:nodoc:
6
+ class AgentError < RuntimeError; end
7
+ end
8
+
@@ -0,0 +1,170 @@
1
+
2
+ require "rubygems"
3
+ require "reliable-msg/agent"
4
+
5
+ require "erb"
6
+ require "logger"
7
+ require "yaml"
8
+ require "fileutils"
9
+ require "timeout"
10
+ require "etc"
11
+
12
+ module ReliableMsg::Agent #:nodoc:
13
+ class ScriptRunner #:nodoc:
14
+
15
+ def start options = {}
16
+ $stderr.puts "*** Starting ReliableMsg-Agent..."
17
+
18
+ default_options = {
19
+ :verbose => false,
20
+ :conf => "/etc/reliable-msg-agent/agent.conf",
21
+ :log => "/var/reliable-msg-agent/agent.log",
22
+ :pid => "/var/reliable-msg-agent/agent.pid",
23
+ }
24
+ opt = default_options.merge options
25
+
26
+ conf = load_configurations opt[:conf]
27
+ change_privilege conf
28
+ pidfile_accessible_test opt[:pid]
29
+ logger = create_logger conf["logger"], opt[:log]
30
+
31
+ agent_definition conf["agent"]
32
+
33
+ daemonize(logger) {
34
+ service = Service.new logger, conf
35
+
36
+ register_signal_handler logger, service, opt[:pid]
37
+
38
+ service.start
39
+ write_pidfile opt[:pid]
40
+ while service.alive?; sleep 3; end
41
+ }
42
+
43
+ rescue Exception => e
44
+ $stderr.puts "--- ReliableMsg-Agent error! - #{e.message}"
45
+ $stderr.puts e.backtrace.join("\n\t") if opt[:verbose]
46
+ exit 1
47
+
48
+ ensure
49
+ $stderr.puts "*** done."
50
+ end
51
+
52
+ def stop options = {}
53
+ $stderr.puts "*** Stopping ReliableMsg-Agent..."
54
+
55
+ default_options = {
56
+ :verbose => false,
57
+ :pid => "/var/reliable-msg-agent/agent.pid",
58
+ }
59
+ opt = default_options.merge options
60
+
61
+ # send signal
62
+ pid = File.open(opt[:pid], "r") { |f| f.read }.to_i
63
+ Process.kill :TERM, pid
64
+
65
+ # wait
66
+ timeout(10.0) { Process.waitpid pid rescue nil }
67
+
68
+ rescue Exception => e
69
+ $stderr.puts "--- ReliableMsg-Agent error! - #{e.message}"
70
+ $stderr.puts e.backtrace.join("\n\t") if opt[:verbose]
71
+ exit 1
72
+
73
+ ensure
74
+ $stderr.puts "*** done."
75
+ end
76
+
77
+ private
78
+
79
+ def load_configurations conffile
80
+ YAML.load(ERB.new(IO.read(conffile)).result)
81
+ end
82
+
83
+ def change_privilege conf
84
+ user = conf["user"]
85
+ uid = begin
86
+ Etc.getpwnam(user.to_s).uid
87
+ rescue ArgumentError
88
+ raise "can't find user for #{user}"
89
+ end
90
+ group = conf["group"]
91
+ gid = begin
92
+ Etc.getgrnam(group.to_s).gid
93
+ rescue ArgumentError
94
+ raise "can't find group for #{group}"
95
+ end
96
+
97
+ raise "Dont't run as root user." if uid == 0
98
+
99
+ Process::Sys.setegid(gid)
100
+ Process::Sys.seteuid(uid)
101
+ end
102
+
103
+ def pidfile_accessible_test pid
104
+ raise "PID file already exists - #{pid}" if File.exist?(pid)
105
+ FileUtils.touch pid; File.unlink pid
106
+ end
107
+
108
+ def create_logger creation_procedure, logfile
109
+ if creation_procedure
110
+ eval(creation_procedure.to_s).call(logfile)
111
+ else
112
+ Logger.new(logfile)
113
+ end
114
+ end
115
+
116
+ def daemonize logger
117
+ fork {
118
+ Process.setsid
119
+ fork {
120
+ begin
121
+ Dir.chdir("/")
122
+ $stdin.reopen "/dev/null", "r"
123
+ $stdout.reopen "/dev/null", "a"
124
+ $stderr.reopen "/dev/null", "a"
125
+
126
+ yield
127
+ sleep
128
+
129
+ rescue Exception => e
130
+ logger.fatal { "ReliableMsg-Agent error! - #{e.message}" }
131
+ logger.fatal { e.backtrace.join("\n\t") }
132
+ exit! 1
133
+ end
134
+ }
135
+ }
136
+ end
137
+
138
+ def register_signal_handler logger, service, pidfile
139
+ stopping = false
140
+ [:TERM].each { |sig|
141
+ Signal.trap(sig) {
142
+ unless stopping
143
+ begin
144
+ stopping = true
145
+ service.stop
146
+ File.unlink pidfile if File.exist? pidfile
147
+ exit! 0
148
+
149
+ rescue Exception => e
150
+ File.unlink pidfile if File.exist? pidfile
151
+ logger.fatal { "ReliableMsg-Agent error! - #{e.message}" }
152
+ logger.fatal { e.backtrace.join("\n\t") }
153
+ exit! 1
154
+ end
155
+ end
156
+ }
157
+ }
158
+ end
159
+
160
+ def write_pidfile pidfile
161
+ File.open(pidfile, "w") { |f| f.puts $$ }
162
+ end
163
+
164
+ def agent_definition deffile
165
+ Agent.class_eval open(deffile, "r") { |f| f.read }
166
+ end
167
+
168
+ end
169
+ end
170
+
@@ -0,0 +1,44 @@
1
+
2
+ require "rubygems"
3
+ require "reliable-msg/agent"
4
+
5
+ require "monitor"
6
+
7
+ module ReliableMsg::Agent #:nodoc:
8
+ class Service
9
+ def initialize logger, options = {}
10
+ @logger = logger
11
+ @options = options
12
+
13
+ @workers = Workers.new @logger, @options
14
+ @locker = Monitor.new
15
+ end
16
+
17
+ def start
18
+ @locker.synchronize {
19
+ raise AgentError, "service already started." if alive?
20
+
21
+ @logger.info { "reliable-msg agent service starting..." }
22
+ @workers.start
23
+ @logger.info { "reliable-msg agent service started." }
24
+ }
25
+ end
26
+
27
+ def stop
28
+ @locker.synchronize {
29
+ raise AgentError, "service already stopped." unless alive?
30
+
31
+ @logger.info { "reliable-msg agent service stopping..." }
32
+ @workers.stop
33
+ @logger.info { "reliable-msg agent service stopped." }
34
+ }
35
+ end
36
+
37
+ def alive?
38
+ @locker.synchronize {
39
+ !! @workers.alive?
40
+ }
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,17 @@
1
+
2
+ require "rubygems"
3
+ require "reliable-msg/agent"
4
+
5
+ module ReliableMsg::Agent #:nodoc:
6
+ module Version #:nodoc:
7
+ unless defined? MAJOR
8
+ MAJOR = 0
9
+ MINOR = 0
10
+ TINY = 1
11
+ PRE = nil
12
+
13
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,90 @@
1
+
2
+ require "rubygems"
3
+ require "reliable-msg/agent"
4
+
5
+ require "monitor"
6
+
7
+ module ReliableMsg::Agent #:nodoc:
8
+ class Workers
9
+
10
+ @@default_options = {
11
+ :uri => "druby://localhost:6438",
12
+ :every => 1.0,
13
+ :target => "queue.*",
14
+ :threads => 1,
15
+ }.freeze
16
+
17
+ def initialize logger, options = {}
18
+ @logger = logger
19
+ @options = options
20
+ @locker = Monitor.new
21
+ @threads = nil
22
+ end
23
+
24
+ def start
25
+ @locker.synchronize {
26
+ raise AgentError, "workers already started." if alive?
27
+
28
+ @logger.info { "starting workers." }
29
+
30
+ threads = (t = @options[:threads].to_i) <= 0 ? 1 : t
31
+ @threads = (1..threads).inject([]) { |t, i|
32
+ t << Thread.fork { worker_loop }
33
+ }
34
+ }
35
+ end
36
+
37
+ def stop
38
+ @locker.synchronize {
39
+ raise AgentError, "workers already stopped." unless alive?
40
+
41
+ @logger.info { "stopping workers." }
42
+
43
+ @threads.each { |t| t[:dying] = true }
44
+ @threads.each { |t| t.wakeup rescue nil }
45
+ @threads.each { |t| t.join }
46
+ @threads = nil
47
+ }
48
+ end
49
+
50
+ def alive?
51
+ @locker.synchronize { !! @threads }
52
+ end
53
+
54
+ private
55
+
56
+ def worker_loop
57
+ agent = Agent.new @logger
58
+ uri = @options[:uri] || @@default_options[:uri]
59
+ every = @options[:every] || @@default_options[:every]
60
+ target = @options[:target] || @@default_options[:target]
61
+
62
+ until Thread.current[:dying]
63
+ begin
64
+ sleep every
65
+
66
+ remote_qm = DRb::DRbObject.new_with_uri uri
67
+ queue_name = remote_qm.stale_queue target
68
+ next unless queue_name
69
+
70
+ q = ReliableMsg::Queue.new queue_name, :drb_uri => uri
71
+ q.get { |m|
72
+ begin
73
+ tx = Thread.current[ReliableMsg::Client::THREAD_CURRENT_TX]
74
+ Thread.current[ReliableMsg::Client::THREAD_CURRENT_TX] = nil
75
+
76
+ @logger.info { "message received - <#{m.id}>" }
77
+ raise AgentError, "agent proc failed." unless agent.call(m.dup)
78
+ ensure
79
+ Thread.current[ReliableMsg::Client::THREAD_CURRENT_TX] = tx
80
+ end
81
+ }
82
+ rescue Exception => e
83
+ @logger.warn { "error in fetch-msg/agent-proc: #{e}\n#{e.backtrace.join("\n\t")}" }
84
+ end
85
+ end
86
+ end
87
+
88
+ end
89
+ end
90
+
@@ -0,0 +1,14 @@
1
+
2
+ require "rubygems"
3
+ require "reliable-msg"
4
+
5
+ module ReliableMsg #:nodoc:
6
+ module Agent #:nodoc:
7
+ autoload :Version , "reliable-msg/agent/version"
8
+ autoload :AgentError, "reliable-msg/agent/error"
9
+ autoload :Service , "reliable-msg/agent/service"
10
+ autoload :Workers , "reliable-msg/agent/workers"
11
+ autoload :Agent , "reliable-msg/agent/agent"
12
+ end
13
+ end
14
+
@@ -0,0 +1,36 @@
1
+
2
+ require File.dirname(__FILE__) + "/spec_helper.rb"
3
+
4
+ require "logger"
5
+
6
+ describe ReliableMsg::Agent::Service do
7
+ before do
8
+ l = Logger.new(nil)
9
+ @s = ReliableMsg::Agent::Service.new l
10
+ end
11
+
12
+ it "should be able to #start" do
13
+ @s.start
14
+ end
15
+
16
+ it "should not be alive" do
17
+ @s.alive?.should_not be_true
18
+ end
19
+
20
+ describe "When started" do
21
+ before do
22
+ @s.start
23
+ end
24
+
25
+ it "should be alive" do
26
+ @s.alive?.should be_true
27
+ end
28
+
29
+ end
30
+
31
+ after do
32
+ @s.stop rescue nil
33
+ @s = nil
34
+ end
35
+ end
36
+
@@ -0,0 +1,11 @@
1
+ begin
2
+ require "rspec"
3
+ rescue LoadError
4
+ require "rubygems" unless ENV["NO_RUBYGEMS"]
5
+ gem "rspec"
6
+ require "rsepc"
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + "/../lib")
10
+ require "reliable-msg/agent"
11
+
@@ -0,0 +1,36 @@
1
+
2
+ require File.dirname(__FILE__) + "/spec_helper.rb"
3
+
4
+ require "logger"
5
+
6
+ describe ReliableMsg::Agent::Workers do
7
+ before do
8
+ l = Logger.new(nil)
9
+ @w = ReliableMsg::Agent::Workers.new l
10
+ end
11
+
12
+ it "should be able to #start" do
13
+ @w.start
14
+ end
15
+
16
+ it "should not be alive" do
17
+ @w.alive?.should_not be_true
18
+ end
19
+
20
+ describe "When started" do
21
+ before do
22
+ @w.start
23
+ end
24
+
25
+ it "should be alive" do
26
+ @w.alive?.should be_true
27
+ end
28
+
29
+ end
30
+
31
+ after do
32
+ @w.stop rescue nil
33
+ @w = nil
34
+ end
35
+ end
36
+
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reliable-msg-agent
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - hamajyotan
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-03-18 00:00:00 +09:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: reliable-msg
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ description: This(it) is agent daemon for reliable-msg queue
36
+ email: hamajyotan@gmail.com
37
+ executables:
38
+ - reliable-msg-agent
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README.rdoc
43
+ files:
44
+ - History.txt
45
+ - MIT-LICENSE
46
+ - README.rdoc
47
+ - Rakefile
48
+ - bin/reliable-msg-agent
49
+ - lib/reliable-msg/agent/error.rb
50
+ - lib/reliable-msg/agent/workers.rb
51
+ - lib/reliable-msg/agent/version.rb
52
+ - lib/reliable-msg/agent/service.rb
53
+ - lib/reliable-msg/agent/agent.rb
54
+ - lib/reliable-msg/agent/scripts/script_runner.rb
55
+ - lib/reliable-msg/agent.rb
56
+ - spec/spec_helper.rb
57
+ - spec/service_spec.rb
58
+ - spec/workers_spec.rb
59
+ has_rdoc: true
60
+ homepage: https://github.com/hamajyotan/reliable-msg-agent
61
+ licenses: []
62
+
63
+ post_install_message:
64
+ rdoc_options: []
65
+
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ hash: 3
83
+ segments:
84
+ - 0
85
+ version: "0"
86
+ requirements: []
87
+
88
+ rubyforge_project:
89
+ rubygems_version: 1.3.7
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: This(it) is agent daemon for reliable-msg queue
93
+ test_files: []
94
+