|
@ -25,7 +25,7 @@ type MessagePipeline struct { |
|
|
movedBuffersChan chan MessageBufferReference |
|
|
movedBuffersChan chan MessageBufferReference |
|
|
onMessageFn OnMessageFunc |
|
|
onMessageFn OnMessageFunc |
|
|
mover MessageBufferMover |
|
|
mover MessageBufferMover |
|
|
moverPool *util.LimitedConcurrentExecutor |
|
|
|
|
|
|
|
|
moverPool *util.LimitedAsyncExecutor |
|
|
|
|
|
|
|
|
// control pipeline
|
|
|
// control pipeline
|
|
|
doneChan chan struct{} |
|
|
doneChan chan struct{} |
|
@ -47,15 +47,15 @@ func NewMessagePipeline(producerId int32, workerCount int, batchSize int, timeou |
|
|
doneChan: make(chan struct{}), |
|
|
doneChan: make(chan struct{}), |
|
|
batchSize: batchSize, |
|
|
batchSize: batchSize, |
|
|
timeout: timeout, |
|
|
timeout: timeout, |
|
|
moverPool: util.NewLimitedConcurrentExecutor(workerCount), |
|
|
|
|
|
|
|
|
moverPool: util.NewLimitedAsyncExecutor(workerCount), |
|
|
mover: mover, |
|
|
mover: mover, |
|
|
} |
|
|
} |
|
|
go t.doLoopUpload() |
|
|
go t.doLoopUpload() |
|
|
return t |
|
|
return t |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (mp *MessagePipeline) OutputChan() chan MessageBufferReference { |
|
|
|
|
|
return mp.movedBuffersChan |
|
|
|
|
|
|
|
|
func (mp *MessagePipeline) NextMessageBufferReference() MessageBufferReference { |
|
|
|
|
|
return mp.moverPool.NextFuture().Await().(MessageBufferReference) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func (mp *MessagePipeline) AddMessage(message *Message) { |
|
|
func (mp *MessagePipeline) AddMessage(message *Message) { |
|
@ -105,18 +105,20 @@ func (mp *MessagePipeline) doLoopUpload() { |
|
|
select { |
|
|
select { |
|
|
case messageBuffer := <-mp.sealedBuffersChan: |
|
|
case messageBuffer := <-mp.sealedBuffersChan: |
|
|
ticker.Reset(mp.timeout) |
|
|
ticker.Reset(mp.timeout) |
|
|
mp.moverPool.Execute(func() { |
|
|
|
|
|
|
|
|
mp.moverPool.Execute(func() any { |
|
|
|
|
|
var output MessageBufferReference |
|
|
util.RetryForever("message mover", func() error { |
|
|
util.RetryForever("message mover", func() error { |
|
|
if messageReference, flushErr := mp.mover.MoveBuffer(messageBuffer); flushErr != nil { |
|
|
if messageReference, flushErr := mp.mover.MoveBuffer(messageBuffer); flushErr != nil { |
|
|
return flushErr |
|
|
return flushErr |
|
|
} else { |
|
|
} else { |
|
|
mp.movedBuffersChan <- messageReference |
|
|
|
|
|
|
|
|
output = messageReference |
|
|
} |
|
|
} |
|
|
return nil |
|
|
return nil |
|
|
}, func(err error) (shouldContinue bool) { |
|
|
}, func(err error) (shouldContinue bool) { |
|
|
log.Printf("failed: %v", err) |
|
|
log.Printf("failed: %v", err) |
|
|
return true |
|
|
return true |
|
|
}) |
|
|
}) |
|
|
|
|
|
return output |
|
|
}) |
|
|
}) |
|
|
case <-ticker.C: |
|
|
case <-ticker.C: |
|
|
if atomic.LoadInt64(&mp.atomicPipelineStatus) == -2 { |
|
|
if atomic.LoadInt64(&mp.atomicPipelineStatus) == -2 { |
|
|