nats_service 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.
- checksums.yaml +7 -0
- data/lib/nats_service/nats_controller.rb +55 -0
- data/lib/nats_service.rb +88 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9f380f8f65520f974f16cd742b3eb7ac2ad0a17ab684971f8e42a1320e32c570
|
4
|
+
data.tar.gz: 20e3d310ea24473b0d8dd1729dda870184137f8536b3f9424aacecd49c6f4dc6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b606638a3f19109ea3730a459205bfcebb296312f87dcd44ecbe1cdd452b4413faeee5f2c69a050ed59191dc2a1b32404c9cdff826076e40bc6da9694e7d1c2c
|
7
|
+
data.tar.gz: 7dd44e5eabaaa20639aa83a79eef7e3840389de5947ad167b5d2d38d1b8013a11d140a9980e224bc3a24c247c73a893197ddacce63d479742f85c7962b8ef34b
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class NatsController < ApplicationController
|
2
|
+
|
3
|
+
def index
|
4
|
+
@durable = false # Default value for the toggle
|
5
|
+
end
|
6
|
+
|
7
|
+
def publish_message
|
8
|
+
subject = params[:subject]
|
9
|
+
message = params[:message]
|
10
|
+
|
11
|
+
nats_service = Rails.application.config.nats_service
|
12
|
+
nats_service.publish_message(subject, message)
|
13
|
+
|
14
|
+
flash[:notice] = "Message published to #{subject}."
|
15
|
+
redirect_to root_path
|
16
|
+
end
|
17
|
+
|
18
|
+
def subscribe_to_subject
|
19
|
+
subject = params[:subject]
|
20
|
+
|
21
|
+
nats_service = Rails.application.config.nats_service
|
22
|
+
nats_service.subscribe_to_subject(subject, "durable_#{subject}")
|
23
|
+
|
24
|
+
flash[:notice] = "Subscribed to #{subject}"
|
25
|
+
Rails.logger.info "Suscribed to #{subject}"
|
26
|
+
redirect_to root_path
|
27
|
+
end
|
28
|
+
|
29
|
+
def send_request
|
30
|
+
subject = params[:subject]
|
31
|
+
message = params[:message]
|
32
|
+
|
33
|
+
nats_service = NatsService.new
|
34
|
+
reply = nats_service.send_request(subject, message)
|
35
|
+
|
36
|
+
if reply
|
37
|
+
flash[:notice] = "Reply received: #{reply}"
|
38
|
+
else
|
39
|
+
flash[:alert] = "No reply received for subject: #{subject}"
|
40
|
+
end
|
41
|
+
|
42
|
+
redirect_to root_path
|
43
|
+
end
|
44
|
+
|
45
|
+
def listen_and_reply
|
46
|
+
subject = params[:subject]
|
47
|
+
reply_message = params[:reply_message]
|
48
|
+
|
49
|
+
nats_service = Rails.application.config.nats_service
|
50
|
+
nats_service.listen_and_reply(subject, reply_message)
|
51
|
+
|
52
|
+
flash[:notice] = "Listening for requests on #{subject} and replying with '#{reply_message}'"
|
53
|
+
redirect_to root_path
|
54
|
+
end
|
55
|
+
end
|
data/lib/nats_service.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'nats/io/client'
|
2
|
+
|
3
|
+
class NatsService
|
4
|
+
def initialize
|
5
|
+
@nats = NATS.connect("nats://localhost:4222")
|
6
|
+
@js = @nats.jetstream
|
7
|
+
create_stream("default_stream")
|
8
|
+
Rails.logger.info "NATS Service initialized keyword ecm"
|
9
|
+
@subscriptions = {} # Almacenamos las suscripciones activas
|
10
|
+
end
|
11
|
+
|
12
|
+
# Create a stream
|
13
|
+
def create_stream(stream_name)
|
14
|
+
begin
|
15
|
+
stream = @js.stream_info(stream_name)
|
16
|
+
Rails.logger.info "Stream '#{stream_name}' already exists"
|
17
|
+
rescue NATS::JetStream::Error::NotFound
|
18
|
+
@js.add_stream(name: stream_name, subjects: ["subject1", "subject2"])
|
19
|
+
Rails.logger.info "Stream '#{stream_name}' created"
|
20
|
+
rescue => e
|
21
|
+
Rails.logger.error "Failed to create stream: #{e.message}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Publish a message to a subject
|
26
|
+
def publish_message(subject, message)
|
27
|
+
Rails.logger.info "keyword #{@nats.connected_server}"
|
28
|
+
begin
|
29
|
+
ack = @js.publish(subject, message)
|
30
|
+
Rails.logger.info "Message sent to #{subject}: #{message}, ACK: #{ack.inspect}"
|
31
|
+
rescue JSON::ParserError => e
|
32
|
+
Rails.logger.error "Error parsing response: #{e.message}"
|
33
|
+
rescue => e
|
34
|
+
Rails.logger.error "Unexpected error: #{e.message}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def subscribe_to_subject(subject, durable_name = "durable_name")
|
39
|
+
Rails.logger.info "keyword #{@nats.connected_server}"
|
40
|
+
@js.subscribe(subject, durable: durable_name) do |msg|
|
41
|
+
Rails.logger.info "Message received on #{subject}: #{msg.data}"
|
42
|
+
msg.ack
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Método para enviar una solicitud
|
47
|
+
def send_request(subject, message)
|
48
|
+
begin
|
49
|
+
response = @nats.request(subject, message, timeout: 5) # Timeout de 5 segundos
|
50
|
+
Rails.logger.info "Received reply: #{response.data}"
|
51
|
+
response.data
|
52
|
+
rescue NATS::IO::Timeout
|
53
|
+
Rails.logger.error "Request timed out for subject: #{subject}"
|
54
|
+
nil
|
55
|
+
rescue => e
|
56
|
+
Rails.logger.error "Unexpected error: #{e.message}"
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Método para responder a solicitudes
|
62
|
+
def listen_and_reply(subject, reply_message)
|
63
|
+
# Cancelamos la suscripción activa si ya existe para este subject
|
64
|
+
if @subscriptions[subject]
|
65
|
+
@subscriptions[subject].unsubscribe
|
66
|
+
Rails.logger.info "Unsubscribed from #{subject}"
|
67
|
+
end
|
68
|
+
Rails.logger.info "keyword ecm #{@subscriptions[subject].inspect}"
|
69
|
+
|
70
|
+
begin
|
71
|
+
# Creamos una nueva suscripción
|
72
|
+
Rails.logger.info "Suscribing a #{subject}"
|
73
|
+
subscription = @nats.subscribe(subject) do |msg|
|
74
|
+
Rails.logger.info "Request received on #{subject}: #{msg.data}"
|
75
|
+
msg.respond(reply_message)
|
76
|
+
Rails.logger.info "Replied to #{subject} with message: #{reply_message}"
|
77
|
+
end
|
78
|
+
rescue => e
|
79
|
+
Rails.logger.error "Error while replying: #{e.message}"
|
80
|
+
end
|
81
|
+
|
82
|
+
# Guardamos la nueva suscripción en el hash
|
83
|
+
@subscriptions[subject] = subscription
|
84
|
+
Rails.logger.info "Stored subscription for #{subject}: #{@subscriptions[subject].inspect}"
|
85
|
+
Rails.logger.info "Listening on #{subject} with reply message: #{reply_message}"
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nats_service
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Bea Graboloza
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-12-16 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A service to send and receive messages on a Rails application using NATS
|
14
|
+
email: beatriz.graboloza@bpo-advisors.net
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/nats_service.rb
|
20
|
+
- lib/nats_service/nats_controller.rb
|
21
|
+
homepage: https://rubygems.org/gems/nats_service
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubygems_version: 3.0.9
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: a NATS service
|
44
|
+
test_files: []
|