83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
|
|
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)
|
||
|
|
}
|