smart_message 0.0.12 → 0.0.16
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +155 -1
- data/Gemfile.lock +6 -6
- data/README.md +71 -25
- data/docs/core-concepts/architecture.md +5 -10
- data/docs/getting-started/examples.md +0 -12
- data/docs/getting-started/quick-start.md +4 -9
- data/docs/index.md +6 -4
- data/docs/reference/serializers.md +160 -488
- data/docs/reference/transports.md +47 -146
- data/docs/transports/memory-transport.md +2 -1
- data/docs/transports/multi-transport.md +484 -0
- data/docs/transports/redis-transport-comparison.md +215 -350
- data/docs/transports/redis-transport.md +3 -22
- data/examples/README.md +6 -9
- data/examples/city_scenario/README.md +1 -1
- data/examples/city_scenario/messages/emergency_911_message.rb +0 -1
- data/examples/city_scenario/messages/emergency_resolved_message.rb +0 -1
- data/examples/city_scenario/messages/fire_dispatch_message.rb +0 -1
- data/examples/city_scenario/messages/fire_emergency_message.rb +0 -1
- data/examples/city_scenario/messages/health_check_message.rb +0 -1
- data/examples/city_scenario/messages/health_status_message.rb +0 -1
- data/examples/city_scenario/messages/police_dispatch_message.rb +0 -1
- data/examples/city_scenario/messages/silent_alarm_message.rb +0 -1
- data/examples/file/00_run_all_file_demos.rb +260 -0
- data/examples/file/01_basic_file_transport_demo.rb +237 -0
- data/examples/file/02_fifo_transport_demo.rb +289 -0
- data/examples/file/03_file_watching_demo.rb +332 -0
- data/examples/file/04_multi_transport_file_demo.rb +432 -0
- data/examples/file/README.md +257 -0
- data/examples/memory/00_run_all_demos.rb +317 -0
- data/examples/memory/01_message_deduplication_demo.rb +18 -32
- data/examples/memory/02_dead_letter_queue_demo.rb +9 -12
- data/examples/memory/03_point_to_point_orders.rb +3 -5
- data/examples/memory/04_publish_subscribe_events.rb +15 -16
- data/examples/memory/05_many_to_many_chat.rb +19 -22
- data/examples/memory/06_stdout_publish_only.rb +145 -0
- data/examples/memory/07_proc_handlers_demo.rb +13 -14
- data/examples/memory/08_custom_logger_demo.rb +136 -140
- data/examples/memory/09_error_handling_demo.rb +7 -10
- data/examples/memory/10_entity_addressing_basic.rb +25 -31
- data/examples/memory/11_entity_addressing_with_filtering.rb +32 -36
- data/examples/memory/12_regex_filtering_microservices.rb +10 -11
- data/examples/memory/13_header_block_configuration.rb +0 -5
- data/examples/memory/14_global_configuration_demo.rb +12 -14
- data/examples/memory/15_logger_demo.rb +0 -1
- data/examples/memory/README.md +37 -20
- data/examples/memory/log/demo_app.log.1 +100 -0
- data/examples/memory/log/demo_app.log.2 +100 -0
- data/examples/multi_transport_example.rb +114 -0
- data/examples/redis/01_smart_home_iot_demo.rb +20 -24
- data/examples/redis/README.md +0 -2
- data/examples/utilities/box_it.rb +12 -0
- data/examples/utilities/doing.rb +19 -0
- data/examples/utilities/temp.md +28 -0
- data/lib/smart_message/base.rb +24 -17
- data/lib/smart_message/configuration.rb +2 -23
- data/lib/smart_message/dead_letter_queue.rb +1 -1
- data/lib/smart_message/errors.rb +3 -0
- data/lib/smart_message/header.rb +1 -1
- data/lib/smart_message/logger/default.rb +1 -1
- data/lib/smart_message/messaging.rb +37 -66
- data/lib/smart_message/plugins.rb +42 -41
- data/lib/smart_message/serializer/base.rb +1 -1
- data/lib/smart_message/serializer.rb +3 -2
- data/lib/smart_message/subscription.rb +18 -20
- data/lib/smart_message/transport/async_publish_queue.rb +284 -0
- data/lib/smart_message/transport/base.rb +42 -8
- data/lib/smart_message/transport/fifo_operations.rb +264 -0
- data/lib/smart_message/transport/file_operations.rb +200 -0
- data/lib/smart_message/transport/file_transport.rb +149 -0
- data/lib/smart_message/transport/file_watching.rb +72 -0
- data/lib/smart_message/transport/memory_transport.rb +23 -4
- data/lib/smart_message/transport/partitioned_files.rb +46 -0
- data/lib/smart_message/transport/redis_transport.rb +11 -0
- data/lib/smart_message/transport/registry.rb +0 -1
- data/lib/smart_message/transport/stdout_transport.rb +73 -41
- data/lib/smart_message/transport/stdout_transport.rb.backup +88 -0
- data/lib/smart_message/transport.rb +0 -1
- data/lib/smart_message/version.rb +1 -1
- metadata +25 -37
- data/docs/guides/redis-queue-getting-started.md +0 -697
- data/docs/guides/redis-queue-patterns.md +0 -889
- data/docs/guides/redis-queue-production.md +0 -1091
- data/docs/transports/redis-enhanced-transport.md +0 -524
- data/docs/transports/redis-queue-transport.md +0 -1304
- data/examples/redis_enhanced/README.md +0 -319
- data/examples/redis_enhanced/enhanced_01_basic_patterns.rb +0 -233
- data/examples/redis_enhanced/enhanced_02_fluent_api.rb +0 -331
- data/examples/redis_enhanced/enhanced_03_dual_publishing.rb +0 -281
- data/examples/redis_enhanced/enhanced_04_advanced_routing.rb +0 -419
- data/examples/redis_queue/01_basic_messaging.rb +0 -221
- data/examples/redis_queue/01_comprehensive_examples.rb +0 -508
- data/examples/redis_queue/02_pattern_routing.rb +0 -405
- data/examples/redis_queue/03_fluent_api.rb +0 -422
- data/examples/redis_queue/04_load_balancing.rb +0 -486
- data/examples/redis_queue/05_microservices.rb +0 -735
- data/examples/redis_queue/06_emergency_alerts.rb +0 -777
- data/examples/redis_queue/07_queue_management.rb +0 -587
- data/examples/redis_queue/README.md +0 -366
- data/examples/redis_queue/enhanced_01_basic_patterns.rb +0 -233
- data/examples/redis_queue/enhanced_02_fluent_api.rb +0 -331
- data/examples/redis_queue/enhanced_03_dual_publishing.rb +0 -281
- data/examples/redis_queue/enhanced_04_advanced_routing.rb +0 -419
- data/examples/redis_queue/redis_queue_architecture.svg +0 -148
- data/ideas/README.md +0 -41
- data/ideas/agents.md +0 -1001
- data/ideas/database_transport.md +0 -980
- data/ideas/improvement.md +0 -359
- data/ideas/meshage.md +0 -1788
- data/ideas/message_discovery.md +0 -178
- data/ideas/message_schema.md +0 -1381
- data/lib/smart_message/transport/redis_enhanced_transport.rb +0 -399
- data/lib/smart_message/transport/redis_queue_transport.rb +0 -555
- data/lib/smart_message/wrapper.rb.bak +0 -132
- /data/examples/memory/{06_pretty_print_demo.rb → 16_pretty_print_demo.rb} +0 -0
@@ -49,12 +49,11 @@ class UserRegistrationMessage < SmartMessage::Base
|
|
49
49
|
description: "Timestamp when user account was created"
|
50
50
|
|
51
51
|
config do
|
52
|
-
transport SmartMessage::Transport::
|
53
|
-
serializer SmartMessage::Serializer::Json.new
|
52
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
54
53
|
end
|
55
54
|
|
56
|
-
def
|
57
|
-
message_header, message_payload =
|
55
|
+
def process(message)
|
56
|
+
message_header, message_payload = message
|
58
57
|
user_data = JSON.parse(message_payload)
|
59
58
|
puts "✅ User registration processed: #{user_data['username']} (#{user_data['email']})"
|
60
59
|
end
|
@@ -98,12 +97,11 @@ class UserRegistrationMessageV2 < SmartMessage::Base
|
|
98
97
|
description: "Timestamp when user account was created"
|
99
98
|
|
100
99
|
config do
|
101
|
-
transport SmartMessage::Transport::
|
102
|
-
serializer SmartMessage::Serializer::Json.new
|
100
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
103
101
|
end
|
104
102
|
|
105
|
-
def
|
106
|
-
message_header, message_payload =
|
103
|
+
def process(message)
|
104
|
+
message_header, message_payload = message
|
107
105
|
user_data = JSON.parse(message_payload)
|
108
106
|
puts "✅ User registration V2 processed: #{user_data['username']} (#{user_data['email']}, #{user_data['phone_number']})"
|
109
107
|
end
|
@@ -120,8 +118,7 @@ class MultiRequiredMessage < SmartMessage::Base
|
|
120
118
|
property :optional_field, description: "Optional field for comparison"
|
121
119
|
|
122
120
|
config do
|
123
|
-
transport SmartMessage::Transport::
|
124
|
-
serializer SmartMessage::Serializer::Json.new
|
121
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
125
122
|
end
|
126
123
|
end
|
127
124
|
|
@@ -14,7 +14,7 @@ puts "🎯 SmartMessage Entity Addressing Demo"
|
|
14
14
|
puts "=" * 50
|
15
15
|
|
16
16
|
# Configure transport for demo
|
17
|
-
transport = SmartMessage::Transport.
|
17
|
+
transport = SmartMessage::Transport::MemoryTransport.new
|
18
18
|
serializer = SmartMessage::Serializer::Json.new
|
19
19
|
|
20
20
|
# =============================================================================
|
@@ -39,13 +39,12 @@ class OrderMessage < SmartMessage::Base
|
|
39
39
|
property :total_amount, required: true
|
40
40
|
|
41
41
|
config do
|
42
|
-
transport SmartMessage::Transport.
|
43
|
-
serializer SmartMessage::Serializer::Json.new
|
42
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
44
43
|
end
|
45
44
|
|
46
|
-
def
|
47
|
-
header =
|
48
|
-
payload =
|
45
|
+
def process(message)
|
46
|
+
header = message._sm_header
|
47
|
+
payload = message
|
49
48
|
data = JSON.parse(payload)
|
50
49
|
puts " 🎯 FULFILLMENT SERVICE received order:"
|
51
50
|
puts " Order ID: #{data['order_id']}"
|
@@ -92,13 +91,12 @@ class SystemAnnouncementMessage < SmartMessage::Base
|
|
92
91
|
property :effective_time, required: true
|
93
92
|
|
94
93
|
config do
|
95
|
-
transport SmartMessage::Transport.
|
96
|
-
serializer SmartMessage::Serializer::Json.new
|
94
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
97
95
|
end
|
98
96
|
|
99
|
-
def
|
100
|
-
header =
|
101
|
-
payload =
|
97
|
+
def process(message)
|
98
|
+
header = message._sm_header
|
99
|
+
payload = message
|
102
100
|
data = JSON.parse(payload)
|
103
101
|
priority_icon = data['priority'] == 'high' ? '🚨' : '📢'
|
104
102
|
puts " #{priority_icon} ALL SERVICES received announcement:"
|
@@ -144,13 +142,12 @@ class UserLookupRequest < SmartMessage::Base
|
|
144
142
|
property :requested_fields, default: ['name', 'email']
|
145
143
|
|
146
144
|
config do
|
147
|
-
transport SmartMessage::Transport.
|
148
|
-
serializer SmartMessage::Serializer::Json.new
|
145
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
149
146
|
end
|
150
147
|
|
151
|
-
def
|
152
|
-
header =
|
153
|
-
payload =
|
148
|
+
def process(message)
|
149
|
+
header = message._sm_header
|
150
|
+
payload = message
|
154
151
|
data = JSON.parse(payload)
|
155
152
|
puts " 🔍 USER SERVICE received lookup request:"
|
156
153
|
puts " Request ID: #{data['request_id']}"
|
@@ -178,13 +175,12 @@ class UserLookupResponse < SmartMessage::Base
|
|
178
175
|
property :error_message
|
179
176
|
|
180
177
|
config do
|
181
|
-
transport SmartMessage::Transport.
|
182
|
-
serializer SmartMessage::Serializer::Json.new
|
178
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
183
179
|
end
|
184
180
|
|
185
|
-
def
|
186
|
-
header =
|
187
|
-
payload =
|
181
|
+
def process(message)
|
182
|
+
header = message._sm_header
|
183
|
+
payload = message
|
188
184
|
data = JSON.parse(payload)
|
189
185
|
puts " ✅ WEB SERVICE received lookup response:"
|
190
186
|
puts " Request ID: #{data['request_id']}"
|
@@ -250,13 +246,12 @@ class PaymentMessage < SmartMessage::Base
|
|
250
246
|
property :payment_method, default: 'credit_card'
|
251
247
|
|
252
248
|
config do
|
253
|
-
transport SmartMessage::Transport.
|
254
|
-
serializer SmartMessage::Serializer::Json.new
|
249
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
255
250
|
end
|
256
251
|
|
257
|
-
def
|
258
|
-
header =
|
259
|
-
payload =
|
252
|
+
def process(message)
|
253
|
+
header = message._sm_header
|
254
|
+
payload = message
|
260
255
|
data = JSON.parse(payload)
|
261
256
|
gateway_icon = header.to.include?('backup') ? '🔄' : '🏦'
|
262
257
|
puts " #{gateway_icon} #{header.to.upcase} received payment:"
|
@@ -325,13 +320,12 @@ class ExternalAPIMessage < SmartMessage::Base
|
|
325
320
|
property :partner_id, required: true
|
326
321
|
|
327
322
|
config do
|
328
|
-
transport SmartMessage::Transport.
|
329
|
-
serializer SmartMessage::Serializer::Json.new
|
323
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
330
324
|
end
|
331
325
|
|
332
|
-
def
|
333
|
-
header =
|
334
|
-
payload =
|
326
|
+
def process(message)
|
327
|
+
header = message._sm_header
|
328
|
+
payload = message
|
335
329
|
data = JSON.parse(payload)
|
336
330
|
puts " 🌐 EXTERNAL PARTNER received API call:"
|
337
331
|
puts " API Call: #{data['api_call']}"
|
@@ -15,7 +15,7 @@ puts "🎯 SmartMessage Entity Addressing & Filtering Demo"
|
|
15
15
|
puts "=" * 50
|
16
16
|
|
17
17
|
# Configure transport for demo
|
18
|
-
transport = SmartMessage::Transport.
|
18
|
+
transport = SmartMessage::Transport::MemoryTransport.new
|
19
19
|
serializer = SmartMessage::Serializer::Json.new
|
20
20
|
|
21
21
|
# =============================================================================
|
@@ -36,14 +36,13 @@ class ServiceMessage < SmartMessage::Base
|
|
36
36
|
property :timestamp, default: -> { Time.now.to_s }
|
37
37
|
|
38
38
|
config do
|
39
|
-
transport SmartMessage::Transport.
|
40
|
-
serializer SmartMessage::Serializer::Json.new
|
39
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
41
40
|
end
|
42
41
|
|
43
42
|
# Different handlers for different subscription filters
|
44
|
-
def
|
45
|
-
header =
|
46
|
-
payload =
|
43
|
+
def process_broadcast(message)
|
44
|
+
header = message._sm_header
|
45
|
+
payload = message
|
47
46
|
data = JSON.parse(payload)
|
48
47
|
puts " 📻 BROADCAST HANDLER received:"
|
49
48
|
puts " Type: #{data['message_type']}"
|
@@ -51,9 +50,9 @@ class ServiceMessage < SmartMessage::Base
|
|
51
50
|
puts " Data: #{data['data']}"
|
52
51
|
end
|
53
52
|
|
54
|
-
def
|
55
|
-
header =
|
56
|
-
payload =
|
53
|
+
def process_directed(message)
|
54
|
+
header = message._sm_header
|
55
|
+
payload = message
|
57
56
|
data = JSON.parse(payload)
|
58
57
|
puts " 🎯 DIRECTED HANDLER received:"
|
59
58
|
puts " Type: #{data['message_type']}"
|
@@ -61,9 +60,9 @@ class ServiceMessage < SmartMessage::Base
|
|
61
60
|
puts " Data: #{data['data']}"
|
62
61
|
end
|
63
62
|
|
64
|
-
def
|
65
|
-
header =
|
66
|
-
payload =
|
63
|
+
def process_from_admin(message)
|
64
|
+
header = message._sm_header
|
65
|
+
payload = message
|
67
66
|
data = JSON.parse(payload)
|
68
67
|
puts " 👮 ADMIN HANDLER received:"
|
69
68
|
puts " Type: #{data['message_type']}"
|
@@ -153,13 +152,12 @@ class AlertMessage < SmartMessage::Base
|
|
153
152
|
property :source_system
|
154
153
|
|
155
154
|
config do
|
156
|
-
transport SmartMessage::Transport.
|
157
|
-
serializer SmartMessage::Serializer::Json.new
|
155
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
158
156
|
end
|
159
157
|
|
160
|
-
def
|
161
|
-
header =
|
162
|
-
payload =
|
158
|
+
def process_broadcast(message)
|
159
|
+
header = message._sm_header
|
160
|
+
payload = message
|
163
161
|
data = JSON.parse(payload)
|
164
162
|
icon = data['severity'] == 'critical' ? '🚨' : '📢'
|
165
163
|
puts " #{icon} ALERT MONITOR received:"
|
@@ -168,9 +166,9 @@ class AlertMessage < SmartMessage::Base
|
|
168
166
|
puts " Alert: #{data['alert_text']}"
|
169
167
|
end
|
170
168
|
|
171
|
-
def
|
172
|
-
header =
|
173
|
-
payload =
|
169
|
+
def process_from_monitoring(message)
|
170
|
+
header = message._sm_header
|
171
|
+
payload = message
|
174
172
|
data = JSON.parse(payload)
|
175
173
|
puts " 📊 MONITORING TEAM received:"
|
176
174
|
puts " From: #{header.from} (monitoring system)"
|
@@ -261,13 +259,12 @@ class OrderMessage < SmartMessage::Base
|
|
261
259
|
property :total_amount, required: true
|
262
260
|
|
263
261
|
config do
|
264
|
-
transport SmartMessage::Transport.
|
265
|
-
serializer SmartMessage::Serializer::Json.new
|
262
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
266
263
|
end
|
267
264
|
|
268
|
-
def
|
269
|
-
header =
|
270
|
-
payload =
|
265
|
+
def process_high_priority(message)
|
266
|
+
header = message._sm_header
|
267
|
+
payload = message
|
271
268
|
data = JSON.parse(payload)
|
272
269
|
puts " 🚀 HIGH PRIORITY ORDER HANDLER:"
|
273
270
|
puts " Order ID: #{data['order_id']} (PRIORITY: #{data['priority'].upcase})"
|
@@ -275,9 +272,9 @@ class OrderMessage < SmartMessage::Base
|
|
275
272
|
puts " Total: $#{data['total_amount']}"
|
276
273
|
end
|
277
274
|
|
278
|
-
def
|
279
|
-
header =
|
280
|
-
payload =
|
275
|
+
def process_normal(message)
|
276
|
+
header = message._sm_header
|
277
|
+
payload = message
|
281
278
|
data = JSON.parse(payload)
|
282
279
|
puts " 📦 NORMAL ORDER HANDLER:"
|
283
280
|
puts " Order ID: #{data['order_id']}"
|
@@ -356,13 +353,12 @@ class ServiceRequest < SmartMessage::Base
|
|
356
353
|
property :data
|
357
354
|
|
358
355
|
config do
|
359
|
-
transport SmartMessage::Transport.
|
360
|
-
serializer SmartMessage::Serializer::Json.new
|
356
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
361
357
|
end
|
362
358
|
|
363
|
-
def
|
364
|
-
header =
|
365
|
-
payload =
|
359
|
+
def process_api_requests(message)
|
360
|
+
header = message._sm_header
|
361
|
+
payload = message
|
366
362
|
data = JSON.parse(payload)
|
367
363
|
puts " 🌐 API SERVICE received request:"
|
368
364
|
puts " Request ID: #{data['request_id']}"
|
@@ -371,9 +367,9 @@ class ServiceRequest < SmartMessage::Base
|
|
371
367
|
puts " Reply To: #{header.reply_to}"
|
372
368
|
end
|
373
369
|
|
374
|
-
def
|
375
|
-
header =
|
376
|
-
payload =
|
370
|
+
def process_data_requests(message)
|
371
|
+
header = message._sm_header
|
372
|
+
payload = message
|
377
373
|
data = JSON.parse(payload)
|
378
374
|
puts " 💾 DATA SERVICE received request:"
|
379
375
|
puts " Request ID: #{data['request_id']}"
|
@@ -30,8 +30,7 @@ class MicroserviceMessage < SmartMessage::Base
|
|
30
30
|
|
31
31
|
# Configure with STDOUT transport for demo visibility
|
32
32
|
config do
|
33
|
-
transport SmartMessage::Transport::
|
34
|
-
serializer SmartMessage::Serializer::Json.new
|
33
|
+
transport SmartMessage::Transport::MemoryTransport.new
|
35
34
|
end
|
36
35
|
end
|
37
36
|
|
@@ -43,9 +42,9 @@ class PaymentMessage < MicroserviceMessage
|
|
43
42
|
property :amount, required: true
|
44
43
|
property :currency, default: 'USD'
|
45
44
|
|
46
|
-
def
|
47
|
-
header =
|
48
|
-
payload =
|
45
|
+
def process(message)
|
46
|
+
header = message._sm_header
|
47
|
+
payload = message
|
49
48
|
msg_data = JSON.parse(payload)
|
50
49
|
puts "💳 PaymentMessage processed by #{self.name}"
|
51
50
|
puts " From: #{header.from} → To: #{header.to}"
|
@@ -62,9 +61,9 @@ class OrderMessage < MicroserviceMessage
|
|
62
61
|
property :customer_id, required: true
|
63
62
|
property :status, default: 'pending'
|
64
63
|
|
65
|
-
def
|
66
|
-
header =
|
67
|
-
payload =
|
64
|
+
def process(message)
|
65
|
+
header = message._sm_header
|
66
|
+
payload = message
|
68
67
|
msg_data = JSON.parse(payload)
|
69
68
|
puts "📦 OrderMessage processed by #{self.name}"
|
70
69
|
puts " From: #{header.from} → To: #{header.to}"
|
@@ -81,9 +80,9 @@ class AlertMessage < MicroserviceMessage
|
|
81
80
|
property :component, required: true
|
82
81
|
property :description, required: true
|
83
82
|
|
84
|
-
def
|
85
|
-
header =
|
86
|
-
payload =
|
83
|
+
def process(message)
|
84
|
+
header = message._sm_header
|
85
|
+
payload = message
|
87
86
|
msg_data = JSON.parse(payload)
|
88
87
|
puts "🚨 AlertMessage processed by #{self.name}"
|
89
88
|
puts " From: #{header.from} → To: #{header.to}"
|
@@ -32,7 +32,6 @@ class DirectMethodMessage < SmartMessage::Base
|
|
32
32
|
|
33
33
|
config do
|
34
34
|
transport SmartMessage::Transport.create(:stdout)
|
35
|
-
serializer SmartMessage::Serializer::Json.new
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
@@ -63,7 +62,6 @@ class HeaderBlockMessage < SmartMessage::Base
|
|
63
62
|
|
64
63
|
config do
|
65
64
|
transport SmartMessage::Transport.create(:stdout)
|
66
|
-
serializer SmartMessage::Serializer::Json.new
|
67
65
|
end
|
68
66
|
end
|
69
67
|
|
@@ -96,7 +94,6 @@ class MixedConfigMessage < SmartMessage::Base
|
|
96
94
|
|
97
95
|
config do
|
98
96
|
transport SmartMessage::Transport.create(:stdout)
|
99
|
-
serializer SmartMessage::Serializer::Json.new
|
100
97
|
end
|
101
98
|
end
|
102
99
|
|
@@ -127,7 +124,6 @@ class FlexibleMessage < SmartMessage::Base
|
|
127
124
|
|
128
125
|
config do
|
129
126
|
transport SmartMessage::Transport.create(:stdout)
|
130
|
-
serializer SmartMessage::Serializer::Json.new
|
131
127
|
end
|
132
128
|
end
|
133
129
|
|
@@ -234,7 +230,6 @@ class CheckableMessage < SmartMessage::Base
|
|
234
230
|
|
235
231
|
config do
|
236
232
|
transport SmartMessage::Transport.create(:stdout)
|
237
|
-
serializer SmartMessage::Serializer::Json.new
|
238
233
|
end
|
239
234
|
end
|
240
235
|
|
@@ -24,14 +24,14 @@ puts
|
|
24
24
|
puts "2. Configuring Logging with String Path:"
|
25
25
|
SmartMessage.configure do |config|
|
26
26
|
config.logger = "log/my_application.log" # String = Lumberjack logger with this path
|
27
|
-
config.transport = SmartMessage::Transport::
|
28
|
-
|
27
|
+
config.transport = SmartMessage::Transport::MemoryTransport.new
|
28
|
+
# Note: Serializers are configured per transport, not globally
|
29
29
|
end
|
30
30
|
|
31
31
|
puts " Configured Logger: #{SmartMessage::Logger.default.class}"
|
32
32
|
puts " Log File: #{SmartMessage::Logger.default.log_file rescue 'N/A'}"
|
33
33
|
puts " Configured Transport: #{SmartMessage::Transport.default.class}"
|
34
|
-
puts "
|
34
|
+
puts " Framework Default Serializer: #{SmartMessage::Serializer.default.class}"
|
35
35
|
puts
|
36
36
|
|
37
37
|
# Reset for next example
|
@@ -41,14 +41,14 @@ SmartMessage.reset_configuration!
|
|
41
41
|
puts "3. Configuring with :default Symbol:"
|
42
42
|
SmartMessage.configure do |config|
|
43
43
|
config.logger = :default # Use Lumberjack with default settings
|
44
|
-
config.transport = SmartMessage::Transport::
|
45
|
-
|
44
|
+
config.transport = SmartMessage::Transport::MemoryTransport.new
|
45
|
+
# Note: Serializers are configured per transport, not globally
|
46
46
|
end
|
47
47
|
|
48
48
|
puts " Configured Logger: #{SmartMessage::Logger.default.class}"
|
49
49
|
puts " Log File: #{SmartMessage::Logger.default.log_file rescue 'N/A'}"
|
50
50
|
puts " Configured Transport: #{SmartMessage::Transport.default.class}"
|
51
|
-
puts "
|
51
|
+
puts " Framework Default Serializer: #{SmartMessage::Serializer.default.class}"
|
52
52
|
puts
|
53
53
|
|
54
54
|
# Example 4: Message classes automatically use global configuration
|
@@ -62,12 +62,11 @@ class NotificationMessage < SmartMessage::Base
|
|
62
62
|
# Explicitly use global configuration for demonstration
|
63
63
|
config do
|
64
64
|
transport SmartMessage::Transport.default
|
65
|
-
serializer SmartMessage::Serializer.default
|
66
65
|
logger SmartMessage::Logger.default
|
67
66
|
end
|
68
67
|
|
69
|
-
def
|
70
|
-
message_header, message_payload =
|
68
|
+
def process(message)
|
69
|
+
message_header, message_payload = message
|
71
70
|
data = JSON.parse(message_payload)
|
72
71
|
|
73
72
|
priority_emoji = case data['priority']
|
@@ -88,12 +87,11 @@ class OrderStatusMessage < SmartMessage::Base
|
|
88
87
|
# Explicitly use global configuration for demonstration
|
89
88
|
config do
|
90
89
|
transport SmartMessage::Transport.default
|
91
|
-
serializer SmartMessage::Serializer.default
|
92
90
|
logger SmartMessage::Logger.default
|
93
91
|
end
|
94
92
|
|
95
|
-
def
|
96
|
-
message_header, message_payload =
|
93
|
+
def process(message)
|
94
|
+
message_header, message_payload = message
|
97
95
|
data = JSON.parse(message_payload)
|
98
96
|
|
99
97
|
status_emoji = case data['status']
|
@@ -154,8 +152,8 @@ class SpecialMessage < SmartMessage::Base
|
|
154
152
|
# transport and serializer still use global configuration
|
155
153
|
end
|
156
154
|
|
157
|
-
def
|
158
|
-
message_header, message_payload =
|
155
|
+
def process(message)
|
156
|
+
message_header, message_payload = message
|
159
157
|
data = JSON.parse(message_payload)
|
160
158
|
puts "⭐ Special processing: #{data['content']}"
|
161
159
|
end
|
data/examples/memory/README.md
CHANGED
@@ -1,16 +1,25 @@
|
|
1
1
|
# Memory Transport Examples
|
2
2
|
|
3
|
-
This directory contains demonstration programs that use SmartMessage's **Memory Transport** and **
|
3
|
+
This directory contains demonstration programs that use SmartMessage's **Memory Transport** and **STDOUT Transport**. These examples show the fundamentals of SmartMessage without requiring external dependencies like Redis or message queues.
|
4
4
|
|
5
5
|
## Transport Overview
|
6
6
|
|
7
|
-
|
7
|
+
### Memory Transport
|
8
|
+
Perfect for local development with message processing:
|
8
9
|
- **Learning SmartMessage fundamentals**
|
9
|
-
- **Rapid prototyping and testing**
|
10
|
+
- **Rapid prototyping and testing**
|
10
11
|
- **Single-process applications**
|
11
12
|
- **Development and debugging**
|
13
|
+
- **Local message processing**
|
12
14
|
|
13
|
-
|
15
|
+
### STDOUT Transport
|
16
|
+
Publish-only transport for debugging and integration:
|
17
|
+
- **Debugging and logging**
|
18
|
+
- **Integration with external tools**
|
19
|
+
- **Development monitoring**
|
20
|
+
- **One-way message output**
|
21
|
+
|
22
|
+
The Memory transport keeps all message routing in-memory within the current Ruby process, while STDOUT transport outputs messages for external processing.
|
14
23
|
|
15
24
|
## Example Programs
|
16
25
|
|
@@ -32,15 +41,15 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
32
41
|
|
33
42
|
### 🛍️ 03_point_to_point_orders.rb
|
34
43
|
**Demonstrates:** Point-to-point messaging (1:1)
|
35
|
-
**Transport:**
|
44
|
+
**Transport:** MemoryTransport
|
36
45
|
- Order processing system between OrderService and PaymentService
|
37
46
|
- Request/response message pattern
|
38
|
-
-
|
47
|
+
- Automatic serialization of complex order data by transport
|
39
48
|
- Bidirectional communication flow
|
40
49
|
|
41
50
|
### 📢 04_publish_subscribe_events.rb
|
42
51
|
**Demonstrates:** Publish-subscribe messaging (1:many)
|
43
|
-
**Transport:**
|
52
|
+
**Transport:** MemoryTransport
|
44
53
|
- User event notification system
|
45
54
|
- Multiple subscribers (EmailService, SMSService, AuditService)
|
46
55
|
- Event-driven architecture
|
@@ -48,13 +57,21 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
48
57
|
|
49
58
|
### 💬 05_many_to_many_chat.rb
|
50
59
|
**Demonstrates:** Many-to-many messaging patterns
|
51
|
-
**Transport:**
|
60
|
+
**Transport:** MemoryTransport
|
52
61
|
- Multi-user chat room system
|
53
62
|
- Message broadcasting to multiple participants
|
54
63
|
- User presence and room management
|
55
64
|
- Complex message routing scenarios
|
56
65
|
|
57
|
-
###
|
66
|
+
### 📤 06_stdout_publish_only.rb
|
67
|
+
**Demonstrates:** STDOUT transport publish-only usage
|
68
|
+
**Transport:** StdoutTransport (publish-only)
|
69
|
+
- Log message publishing to STDOUT
|
70
|
+
- Metrics publishing in JSON format
|
71
|
+
- Perfect for debugging and external tool integration
|
72
|
+
- Shows pretty-print vs JSON formatting options
|
73
|
+
|
74
|
+
### 🎨 16_pretty_print_demo.rb
|
58
75
|
**Demonstrates:** Message pretty-printing and debugging
|
59
76
|
**Transport:** None (utility demo)
|
60
77
|
- Shows SmartMessage's `pretty_print` method
|
@@ -64,7 +81,7 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
64
81
|
|
65
82
|
### ⚡ 07_proc_handlers_demo.rb
|
66
83
|
**Demonstrates:** Proc-based message handlers
|
67
|
-
**Transport:**
|
84
|
+
**Transport:** MemoryTransport
|
68
85
|
- Custom Proc handlers for message processing
|
69
86
|
- Dynamic message routing
|
70
87
|
- Flexible handler assignment
|
@@ -72,7 +89,7 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
72
89
|
|
73
90
|
### 📊 08_custom_logger_demo.rb
|
74
91
|
**Demonstrates:** Custom logging implementations
|
75
|
-
**Transport:**
|
92
|
+
**Transport:** MemoryTransport
|
76
93
|
- Multiple logger types and configurations
|
77
94
|
- Custom logger classes
|
78
95
|
- Log filtering and formatting
|
@@ -80,7 +97,7 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
80
97
|
|
81
98
|
### ❌ 09_error_handling_demo.rb
|
82
99
|
**Demonstrates:** Error handling strategies
|
83
|
-
**Transport:**
|
100
|
+
**Transport:** MemoryTransport
|
84
101
|
- Various error scenarios and recovery patterns
|
85
102
|
- Exception handling in message processors
|
86
103
|
- Error propagation and logging
|
@@ -88,7 +105,7 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
88
105
|
|
89
106
|
### 🎯 10_entity_addressing_basic.rb
|
90
107
|
**Demonstrates:** Basic entity addressing
|
91
|
-
**Transport:**
|
108
|
+
**Transport:** MemoryTransport
|
92
109
|
- Message routing by entity addresses
|
93
110
|
- Order processing with specific routing
|
94
111
|
- Customer and payment entity handling
|
@@ -96,7 +113,7 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
96
113
|
|
97
114
|
### 🔍 11_entity_addressing_with_filtering.rb
|
98
115
|
**Demonstrates:** Advanced entity addressing with filters
|
99
|
-
**Transport:**
|
116
|
+
**Transport:** MemoryTransport
|
100
117
|
- Complex filtering patterns
|
101
118
|
- Regex-based address matching
|
102
119
|
- Multiple entity types and routing rules
|
@@ -104,7 +121,7 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
104
121
|
|
105
122
|
### 🏢 12_regex_filtering_microservices.rb
|
106
123
|
**Demonstrates:** Microservices with regex filtering
|
107
|
-
**Transport:**
|
124
|
+
**Transport:** MemoryTransport
|
108
125
|
- Service-to-service communication patterns
|
109
126
|
- Regular expression-based routing
|
110
127
|
- Environment-based filtering (dev/staging/prod)
|
@@ -112,7 +129,7 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
112
129
|
|
113
130
|
### 📝 13_header_block_configuration.rb
|
114
131
|
**Demonstrates:** Header configuration with blocks
|
115
|
-
**Transport:** StdoutTransport
|
132
|
+
**Transport:** StdoutTransport (publish-only)
|
116
133
|
- Dynamic header configuration
|
117
134
|
- Block-based header modification
|
118
135
|
- Custom header fields
|
@@ -120,15 +137,15 @@ These transports keep all message routing in-memory within the current Ruby proc
|
|
120
137
|
|
121
138
|
### 🌍 14_global_configuration_demo.rb
|
122
139
|
**Demonstrates:** Global SmartMessage configuration
|
123
|
-
**Transport:**
|
124
|
-
- Global transport
|
125
|
-
- Configuration inheritance
|
140
|
+
**Transport:** MemoryTransport
|
141
|
+
- Global transport settings
|
142
|
+
- Configuration inheritance (serialization handled by transport)
|
126
143
|
- Default settings management
|
127
144
|
- Application-wide configuration patterns
|
128
145
|
|
129
146
|
### 📋 15_logger_demo.rb
|
130
147
|
**Demonstrates:** Logger configuration and usage
|
131
|
-
**Transport:** StdoutTransport
|
148
|
+
**Transport:** StdoutTransport (publish-only)
|
132
149
|
- Various logger configurations
|
133
150
|
- Log level management
|
134
151
|
- Custom log formatting
|