🔧 Add nil logger handling in NewConsumerManager and NewStreamManager; update integration test to pass config
This commit is contained in:
@@ -19,6 +19,9 @@ type ConsumerManager struct {
|
|||||||
|
|
||||||
// NewConsumerManager creates a new consumer manager
|
// NewConsumerManager creates a new consumer manager
|
||||||
func NewConsumerManager(js nats.JetStreamContext, streamName, consumerName, subject string, logger *zap.Logger) *ConsumerManager {
|
func NewConsumerManager(js nats.JetStreamContext, streamName, consumerName, subject string, logger *zap.Logger) *ConsumerManager {
|
||||||
|
if logger == nil {
|
||||||
|
logger = zap.NewNop()
|
||||||
|
}
|
||||||
return &ConsumerManager{
|
return &ConsumerManager{
|
||||||
js: js,
|
js: js,
|
||||||
streamName: streamName,
|
streamName: streamName,
|
||||||
@@ -66,5 +69,32 @@ func (cm *ConsumerManager) CreatePullSubscription() (*nats.Subscription, error)
|
|||||||
|
|
||||||
// CreatePullSubscriptionWithRecovery creates a pull subscription
|
// CreatePullSubscriptionWithRecovery creates a pull subscription
|
||||||
func (cm *ConsumerManager) CreatePullSubscriptionWithRecovery(streamManager *StreamManager, consumerConfig *nats.ConsumerConfig) (*nats.Subscription, error) {
|
func (cm *ConsumerManager) CreatePullSubscriptionWithRecovery(streamManager *StreamManager, consumerConfig *nats.ConsumerConfig) (*nats.Subscription, error) {
|
||||||
return cm.CreatePullSubscription()
|
sub, err := cm.CreatePullSubscription()
|
||||||
|
if err == nil {
|
||||||
|
return sub, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt recovery when the consumer or stream is missing.
|
||||||
|
if !errors.Is(err, nats.ErrConsumerNotFound) && !errors.Is(err, nats.ErrStreamNotFound) {
|
||||||
|
return nil, fmt.Errorf("create pull subscription: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if streamManager != nil {
|
||||||
|
if streamErr := streamManager.EnsureStream(nil); streamErr != nil {
|
||||||
|
return nil, fmt.Errorf("recover stream %s: %w", cm.streamName, streamErr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if consumerConfig == nil {
|
||||||
|
return nil, fmt.Errorf("consumer config is required for recovery")
|
||||||
|
}
|
||||||
|
if err := cm.EnsureConsumer(consumerConfig); err != nil {
|
||||||
|
return nil, fmt.Errorf("recover consumer %s: %w", cm.consumerName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
sub, err = cm.CreatePullSubscription()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("create pull subscription after recovery: %w", err)
|
||||||
|
}
|
||||||
|
return sub, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ type StreamConfig struct {
|
|||||||
|
|
||||||
// NewStreamManager creates a new stream manager
|
// NewStreamManager creates a new stream manager
|
||||||
func NewStreamManager(js nats.JetStreamContext, streamName string, subjects []string, logger *zap.Logger) *StreamManager {
|
func NewStreamManager(js nats.JetStreamContext, streamName string, subjects []string, logger *zap.Logger) *StreamManager {
|
||||||
|
if logger == nil {
|
||||||
|
logger = zap.NewNop()
|
||||||
|
}
|
||||||
return &StreamManager{
|
return &StreamManager{
|
||||||
js: js,
|
js: js,
|
||||||
streamName: streamName,
|
streamName: streamName,
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ func TestJetStreamToTimescaleFlow(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
telemetryRecorder := telemetryinfra.NewNoop()
|
telemetryRecorder := telemetryinfra.NewNoop()
|
||||||
proc := app.NewMessageProcessor(parser.ProvideParser(), repo, publisher, telemetryRecorder, logger)
|
proc := app.NewMessageProcessor(parser.ProvideParser(), repo, publisher, telemetryRecorder, logger, cfg)
|
||||||
consumer, err := natsinfra.ProvideConsumer(conn, js, proc, cfg, telemetryRecorder, logger)
|
consumer, err := natsinfra.ProvideConsumer(conn, js, proc, cfg, telemetryRecorder, logger)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("failed to init consumer: %v", err)
|
t.Fatalf("failed to init consumer: %v", err)
|
||||||
|
|||||||
Reference in New Issue
Block a user