isimud 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -0
- data/.yardoc/checksums +15 -0
- data/.yardoc/object_types +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/.yardoc/proxy_types +0 -0
- data/Gemfile +23 -0
- data/Gemfile.lock +123 -0
- data/README.md +218 -0
- data/Rakefile +2 -0
- data/config.ru +7 -0
- data/config/tddium.yml +11 -0
- data/doc/Isimud.html +1696 -0
- data/doc/Isimud/BunnyClient.html +1004 -0
- data/doc/Isimud/Client.html +812 -0
- data/doc/Isimud/Event.html +1500 -0
- data/doc/Isimud/EventListener.html +1217 -0
- data/doc/Isimud/EventObserver.html +367 -0
- data/doc/Isimud/EventObserver/ClassMethods.html +292 -0
- data/doc/Isimud/Generators.html +117 -0
- data/doc/Isimud/Generators/ConfigGenerator.html +192 -0
- data/doc/Isimud/Generators/InitializerGenerator.html +192 -0
- data/doc/Isimud/Logging.html +230 -0
- data/doc/Isimud/ModelWatcher.html +312 -0
- data/doc/Isimud/ModelWatcher/ClassMethods.html +511 -0
- data/doc/Isimud/Railtie.html +123 -0
- data/doc/Isimud/TestClient.html +1003 -0
- data/doc/Isimud/TestClient/Queue.html +556 -0
- data/doc/_index.html +290 -0
- data/doc/class_list.html +58 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +57 -0
- data/doc/css/style.css +339 -0
- data/doc/file.README.html +338 -0
- data/doc/file_list.html +60 -0
- data/doc/frames.html +26 -0
- data/doc/index.html +338 -0
- data/doc/js/app.js +219 -0
- data/doc/js/full_list.js +181 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +711 -0
- data/doc/top-level-namespace.html +112 -0
- data/isimud.gemspec +25 -0
- data/lib/isimud.rb +91 -0
- data/lib/isimud/bunny_client.rb +95 -0
- data/lib/isimud/client.rb +48 -0
- data/lib/isimud/event.rb +112 -0
- data/lib/isimud/event_listener.rb +200 -0
- data/lib/isimud/event_observer.rb +81 -0
- data/lib/isimud/logging.rb +11 -0
- data/lib/isimud/model_watcher.rb +144 -0
- data/lib/isimud/railtie.rb +9 -0
- data/lib/isimud/tasks.rb +20 -0
- data/lib/isimud/test_client.rb +89 -0
- data/lib/isimud/version.rb +3 -0
- data/lib/rails/generators/isimud/config_generator.rb +12 -0
- data/lib/rails/generators/isimud/initializer_generator.rb +12 -0
- data/lib/rails/generators/isimud/templates/initializer.rb +17 -0
- data/lib/rails/generators/isimud/templates/isimud.yml +20 -0
- data/spec/internal/app/models/admin.rb +2 -0
- data/spec/internal/app/models/company.rb +34 -0
- data/spec/internal/app/models/user.rb +27 -0
- data/spec/internal/config/database.yml +3 -0
- data/spec/internal/config/routes.rb +3 -0
- data/spec/internal/db/schema.rb +22 -0
- data/spec/internal/log/.gitignore +1 -0
- data/spec/internal/public/favicon.ico +0 -0
- data/spec/isimud/bunny_client_spec.rb +125 -0
- data/spec/isimud/event_listener_spec.rb +86 -0
- data/spec/isimud/event_observer_spec.rb +32 -0
- data/spec/isimud/event_spec.rb +74 -0
- data/spec/isimud/model_watcher_spec.rb +189 -0
- data/spec/isimud/test_client_spec.rb +28 -0
- data/spec/isimud_spec.rb +49 -0
- data/spec/spec_helper.rb +55 -0
- metadata +195 -0
@@ -0,0 +1,112 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
4
|
+
<head>
|
5
|
+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.8.7.6
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
|
16
|
+
|
17
|
+
<script type="text/javascript" charset="utf-8">
|
18
|
+
hasFrames = window.top.frames.main ? true : false;
|
19
|
+
relpath = '';
|
20
|
+
framesUrl = "frames.html#!top-level-namespace.html";
|
21
|
+
</script>
|
22
|
+
|
23
|
+
|
24
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
25
|
+
|
26
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
27
|
+
|
28
|
+
|
29
|
+
</head>
|
30
|
+
<body>
|
31
|
+
<div id="header">
|
32
|
+
<div id="menu">
|
33
|
+
|
34
|
+
<a href="_index.html">Index</a> »
|
35
|
+
|
36
|
+
|
37
|
+
<span class="title">Top Level Namespace</span>
|
38
|
+
|
39
|
+
|
40
|
+
<div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
|
41
|
+
</div>
|
42
|
+
|
43
|
+
<div id="search">
|
44
|
+
|
45
|
+
<a class="full_list_link" id="class_list_link"
|
46
|
+
href="class_list.html">
|
47
|
+
Class List
|
48
|
+
</a>
|
49
|
+
|
50
|
+
<a class="full_list_link" id="method_list_link"
|
51
|
+
href="method_list.html">
|
52
|
+
Method List
|
53
|
+
</a>
|
54
|
+
|
55
|
+
<a class="full_list_link" id="file_list_link"
|
56
|
+
href="file_list.html">
|
57
|
+
File List
|
58
|
+
</a>
|
59
|
+
|
60
|
+
</div>
|
61
|
+
<div class="clear"></div>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<iframe id="search_frame"></iframe>
|
65
|
+
|
66
|
+
<div id="content"><h1>Top Level Namespace
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
</h1>
|
71
|
+
|
72
|
+
<dl class="box">
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
</dl>
|
82
|
+
<div class="clear"></div>
|
83
|
+
|
84
|
+
<h2>Defined Under Namespace</h2>
|
85
|
+
<p class="children">
|
86
|
+
|
87
|
+
|
88
|
+
<strong class="modules">Modules:</strong> <span class='object_link'><a href="Isimud.html" title="Isimud (module)">Isimud</a></span>
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
</p>
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
</div>
|
104
|
+
|
105
|
+
<div id="footer">
|
106
|
+
Generated on Fri Apr 3 09:28:08 2015 by
|
107
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
108
|
+
0.8.7.6 (ruby-2.2.1).
|
109
|
+
</div>
|
110
|
+
|
111
|
+
</body>
|
112
|
+
</html>
|
data/isimud.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'isimud/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'isimud'
|
8
|
+
spec.version = Isimud::VERSION
|
9
|
+
spec.authors = ['George Feil', 'Brian Jenkins']
|
10
|
+
spec.email = %w{george.feil@keas.com bonkydog@bonkydog.com}
|
11
|
+
spec.summary = %q{AMQP Messaging for Events and ActiveRecord changes}
|
12
|
+
spec.description = %q{}
|
13
|
+
spec.homepage = ''
|
14
|
+
spec.license = "Copyright (C) 2014 Keas -- All rights reserved"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_dependency 'activerecord', '>= 3.2.17'
|
22
|
+
spec.add_dependency 'activesupport', '>= 3.2.17'
|
23
|
+
spec.add_dependency 'bunny', '>= 1.6.0'
|
24
|
+
spec.add_dependency 'chronic_duration', '>= 0.10.6'
|
25
|
+
end
|
data/lib/isimud.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
3
|
+
|
4
|
+
module Isimud
|
5
|
+
include ::ActiveSupport::Configurable
|
6
|
+
# @!attribute [r] client_type
|
7
|
+
# @return [Enumerable<'bunny', 'test'>] Type of client to use
|
8
|
+
# @!attribute [r] client_options
|
9
|
+
# @return [Hash] client specific options
|
10
|
+
# @!attribute [r] default_client
|
11
|
+
# @return [Isimud::Client] default client
|
12
|
+
# @!attribute [r] events_exchange
|
13
|
+
# @return [String] AMQP exchange used for publishing Event instances
|
14
|
+
# @!attribute [r] enable_model_watcher
|
15
|
+
# @return [Boolean] when set, send Isimud::ModelWatcher messages
|
16
|
+
# @!attribute [r] listener_error_limit
|
17
|
+
# @return [Integer] maximum number of exceptions allowed per hour before listener shuts down (100)
|
18
|
+
# @!attribute [r] logger
|
19
|
+
# @return [Logger] logger for tracing messages (Rails.logger)
|
20
|
+
# @!attribute [r] log_level
|
21
|
+
# @return [Symbol] log level (:debug)
|
22
|
+
# @!attribute [r] model_watcher_exchange
|
23
|
+
# @return [String] AMQP exchange used for publishing ModelWatcher messages
|
24
|
+
# @!attribute [r] model_watcher_schema
|
25
|
+
# @return [String] schema name (Rails.configuration.database_configuration[Rails.env]['database'])
|
26
|
+
# @!attribute [r] prefetch_count
|
27
|
+
# @return [Integer] number of messages to fetch -- only applies to BunnyClient
|
28
|
+
# @!attribute [r] retry_failures
|
29
|
+
# @return [Boolean] when set, if an exception occurs during message processing, requeue it
|
30
|
+
# @!attribute [r] server
|
31
|
+
# @return [<String, Hash>] server connection attributes
|
32
|
+
config_accessor :client_type do
|
33
|
+
:bunny
|
34
|
+
end
|
35
|
+
config_accessor :client_options, :default_client, :enable_model_watcher, :model_watcher_schema, :retry_failures
|
36
|
+
config_accessor :listener_error_limit do
|
37
|
+
100
|
38
|
+
end
|
39
|
+
config_accessor :logger do
|
40
|
+
Rails.logger
|
41
|
+
end
|
42
|
+
config_accessor :log_level do
|
43
|
+
:debug
|
44
|
+
end
|
45
|
+
config_accessor :events_exchange do
|
46
|
+
'events'
|
47
|
+
end
|
48
|
+
config_accessor :model_watcher_exchange do
|
49
|
+
'models'
|
50
|
+
end
|
51
|
+
config_accessor :prefetch_count do
|
52
|
+
100
|
53
|
+
end
|
54
|
+
config_accessor :server do
|
55
|
+
ENV['AMQP_URL']
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.client_class
|
59
|
+
type = "#{client_type}_client".classify
|
60
|
+
"Isimud::#{type}".constantize
|
61
|
+
end
|
62
|
+
|
63
|
+
# Fetch or initialize the messaging client for this process.
|
64
|
+
# @return [Isimud::Client] messaging client
|
65
|
+
def self.client
|
66
|
+
self.default_client ||= client_class.new(server, client_options || {})
|
67
|
+
end
|
68
|
+
|
69
|
+
# Connect to the messaging server
|
70
|
+
def self.connect
|
71
|
+
client.connect
|
72
|
+
end
|
73
|
+
|
74
|
+
# Return status of model watching mode
|
75
|
+
def self.model_watcher_enabled?
|
76
|
+
enable_model_watcher.nil? || enable_model_watcher
|
77
|
+
end
|
78
|
+
|
79
|
+
# Reconnect the messaging client
|
80
|
+
def self.reconnect
|
81
|
+
client.reconnect
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
require 'isimud/logging'
|
86
|
+
require 'isimud/client'
|
87
|
+
require 'isimud/event'
|
88
|
+
require 'isimud/event_listener'
|
89
|
+
require 'isimud/event_observer'
|
90
|
+
require 'isimud/model_watcher'
|
91
|
+
require 'isimud/version'
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'bunny'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
module Isimud
|
5
|
+
class BunnyClient < Isimud::Client
|
6
|
+
DEFAULT_URL = 'amqp://guest:guest@localhost'
|
7
|
+
|
8
|
+
attr_reader :url
|
9
|
+
|
10
|
+
def initialize(_url = nil, _bunny_options = {})
|
11
|
+
log "Isimud::BunnyClient.initialize: options = #{_bunny_options.inspect}"
|
12
|
+
@url = _url || DEFAULT_URL
|
13
|
+
@bunny_options = _bunny_options
|
14
|
+
end
|
15
|
+
|
16
|
+
def bind(queue_name, exchange_name, *routing_keys, &block)
|
17
|
+
create_queue(queue_name, exchange_name,
|
18
|
+
queue_options: {durable: true},
|
19
|
+
routing_keys: routing_keys,
|
20
|
+
subscribe_options: {manual_ack: true}, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_queue(queue_name, exchange_name, options = {}, &block)
|
24
|
+
queue_options = options[:queue_options] || {}
|
25
|
+
routing_keys = options[:routing_keys] || []
|
26
|
+
subscribe_options = options[:subscribe_options] || {}
|
27
|
+
log "Isimud: create_queue #{queue_name}: queue_options=#{queue_options.inspect} routing_keys=#{routing_keys.join(',')} subscribe_options=#{subscribe_options.inspect}"
|
28
|
+
current_channel = channel
|
29
|
+
queue = current_channel.queue(queue_name, queue_options)
|
30
|
+
routing_keys.each { |key| queue.bind(exchange_name, routing_key: key, nowait: false) }
|
31
|
+
queue.subscribe(subscribe_options) do |delivery_info, properties, payload|
|
32
|
+
begin
|
33
|
+
log "Isimud: queue #{queue_name} received #{delivery_info.delivery_tag} routing_key: #{delivery_info.routing_key}"
|
34
|
+
Thread.current['isimud_queue_name'] = queue_name
|
35
|
+
Thread.current['isimud_delivery_info'] = delivery_info
|
36
|
+
Thread.current['isimud_properties'] = properties
|
37
|
+
block.call(payload)
|
38
|
+
log "Isimud: queue #{queue_name} finished with #{delivery_info.delivery_tag}, acknowledging"
|
39
|
+
current_channel.ack(delivery_info.delivery_tag)
|
40
|
+
rescue => e
|
41
|
+
log("Isimud: queue #{queue_name} error processing #{delivery_info.delivery_tag} payload #{payload.inspect}: #{e.class.name} #{e.message}\n #{e.backtrace.join("\n ")}", :warn)
|
42
|
+
current_channel.reject(delivery_info.delivery_tag, Isimud.retry_failures)
|
43
|
+
exception_handler.try(:call, e)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
queue
|
47
|
+
end
|
48
|
+
|
49
|
+
def delete_queue(queue_name)
|
50
|
+
channel.queue(queue_name).delete
|
51
|
+
end
|
52
|
+
|
53
|
+
def connection
|
54
|
+
@connection ||= ::Bunny.new(url, @bunny_options).tap(&:start)
|
55
|
+
end
|
56
|
+
|
57
|
+
alias connect connection
|
58
|
+
|
59
|
+
CHANNEL_KEY = :'isimud.bunny_client.channel'
|
60
|
+
|
61
|
+
def channel
|
62
|
+
if (channel = Thread.current[CHANNEL_KEY]).try(:open?)
|
63
|
+
channel
|
64
|
+
else
|
65
|
+
new_channel = connection.channel
|
66
|
+
new_channel.confirm_select
|
67
|
+
new_channel.prefetch(Isimud.prefetch_count) if Isimud.prefetch_count
|
68
|
+
Thread.current[CHANNEL_KEY] = new_channel
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def reset
|
73
|
+
connection.close_all_channels
|
74
|
+
end
|
75
|
+
|
76
|
+
def connected?
|
77
|
+
@connection && @connection.open?
|
78
|
+
end
|
79
|
+
|
80
|
+
def close
|
81
|
+
connection.close
|
82
|
+
ensure
|
83
|
+
@connection = nil
|
84
|
+
end
|
85
|
+
|
86
|
+
def publish(exchange, routing_key, payload)
|
87
|
+
channel.topic(exchange, durable: true).publish(payload, routing_key: routing_key, persistent: true)
|
88
|
+
end
|
89
|
+
|
90
|
+
def reconnect
|
91
|
+
close
|
92
|
+
connect
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Isimud
|
2
|
+
# @abstract Messaging queue service client
|
3
|
+
class Client
|
4
|
+
include Isimud::Logging
|
5
|
+
|
6
|
+
attr_reader :exception_handler
|
7
|
+
|
8
|
+
def initialize(server = nil, options = nil)
|
9
|
+
end
|
10
|
+
|
11
|
+
def bind(queue_name, exchange_name, *keys, &method)
|
12
|
+
end
|
13
|
+
|
14
|
+
def channel
|
15
|
+
end
|
16
|
+
|
17
|
+
def close
|
18
|
+
end
|
19
|
+
|
20
|
+
def connect
|
21
|
+
end
|
22
|
+
|
23
|
+
def connected?
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_queue(queue_name, exchange_name, options = {}, &method)
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete_queue(queue_name)
|
30
|
+
end
|
31
|
+
|
32
|
+
def on_exception(&block)
|
33
|
+
@exception_handler = block
|
34
|
+
end
|
35
|
+
|
36
|
+
def publish(exchange, routing_key, payload)
|
37
|
+
end
|
38
|
+
|
39
|
+
def reconnect
|
40
|
+
end
|
41
|
+
|
42
|
+
def reset
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
require 'isimud/bunny_client'
|
48
|
+
require 'isimud/test_client'
|
data/lib/isimud/event.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module Isimud
|
4
|
+
class Event
|
5
|
+
include Isimud::Logging
|
6
|
+
attr_accessor :type, :action, :user_id, :occurred_at, :eventful_type, :eventful_id, :attributes, :parameters
|
7
|
+
attr_writer :exchange
|
8
|
+
|
9
|
+
DEFAULT_TYPE = :model
|
10
|
+
|
11
|
+
# Initialize a new Event
|
12
|
+
# @overload new(user, eventful, attributes)
|
13
|
+
# @param[#id] user user associated by the event
|
14
|
+
# @param[ActiveRecord::Base] eventful object associated with event
|
15
|
+
# @param[Hash] parameters optional additional attributes
|
16
|
+
# @overload new(attributes)
|
17
|
+
# @param[Hash] attributes event attributes
|
18
|
+
# @option attributes [Integer] :user_id ID of User associated with event
|
19
|
+
# @option attributes [String] :eventful_type class of object associated with event
|
20
|
+
# @option attributes [Integer] :eventful_id id of object associated with event
|
21
|
+
# @option attributes [String] :exchange (Isimud.events_exchange) exchange for publishing event
|
22
|
+
# @option attributes [ActiveRecord::Base] :eventful object associated with event. This sets :eventful_type and :eventful_id.
|
23
|
+
# @option attributes [String, Symbol] :type (:model) event type
|
24
|
+
# @option attributes [String] :action event action
|
25
|
+
# @option attributes [Time] :occurred_at (Time.now) date and time event occurred
|
26
|
+
# @option attributes [Hash] :attributes event attributes
|
27
|
+
# @option attributes [Hash] :parameters additional parameters (deprecated)
|
28
|
+
def initialize(*args)
|
29
|
+
options = args.extract_options!.with_indifferent_access
|
30
|
+
|
31
|
+
self.type = options.delete(:type).try(:to_sym) || DEFAULT_TYPE
|
32
|
+
self.exchange = options.delete(:exchange)
|
33
|
+
self.action = options.delete(:action).try(:to_sym)
|
34
|
+
self.user_id = options.delete(:user_id)
|
35
|
+
self.occurred_at = if (occurred = options.delete(:occurred_at))
|
36
|
+
occurred.kind_of?(String) ? Time.parse(occurred) : occurred
|
37
|
+
else
|
38
|
+
Time.now.utc
|
39
|
+
end
|
40
|
+
|
41
|
+
eventful_object = options.delete(:eventful)
|
42
|
+
|
43
|
+
if args.length > 0
|
44
|
+
self.parameters = options
|
45
|
+
if (user = args.shift)
|
46
|
+
self.user_id = user.id
|
47
|
+
end
|
48
|
+
eventful_object ||= args.shift
|
49
|
+
end
|
50
|
+
|
51
|
+
if eventful_object
|
52
|
+
self.eventful_type = eventful_object.class.base_class.name
|
53
|
+
self.eventful_id = eventful_object.id
|
54
|
+
else
|
55
|
+
self.eventful_type = options.delete(:eventful_type)
|
56
|
+
self.eventful_id = options.delete(:eventful_id)
|
57
|
+
end
|
58
|
+
self.attributes = options.delete(:attributes)
|
59
|
+
self.parameters = options.delete(:parameters) || options
|
60
|
+
end
|
61
|
+
|
62
|
+
def exchange
|
63
|
+
@exchange || Isimud.events_exchange
|
64
|
+
end
|
65
|
+
|
66
|
+
def routing_key
|
67
|
+
[type.to_s, eventful_type, eventful_id, action].compact.join('.')
|
68
|
+
end
|
69
|
+
|
70
|
+
# Return hash of data to be serialized to JSON
|
71
|
+
# @option options [Boolean] :omit_parameters when set, do not include attributes or parameters in data
|
72
|
+
# @return [Hash] data to serialize
|
73
|
+
def as_json(options = {})
|
74
|
+
session_id = parameters.delete(:session_id) || Thread.current[:keas_session_id]
|
75
|
+
|
76
|
+
data = {type: type,
|
77
|
+
action: action,
|
78
|
+
user_id: user_id,
|
79
|
+
occurred_at: occurred_at,
|
80
|
+
eventful_type: eventful_type,
|
81
|
+
eventful_id: eventful_id,
|
82
|
+
session_id: session_id}
|
83
|
+
unless options[:omit_parameters]
|
84
|
+
data[:parameters] = parameters
|
85
|
+
data[:attributes] = attributes
|
86
|
+
end
|
87
|
+
data
|
88
|
+
end
|
89
|
+
|
90
|
+
def serialize
|
91
|
+
self.to_json
|
92
|
+
end
|
93
|
+
|
94
|
+
class << self
|
95
|
+
def parse(data)
|
96
|
+
Event.new(JSON.parse(data))
|
97
|
+
end
|
98
|
+
|
99
|
+
def publish(*args)
|
100
|
+
Event.new(*args).publish
|
101
|
+
end
|
102
|
+
|
103
|
+
alias_method :dispatch, :publish
|
104
|
+
end
|
105
|
+
|
106
|
+
def publish
|
107
|
+
data = self.serialize
|
108
|
+
log "Event#publish: #{self.inspect}"
|
109
|
+
Isimud.client.publish(exchange, routing_key, data)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|