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

94 lines
2.8 KiB
Go

package rabbitmq_amqp
import (
"fmt"
"github.com/Azure/go-amqp"
"math/rand"
"time"
)
const AtMostOnce = 0
const AtLeastOnce = 1
// senderLinkOptions returns the options for a sender link
// with the given address and link name.
// That should be the same for all the links.
func createSenderLinkOptions(address string, linkName string, deliveryMode int) *amqp.SenderOptions {
prop := make(map[string]any)
prop["paired"] = true
sndSettleMode := amqp.SenderSettleModeSettled.Ptr()
/// SndSettleMode = deliveryMode == DeliveryMode.AtMostOnce
// ? SenderSettleMode.Settled
// : SenderSettleMode.Unsettled,
if deliveryMode == AtLeastOnce {
sndSettleMode = amqp.SenderSettleModeUnsettled.Ptr()
}
return &amqp.SenderOptions{
SourceAddress: address,
DynamicAddress: false,
ExpiryPolicy: amqp.ExpiryPolicyLinkDetach,
ExpiryTimeout: 0,
Name: linkName,
Properties: prop,
SettlementMode: sndSettleMode,
RequestedReceiverSettleMode: amqp.ReceiverSettleModeFirst.Ptr(),
}
}
// receiverLinkOptions returns the options for a receiver link
// with the given address and link name.
// That should be the same for all the links.
func createReceiverLinkOptions(address string, linkName string, deliveryMode int) *amqp.ReceiverOptions {
prop := make(map[string]any)
prop["paired"] = true
receiverSettleMode := amqp.SenderSettleModeSettled.Ptr()
/// SndSettleMode = deliveryMode == DeliveryMode.AtMostOnce
// ? SenderSettleMode.Settled
// : SenderSettleMode.Unsettled,
if deliveryMode == AtLeastOnce {
receiverSettleMode = amqp.SenderSettleModeUnsettled.Ptr()
}
return &amqp.ReceiverOptions{
TargetAddress: address,
DynamicAddress: false,
Name: linkName,
Properties: prop,
Durability: 0,
ExpiryTimeout: 0,
SettlementMode: amqp.ReceiverSettleModeFirst.Ptr(),
RequestedSenderSettleMode: receiverSettleMode,
ExpiryPolicy: amqp.ExpiryPolicyLinkDetach,
Credit: 100,
}
}
func random(max int) int {
r := rand.New(rand.NewSource(time.Now().Unix()))
return r.Intn(max)
}
func validateMessageAnnotations(annotations amqp.Annotations) error {
for k, _ := range annotations {
switch tp := k.(type) {
case string:
if err := validateMessageAnnotationKey(tp); err != nil {
return err
}
default:
return fmt.Errorf("message annotation key must be a string: %v", k)
}
}
return nil
}
func validateMessageAnnotationKey(key string) error {
if key[:2] != "x-" {
return fmt.Errorf("message annotation key must start with 'x-': %s", key)
}
return nil
}