Skip to content

Commit ccc81a7

Browse files
committed
Merge branch 'handle_local_event_queue'
* handle_local_event_queue: refactor code and create a local implementation of the PushQueue interface: InMemoryPushQueue
2 parents 8df8cf3 + 6e4e473 commit ccc81a7

3 files changed

Lines changed: 72 additions & 26 deletions

File tree

api/pkg/di/container.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,12 @@ func (container *Container) EventsQueue() (queue services.PushQueue) {
306306
container.logger.Debug("creating events services.PushQueue")
307307

308308
if isLocal() {
309-
return nil
309+
return services.NewInMemoryPushQueue(
310+
container.Logger(),
311+
container.Tracer(),
312+
container.EventsQueueConfiguration(),
313+
func() *services.EventDispatcher { return container.eventDispatcher },
314+
)
310315
}
311316

312317
return services.NewGooglePushQueue(

api/pkg/services/event_dispatcher_service.go

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"github.com/NdoleStudio/httpsms/pkg/telemetry"
1414
cloudevents "github.com/cloudevents/sdk-go/v2"
1515
"github.com/palantir/stacktrace"
16-
"github.com/google/uuid"
1716
)
1817

1918
// EventDispatcher dispatches a new event
@@ -73,30 +72,15 @@ func (dispatcher *EventDispatcher) DispatchWithTimeout(ctx context.Context, even
7372
return queueID, dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
7473
}
7574

76-
if dispatcher.queue == nil {
77-
ctxLogger := dispatcher.tracer.CtxLogger(dispatcher.logger, span)
78-
queueID := uuid.New()
79-
go func() {
80-
time.Sleep(timeout)
81-
dispatcher.DispatchSync(ctx, event)
82-
}()
83-
ctxLogger.Info(fmt.Sprintf(
84-
"item added to [%s] queue with id [%s] and schedule [%s]",
85-
dispatcher.queueConfig.Name,
86-
queueID,
87-
time.Now().UTC().Add(timeout),
88-
))
89-
} else {
90-
task, err := dispatcher.createCloudTask(event)
91-
if err != nil {
92-
msg := fmt.Sprintf("cannot create cloud task for event [%s] with id [%s]", event.Type(), event.ID())
93-
return queueID, dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
94-
}
95-
96-
if queueID, err = dispatcher.queue.Enqueue(ctx, task, timeout); err != nil {
97-
msg := fmt.Sprintf("cannot enqueue event with ID [%s] and type [%s]", event.ID(), event.Type())
98-
return queueID, dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
99-
}
75+
task, err := dispatcher.createCloudTask(event)
76+
if err != nil {
77+
msg := fmt.Sprintf("cannot create cloud task for event [%s] with id [%s]", event.Type(), event.ID())
78+
return queueID, dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
79+
}
80+
81+
if queueID, err = dispatcher.queue.Enqueue(ctx, task, timeout); err != nil {
82+
msg := fmt.Sprintf("cannot enqueue event with ID [%s] and type [%s]", event.ID(), event.Type())
83+
return queueID, dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
10084
}
10185

10286
return queueID, nil
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package services
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"fmt"
7+
"time"
8+
9+
"github.com/NdoleStudio/httpsms/pkg/telemetry"
10+
cloudevents "github.com/cloudevents/sdk-go/v2"
11+
"github.com/google/uuid"
12+
)
13+
14+
type inMemoryPushQueue struct {
15+
getEventDispatcher func() *EventDispatcher
16+
queueConfig PushQueueConfig
17+
logger telemetry.Logger
18+
tracer telemetry.Tracer
19+
}
20+
21+
// NewGooglePushQueue creates a new googlePushQueue
22+
func NewInMemoryPushQueue(
23+
logger telemetry.Logger,
24+
tracer telemetry.Tracer,
25+
queueConfig PushQueueConfig,
26+
getEventDispatcher func() *EventDispatcher,
27+
) PushQueue {
28+
return &inMemoryPushQueue{
29+
tracer: tracer,
30+
logger: logger,
31+
queueConfig: queueConfig,
32+
getEventDispatcher: getEventDispatcher,
33+
}
34+
}
35+
36+
// Enqueue a task to the queue
37+
func (queue *inMemoryPushQueue) Enqueue(ctx context.Context, task *PushQueueTask, timeout time.Duration) (queueID string, err error) {
38+
ctx, span := queue.tracer.Start(ctx)
39+
ctxLogger := queue.tracer.CtxLogger(queue.logger, span)
40+
queueID = uuid.New().String()
41+
42+
go func() {
43+
time.Sleep(timeout)
44+
var event cloudevents.Event
45+
json.Unmarshal(task.Body, &event)
46+
queue.getEventDispatcher().DispatchSync(ctx, event)
47+
}()
48+
49+
ctxLogger.Info(fmt.Sprintf(
50+
"item added to [%s] queue with id [%s] and schedule [%s]",
51+
queue.queueConfig.Name,
52+
queueID,
53+
time.Now().UTC().Add(timeout),
54+
))
55+
56+
return queueID, nil
57+
}

0 commit comments

Comments
 (0)