Class: RServiceBus2::SagaManager

Inherits:
Object
  • Object
show all
Defined in:
lib/rservicebus2/saga/manager.rb

Overview

Saga Manager

Instance Method Summary collapse

Constructor Details

#initialize(host, resource_manager, saga_storage) ⇒ SagaManager

Returns a new instance of SagaManager.



4
5
6
7
8
9
10
11
12
13
# File 'lib/rservicebus2/saga/manager.rb', line 4

def initialize(host, resource_manager, saga_storage)
  @handler = {}
  @start_with = {}
  @saga = {}
  @host = host

  @resource_manager = resource_manager
  @resource_list_by_saga_name = {}
  @saga_storage = saga_storage
end

Instance Method Details

#get_methods_by_prefix(saga, prefix) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/rservicebus2/saga/manager.rb', line 15

def get_methods_by_prefix(saga, prefix)
  list = []
  d_prefix = prefix.downcase
  saga.instance_methods.each do |name|
    d_name = name.downcase
    list.push d_name.to_s.sub(d_prefix, '') if d_name.to_s.slice(0, d_prefix.length) == d_prefix
  end

  list.uniq # This takes care of a very rare uppercase / lowercase issue
end

#get_start_with_method_names(saga) ⇒ Object



26
27
28
# File 'lib/rservicebus2/saga/manager.rb', line 26

def get_start_with_method_names(saga)
  get_methods_by_prefix(saga, 'startwith_')
end

#handle(rmsg) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/rservicebus2/saga/manager.rb', line 84

def handle(rmsg)
  @resources_used = {}
  handled = false
  msg = rmsg.msg
  msg_class_name = msg.class.name.downcase

  RServiceBus2.log "SagaManager, started processing, #{msg_class_name}", true
  unless @start_with[msg_class_name].nil?
    @start_with[msg_class_name].each do |saga|
      data = SagaData.new(saga)
      @saga_storage.set(data)

      method_name = "startwith_#{msg_class_name}"
      process_msg(saga, data, method_name, msg)

      handled = true
    end
  end
  return handled if handled == true

  return false if rmsg.correlation_id.nil?
  data = @saga_storage.get(rmsg.correlation_id)
  return handled if data.nil?
  method_name = "handle_#{msg_class_name}"
  saga = @saga[data.saga_class_name]
  process_msg(saga, data, method_name, msg)

  true
end

#interrogate_saga_for_app_resources(saga) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/rservicebus2/saga/manager.rb', line 41

def interrogate_saga_for_app_resources(saga)
  RServiceBus2.rlog "Checking app resources for: #{saga.class.name}"
  RServiceBus2.rlog "If your attribute is not getting set, check that it
    is in the 'attr_accessor' list"

  @resource_list_by_saga_name[saga.class.name] = []
  @resource_manager.get_all.each do |k, v|
    if saga.class.method_defined?(k)
      @resource_list_by_saga_name[saga.class.name] << k
      RServiceBus2.log "Resource attribute, #{k}, found for: " +
        saga.class.name
    end
  end

  self
end

#prep_saga(saga) ⇒ Object



75
76
77
78
79
80
81
82
# File 'lib/rservicebus2/saga/manager.rb', line 75

def prep_saga(saga)
  return if @resource_list_by_saga_name[saga.class.name].nil?

  @resource_list_by_saga_name[saga.class.name].each do |k, v|
    saga.instance_variable_set("@#{k}", @resource_manager.get(k).get_resource)
    RServiceBus2.rlog "App resource attribute, #{k}, set for: " + saga.class.name
  end
end

#process_msg(saga, data, method_name, msg) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
# File 'lib/rservicebus2/saga/manager.rb', line 114

def process_msg(saga, data, method_name, msg)
  @host.saga_data = data
  saga.data = data
  prep_saga(saga)

  saga.send(method_name, msg) if saga.class.method_defined?(method_name)

  @saga_storage.delete(data.correlation_id) if data.finished == true

  @host.saga_data = nil
end

#register_saga(saga) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/rservicebus2/saga/manager.rb', line 58

def register_saga(saga)
  s = saga.new
  set_bus_attribute_if_requested(s)

  get_start_with_method_names(saga).each do |msg_name|
    @start_with[msg_name] = [] if @start_with[msg_name].nil?
    @start_with[msg_name] << s

    RServiceBus2.log "Registered, #{saga.name}, to startwith, #{msg_name}", true
  end

  @saga[saga.name] = s

  interrogate_saga_for_app_resources(s)
end

#set_bus_attribute_if_requested(saga) ⇒ Object

setBusAttributeIfRequested

Parameters:

  • saga (RServiceBus2::Saga)


32
33
34
35
36
37
38
39
# File 'lib/rservicebus2/saga/manager.rb', line 32

def set_bus_attribute_if_requested(saga)
  if defined?(saga.bus)
    saga.bus = @host
    RServiceBus2.log 'Bus attribute set for: ' + saga.class.name
  end

  self
end