rabbitmq-amqp-go-client/rabbitmq_amqp/amqp_consumer.go

83 lines
2.1 KiB
Go
Raw Normal View History

package rabbitmq_amqp
import (
"context"
"github.com/Azure/go-amqp"
)
type DeliveryContext struct {
receiver *amqp.Receiver
message *amqp.Message
}
func (dc *DeliveryContext) Message() *amqp.Message {
return dc.message
}
func (dc *DeliveryContext) Accept(ctx context.Context) error {
return dc.receiver.AcceptMessage(ctx, dc.message)
}
func (dc *DeliveryContext) Discard(ctx context.Context, e *amqp.Error) error {
return dc.receiver.RejectMessage(ctx, dc.message, e)
}
func (dc *DeliveryContext) DiscardWithAnnotations(ctx context.Context, annotations amqp.Annotations) error {
if err := validateMessageAnnotations(annotations); err != nil {
return err
}
// copy the rabbitmq annotations to amqp annotations
destination := make(amqp.Annotations)
for key, value := range annotations {
destination[key] = value
}
return dc.receiver.ModifyMessage(ctx, dc.message, &amqp.ModifyMessageOptions{
DeliveryFailed: true,
UndeliverableHere: true,
Annotations: destination,
})
}
func (dc *DeliveryContext) Requeue(ctx context.Context) error {
return dc.receiver.ReleaseMessage(ctx, dc.message)
}
func (dc *DeliveryContext) RequeueWithAnnotations(ctx context.Context, annotations amqp.Annotations) error {
if err := validateMessageAnnotations(annotations); err != nil {
return err
}
// copy the rabbitmq annotations to amqp annotations
destination := make(amqp.Annotations)
for key, value := range annotations {
destination[key] = value
}
return dc.receiver.ModifyMessage(ctx, dc.message, &amqp.ModifyMessageOptions{
DeliveryFailed: false,
UndeliverableHere: false,
Annotations: destination,
})
}
type Consumer struct {
receiver *amqp.Receiver
}
func newConsumer(receiver *amqp.Receiver) *Consumer {
return &Consumer{receiver: receiver}
}
func (c *Consumer) Receive(ctx context.Context) (*DeliveryContext, error) {
msg, err := c.receiver.Receive(ctx, nil)
if err != nil {
return nil, err
}
return &DeliveryContext{receiver: c.receiver, message: msg}, nil
}
func (c *Consumer) Close(ctx context.Context) error {
return c.receiver.Close(ctx)
}