@@ -2,9 +2,13 @@ package services
22
33import (
44 "errors"
5- "github.com/streadway/amqp"
5+ "fmt"
6+
67 "magecomm/config_manager"
8+ "magecomm/logger"
79 "sync"
10+
11+ "github.com/streadway/amqp"
812)
913
1014var (
@@ -20,7 +24,8 @@ type RabbitMQConnectionPool struct {
2024}
2125
2226type RabbitMQChannelPool struct {
23- pool * sync.Pool
27+ pool * sync.Pool
28+ connPool * RabbitMQConnectionPool
2429}
2530
2631func Close () {
@@ -32,18 +37,19 @@ func Close() {
3237func NewRabbitMQConnectionPool (initialSize int ) * RabbitMQConnectionPool {
3338 p := & sync.Pool {
3439 New : func () interface {} {
35- rmqConn := NewRabbitMQConnection ()
36- if err := rmqConn .Connect ("" ); err != nil {
37- return err
38- }
39- return rmqConn
40+ return NewRabbitMQConnection ()
4041 },
4142 }
4243
4344 cp := & RabbitMQConnectionPool {pool : p }
4445
4546 for i := 0 ; i < initialSize ; i ++ {
46- p .Put (p .New ())
47+ conn := NewRabbitMQConnection ()
48+ if err := conn .Connect ("" ); err != nil {
49+ logger .Warnf ("Failed to create initial RMQ connection: %v" , err )
50+ continue
51+ }
52+ p .Put (conn )
4753 }
4854
4955 return cp
@@ -52,54 +58,92 @@ func NewRabbitMQConnectionPool(initialSize int) *RabbitMQConnectionPool {
5258func NewRabbitMQChannelPool (connPool * RabbitMQConnectionPool , initialSize int ) * RabbitMQChannelPool {
5359 p := & sync.Pool {
5460 New : func () interface {} {
55- conn , err := connPool .Get ()
56- if err != nil {
57- return err
58- }
59- channel , err := conn .CreateChannel ()
60- if err != nil {
61- return err
62- }
63- return channel
61+ return nil
6462 },
6563 }
6664
67- cp := & RabbitMQChannelPool {pool : p }
65+ cp := & RabbitMQChannelPool {
66+ pool : p ,
67+ connPool : connPool ,
68+ }
6869
6970 for i := 0 ; i < initialSize ; i ++ {
70- p .Put (p .New ())
71+ conn , err := connPool .Get ()
72+ if err != nil {
73+ logger .Warnf ("Failed to get connection for initial channel: %v" , err )
74+ continue
75+ }
76+ channel , err := conn .CreateChannel ()
77+ if err != nil {
78+ logger .Warnf ("Failed to create initial RMQ channel: %v" , err )
79+ connPool .Put (conn )
80+ continue
81+ }
82+ connPool .Put (conn )
83+ p .Put (channel )
7184 }
7285
7386 return cp
7487}
7588
7689func (cp * RabbitMQConnectionPool ) Get () (* RabbitMQConnection , error ) {
77- conn := cp .pool .Get ()
78- if conn == nil {
90+ obj := cp .pool .Get ()
91+ if obj == nil {
7992 return nil , ErrConnectionPoolClosed
8093 }
81- return conn .(* RabbitMQConnection ), nil
94+
95+ conn , ok := obj .(* RabbitMQConnection )
96+ if ! ok || conn == nil {
97+ conn = NewRabbitMQConnection ()
98+ }
99+
100+ if conn .Connection == nil || conn .Connection .IsClosed () {
101+ if err := conn .Connect ("" ); err != nil {
102+ return nil , fmt .Errorf ("failed to connect to RabbitMQ: %w" , err )
103+ }
104+ }
105+
106+ return conn , nil
82107}
83108
84109func (cp * RabbitMQConnectionPool ) Put (conn * RabbitMQConnection ) {
85- cp .pool .Put (conn )
110+ if conn != nil && conn .Connection != nil && ! conn .Connection .IsClosed () {
111+ cp .pool .Put (conn )
112+ }
86113}
87114
88115func (cp * RabbitMQConnectionPool ) Close () {
89116 cp .pool = nil
90117}
91118
92119func (cp * RabbitMQChannelPool ) Get () (* amqp.Channel , error ) {
120+ obj := cp .pool .Get ()
93121
94- channel := cp .pool .Get ()
95- if channel == nil {
96- return nil , ErrChannelPoolClosed
122+ if obj != nil {
123+ if channel , ok := obj .(* amqp.Channel ); ok && channel != nil {
124+ return channel , nil
125+ }
97126 }
98- return channel .(* amqp.Channel ), nil
127+
128+ conn , err := cp .connPool .Get ()
129+ if err != nil {
130+ return nil , fmt .Errorf ("failed to get connection: %w" , err )
131+ }
132+
133+ channel , err := conn .CreateChannel ()
134+ if err != nil {
135+ cp .connPool .Put (conn )
136+ return nil , fmt .Errorf ("failed to create channel: %w" , err )
137+ }
138+
139+ cp .connPool .Put (conn )
140+ return channel , nil
99141}
100142
101143func (cp * RabbitMQChannelPool ) Put (channel * amqp.Channel ) {
102- cp .pool .Put (channel )
144+ if channel != nil {
145+ cp .pool .Put (channel )
146+ }
103147}
104148
105149func (cp * RabbitMQChannelPool ) Close () {
0 commit comments