@@ -3,13 +3,14 @@ package ha
3
3
import (
4
4
"errors"
5
5
"fmt"
6
- "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/logs"
7
- "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/message"
8
- "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/stream"
9
6
"strings"
10
7
"sync"
11
8
"sync/atomic"
12
9
"time"
10
+
11
+ "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/logs"
12
+ "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/message"
13
+ "github.com/rabbitmq/rabbitmq-stream-go-client/pkg/stream"
13
14
)
14
15
15
16
func (p * ReliableProducer ) handlePublishConfirm (confirms stream.ChannelPublishConfirm ) {
@@ -109,12 +110,13 @@ func (p *ReliableProducer) newProducer() error {
109
110
return err
110
111
}
111
112
112
- func (p * ReliableProducer ) Send ( message message. StreamMessage ) error {
113
+ func (p * ReliableProducer ) isReadyToSend ( ) error {
113
114
if p .GetStatus () == StatusStreamDoesNotExist {
114
115
return stream .StreamDoesNotExist
115
116
}
117
+
116
118
if p .GetStatus () == StatusClosed {
117
- return errors . New ( fmt .Sprintf ("%s is closed" , p .getInfo () ))
119
+ return fmt .Errorf ("%s is closed" , p .getInfo ())
118
120
}
119
121
120
122
if p .GetStatus () == StatusReconnecting {
@@ -123,11 +125,10 @@ func (p *ReliableProducer) Send(message message.StreamMessage) error {
123
125
logs .LogDebug ("[Reliable] %s reconnected. The send is unlocked" , p .getInfo ())
124
126
}
125
127
126
- p .mutex .Lock ()
127
- defer p .mutex .Unlock ()
128
-
129
- errW := p .producer .Send (message )
128
+ return nil
129
+ }
130
130
131
+ func (p * ReliableProducer ) checkWriteError (errW error ) error {
131
132
if errW != nil {
132
133
switch {
133
134
case errors .Is (errW , stream .FrameTooLarge ):
@@ -138,10 +139,32 @@ func (p *ReliableProducer) Send(message message.StreamMessage) error {
138
139
time .Sleep (500 * time .Millisecond )
139
140
logs .LogError ("[Reliable] %s - error during send %s" , p .getInfo (), errW .Error ())
140
141
}
142
+ }
143
+ return nil
144
+ }
141
145
146
+ func (p * ReliableProducer ) Send (message message.StreamMessage ) error {
147
+ if err := p .isReadyToSend (); err != nil {
148
+ return err
142
149
}
143
150
144
- return nil
151
+ p .mutex .Lock ()
152
+ errW := p .producer .Send (message )
153
+ p .mutex .Unlock ()
154
+
155
+ return p .checkWriteError (errW )
156
+ }
157
+
158
+ func (p * ReliableProducer ) BatchSend (batchMessages []message.StreamMessage ) error {
159
+ if err := p .isReadyToSend (); err != nil {
160
+ return err
161
+ }
162
+
163
+ p .mutex .Lock ()
164
+ errW := p .producer .BatchSend (batchMessages )
165
+ p .mutex .Unlock ()
166
+
167
+ return p .checkWriteError (errW )
145
168
}
146
169
147
170
func (p * ReliableProducer ) IsOpen () bool {
0 commit comments