powcloud-insurance 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,77 @@
1
+ require 'amqp'
2
+ require 'mq'
3
+
4
+ require 'powcloud/insurance/logger'
5
+ require 'powcloud/insurance/channel'
6
+
7
+ module Powcloud
8
+ module Insurance
9
+ module Comm
10
+ class AmqpBroadcastChannel < Channel
11
+ include Logger
12
+
13
+ Channel.connection_closing << proc { AMQP.stop { Channel.close_connections } }
14
+
15
+ @@settings = {:amqp_host => '', # AMQP host to connect to
16
+ :queue_prefix => 'insurance'} # prefix to use for queue names
17
+ cattr_reader :settings
18
+
19
+ def initialize(name, logger = nil)
20
+ @name = name
21
+ @exchange_name = "#{name.to_s}.topic"
22
+
23
+ init_child_logger(logger, name) if logger
24
+ init
25
+ end
26
+
27
+ def init
28
+ unless AMQP.conn
29
+ amqp_opts = @@settings[:amqp_opts]
30
+ host = amqp_opts && amqp_opts[:host] ? amqp_opts[:host] : '<default>'
31
+ logger.warn "Connecting to #{host}" if logger
32
+ AMQP.start(amqp_opts)
33
+ end
34
+ logger.warn "Initializing topic exchange: #{@exchange_name}" if logger
35
+ @exchange = MQ.new.topic(@exchange_name) # NOTE: new is required for environments like rails.
36
+ end
37
+
38
+ # opts
39
+ # :round_robin - each message will be consumed by only one receiver, distributed in round robin manner.
40
+ def receive(opts = {}, &blk)
41
+ if opts[:round_robin]
42
+ queue_name = @name # Shared.
43
+ else
44
+ queue_name = "#{@@settings[:queue_prefix]}.#{@name}"
45
+ queue_name += ".#{rand(1000000)}"
46
+ end
47
+
48
+ logger.warn "Creating queue: #{queue_name}" if logger
49
+ queue = MQ.new.queue(queue_name, :auto_delete => true, :exclusive => !opts[:round_robin])
50
+
51
+ logger.info "Binding queue to exchange: #{@exchange_name}" if logger
52
+ queue.bind(@exchange_name, :key => opts[:key])
53
+
54
+ if blk
55
+ if blk.arity == 2
56
+ queue.subscribe do |header, msg|
57
+ yield msg, header # Reverse order.
58
+ end
59
+ elsif blk.arity == 1
60
+ queue.subscribe do |header, msg|
61
+ yield msg
62
+ end
63
+ else
64
+ raise ArgumentError, "Wrong number of arguments for receive block"
65
+ end
66
+ end
67
+ end
68
+
69
+ # Message - string to publish
70
+ # Opts - any amqp Exchange.publich() options
71
+ def publish(message, opts = {})
72
+ @exchange.publish message.to_s, opts
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,50 @@
1
+ require 'sinatra/base'
2
+ require 'sinatra/async'
3
+
4
+ module Powcloud
5
+ module Insurance
6
+ module HttpService
7
+ # Establish base case for http services, useful for later patching which doesn't touch Sinatra::Base.
8
+ class HttpServiceBase < Sinatra::Base
9
+ def self.agent
10
+ self.send :class_variable_get, :@@agent
11
+ end
12
+
13
+ def agent
14
+ self.class.agent
15
+ end
16
+ end
17
+
18
+ def self.included(base)
19
+ base.extend(ClassMethods)
20
+ end
21
+
22
+ module ClassMethods
23
+ def http_service(opts = {}, &blk)
24
+ self.send :class_variable_set, :@@http_service_block, blk
25
+ end
26
+ end
27
+
28
+
29
+ # Instance method!
30
+ # Creates unique HttpService class per agent instance.
31
+ def create_http_service
32
+ agent_instance = self
33
+
34
+ block = self.class.send(:class_variable_get, :@@http_service_block)
35
+ http_service_class = Class.new(HttpServiceBase) do |clazz|
36
+ # NOTE: @@agent will create Class::@@agent variable, instad of http_service_class1::@@agent
37
+ class_variable_set(:@@agent, agent_instance)
38
+ end
39
+
40
+ # NOTE: Sinatra::Base.inherited callback is not called yet during do |clazz| block above.
41
+ # This is why the following is going here, not in that block.
42
+ http_service_class.register Sinatra::Async
43
+
44
+ http_service_class.class_eval(&block)
45
+ http_service_class
46
+ end
47
+ end
48
+ end
49
+ end
50
+
@@ -0,0 +1,40 @@
1
+ require 'log4r'
2
+
3
+ Log4r::Logger.root # Called to init log4r and make Log4r::<LEVEL> consts available.
4
+
5
+ module Powcloud
6
+ module Insurance
7
+ module Logger
8
+ attr_accessor :logger
9
+ class << self
10
+ def outputters=(ar)
11
+ @@outputters = ar
12
+ end
13
+
14
+ def outputters
15
+ @@outputters ||= []
16
+ end
17
+ end
18
+
19
+ # Initializes logger instance.
20
+ def init_logger(level = Log4r::WARN, name = File.basename($0))
21
+ @logger = Log4r::Logger.new name
22
+ @logger.level = level
23
+
24
+ @logger.outputters = Powcloud::Insurance::Logger.outputters
25
+ end
26
+
27
+ def init_child_logger(logger, name)
28
+ @logger = Log4r::Logger.new "#{logger.fullname}::#{name}"
29
+ @logger.level = logger.level
30
+ end
31
+
32
+ def log_exception(ex)
33
+ if logger
34
+ logger.error ex.to_s + (ex.backtrace.length > 0 ? ' ' + ex.backtrace.first : '')
35
+ logger.error ex.backtrace.join("\n")
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,100 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{powcloud-insurance}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Darren Rush", "Max M. Petrov"]
12
+ s.date = %q{2010-05-21}
13
+ s.default_executable = %q{insurance}
14
+ s.description = %q{powcloud-insurance}
15
+ s.email = %q{maxmpz@gmail.com}
16
+ s.executables = ["insurance"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.rdoc"
20
+ ]
21
+ s.files = [
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "bin/insurance",
27
+ "examples/cluster-agent/public/amxy.swf",
28
+ "examples/cluster-agent/public/css/cluster-agent.css",
29
+ "examples/cluster-agent/public/fonts/arial.swf",
30
+ "examples/cluster-agent/public/fonts/garamond.swf",
31
+ "examples/cluster-agent/public/fonts/georgia.swf",
32
+ "examples/cluster-agent/public/fonts/tahoma.fla",
33
+ "examples/cluster-agent/public/fonts/tahoma.swf",
34
+ "examples/cluster-agent/public/fonts/times new roman.swf",
35
+ "examples/cluster-agent/public/js/cluster-agent.js",
36
+ "examples/cluster-agent/public/js/swfobject.js",
37
+ "examples/cluster-agent/view/index.erb",
38
+ "examples/cluster-agent/view/layout.erb",
39
+ "examples/cluster-agent/view/settings.erb",
40
+ "examples/cluster_agent.rb",
41
+ "examples/config.rb",
42
+ "lib/powcloud/insurance/agent.rb",
43
+ "lib/powcloud/insurance/agent_communications.rb",
44
+ "lib/powcloud/insurance/agent_container.rb",
45
+ "lib/powcloud/insurance/agent_container_http_service.rb",
46
+ "lib/powcloud/insurance/agent_scheduler.rb",
47
+ "lib/powcloud/insurance/channel.rb",
48
+ "lib/powcloud/insurance/comm/amqp_broadcast_channel.rb",
49
+ "lib/powcloud/insurance/http_service.rb",
50
+ "lib/powcloud/insurance/logger.rb",
51
+ "powcloud-insurance.gemspec"
52
+ ]
53
+ s.homepage = %q{http://github.com/powcloud/insurance}
54
+ s.rdoc_options = ["--charset=UTF-8"]
55
+ s.require_paths = ["lib"]
56
+ s.rubygems_version = %q{1.3.5}
57
+ s.summary = %q{powcloud-insurance}
58
+ s.test_files = [
59
+ "examples/cluster_agent.rb",
60
+ "examples/config.rb"
61
+ ]
62
+
63
+ if s.respond_to? :specification_version then
64
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
65
+ s.specification_version = 3
66
+
67
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
68
+ s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
69
+ s.add_runtime_dependency(%q<activesupport>, [">= 2.3.4"])
70
+ s.add_runtime_dependency(%q<eventmachine>, [">= 0.12.10"])
71
+ s.add_runtime_dependency(%q<log4r>, [">= 1.1.2"])
72
+ s.add_runtime_dependency(%q<sinatra>, [">= 0.9.4"])
73
+ s.add_runtime_dependency(%q<async-rack>, [">= 0.4.0.1"])
74
+ s.add_runtime_dependency(%q<async_sinatra>, [">= 0.1.5"])
75
+ s.add_runtime_dependency(%q<thin>, [">= 1.2.5"])
76
+ s.add_runtime_dependency(%q<amqp>, [">= 0.6.6"])
77
+ else
78
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
79
+ s.add_dependency(%q<activesupport>, [">= 2.3.4"])
80
+ s.add_dependency(%q<eventmachine>, [">= 0.12.10"])
81
+ s.add_dependency(%q<log4r>, [">= 1.1.2"])
82
+ s.add_dependency(%q<sinatra>, [">= 0.9.4"])
83
+ s.add_dependency(%q<async-rack>, [">= 0.4.0.1"])
84
+ s.add_dependency(%q<async_sinatra>, [">= 0.1.5"])
85
+ s.add_dependency(%q<thin>, [">= 1.2.5"])
86
+ s.add_dependency(%q<amqp>, [">= 0.6.6"])
87
+ end
88
+ else
89
+ s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
90
+ s.add_dependency(%q<activesupport>, [">= 2.3.4"])
91
+ s.add_dependency(%q<eventmachine>, [">= 0.12.10"])
92
+ s.add_dependency(%q<log4r>, [">= 1.1.2"])
93
+ s.add_dependency(%q<sinatra>, [">= 0.9.4"])
94
+ s.add_dependency(%q<async-rack>, [">= 0.4.0.1"])
95
+ s.add_dependency(%q<async_sinatra>, [">= 0.1.5"])
96
+ s.add_dependency(%q<thin>, [">= 1.2.5"])
97
+ s.add_dependency(%q<amqp>, [">= 0.6.6"])
98
+ end
99
+ end
100
+
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: powcloud-insurance
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Darren Rush
8
+ - Max M. Petrov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2010-05-21 00:00:00 +04:00
14
+ default_executable: insurance
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: thoughtbot-shoulda
18
+ type: :development
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ version:
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ type: :runtime
29
+ version_requirement:
30
+ version_requirements: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 2.3.4
35
+ version:
36
+ - !ruby/object:Gem::Dependency
37
+ name: eventmachine
38
+ type: :runtime
39
+ version_requirement:
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 0.12.10
45
+ version:
46
+ - !ruby/object:Gem::Dependency
47
+ name: log4r
48
+ type: :runtime
49
+ version_requirement:
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.2
55
+ version:
56
+ - !ruby/object:Gem::Dependency
57
+ name: sinatra
58
+ type: :runtime
59
+ version_requirement:
60
+ version_requirements: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 0.9.4
65
+ version:
66
+ - !ruby/object:Gem::Dependency
67
+ name: async-rack
68
+ type: :runtime
69
+ version_requirement:
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 0.4.0.1
75
+ version:
76
+ - !ruby/object:Gem::Dependency
77
+ name: async_sinatra
78
+ type: :runtime
79
+ version_requirement:
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 0.1.5
85
+ version:
86
+ - !ruby/object:Gem::Dependency
87
+ name: thin
88
+ type: :runtime
89
+ version_requirement:
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.2.5
95
+ version:
96
+ - !ruby/object:Gem::Dependency
97
+ name: amqp
98
+ type: :runtime
99
+ version_requirement:
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 0.6.6
105
+ version:
106
+ description: powcloud-insurance
107
+ email: maxmpz@gmail.com
108
+ executables:
109
+ - insurance
110
+ extensions: []
111
+
112
+ extra_rdoc_files:
113
+ - LICENSE
114
+ - README.rdoc
115
+ files:
116
+ - LICENSE
117
+ - README.rdoc
118
+ - Rakefile
119
+ - VERSION
120
+ - bin/insurance
121
+ - examples/cluster-agent/public/amxy.swf
122
+ - examples/cluster-agent/public/css/cluster-agent.css
123
+ - examples/cluster-agent/public/fonts/arial.swf
124
+ - examples/cluster-agent/public/fonts/garamond.swf
125
+ - examples/cluster-agent/public/fonts/georgia.swf
126
+ - examples/cluster-agent/public/fonts/tahoma.fla
127
+ - examples/cluster-agent/public/fonts/tahoma.swf
128
+ - examples/cluster-agent/public/fonts/times new roman.swf
129
+ - examples/cluster-agent/public/js/cluster-agent.js
130
+ - examples/cluster-agent/public/js/swfobject.js
131
+ - examples/cluster-agent/view/index.erb
132
+ - examples/cluster-agent/view/layout.erb
133
+ - examples/cluster-agent/view/settings.erb
134
+ - examples/cluster_agent.rb
135
+ - examples/config.rb
136
+ - lib/powcloud/insurance/agent.rb
137
+ - lib/powcloud/insurance/agent_communications.rb
138
+ - lib/powcloud/insurance/agent_container.rb
139
+ - lib/powcloud/insurance/agent_container_http_service.rb
140
+ - lib/powcloud/insurance/agent_scheduler.rb
141
+ - lib/powcloud/insurance/channel.rb
142
+ - lib/powcloud/insurance/comm/amqp_broadcast_channel.rb
143
+ - lib/powcloud/insurance/http_service.rb
144
+ - lib/powcloud/insurance/logger.rb
145
+ - powcloud-insurance.gemspec
146
+ has_rdoc: true
147
+ homepage: http://github.com/powcloud/insurance
148
+ licenses: []
149
+
150
+ post_install_message:
151
+ rdoc_options:
152
+ - --charset=UTF-8
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: "0"
160
+ version:
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: "0"
166
+ version:
167
+ requirements: []
168
+
169
+ rubyforge_project:
170
+ rubygems_version: 1.3.5
171
+ signing_key:
172
+ specification_version: 3
173
+ summary: powcloud-insurance
174
+ test_files:
175
+ - examples/cluster_agent.rb
176
+ - examples/config.rb