2025-02-17 21:04:13 +08:00
|
|
|
package rabbitmqamqp
|
2024-11-21 17:34:08 +08:00
|
|
|
|
2025-01-16 22:26:12 +08:00
|
|
|
import (
|
2025-01-22 16:56:23 +08:00
|
|
|
"fmt"
|
2025-01-16 22:26:12 +08:00
|
|
|
"math/rand"
|
|
|
|
|
"time"
|
2025-02-24 22:04:19 +08:00
|
|
|
|
|
|
|
|
"github.com/Azure/go-amqp"
|
2025-01-16 22:26:12 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const AtMostOnce = 0
|
|
|
|
|
const AtLeastOnce = 1
|
2024-11-21 17:34:08 +08:00
|
|
|
|
|
|
|
|
// senderLinkOptions returns the options for a sender link
|
|
|
|
|
// with the given address and link name.
|
|
|
|
|
// That should be the same for all the links.
|
2025-01-16 22:26:12 +08:00
|
|
|
func createSenderLinkOptions(address string, linkName string, deliveryMode int) *amqp.SenderOptions {
|
2024-11-21 17:34:08 +08:00
|
|
|
prop := make(map[string]any)
|
|
|
|
|
prop["paired"] = true
|
2025-01-16 22:26:12 +08:00
|
|
|
sndSettleMode := amqp.SenderSettleModeSettled.Ptr()
|
|
|
|
|
/// SndSettleMode = deliveryMode == DeliveryMode.AtMostOnce
|
|
|
|
|
// ? SenderSettleMode.Settled
|
|
|
|
|
// : SenderSettleMode.Unsettled,
|
|
|
|
|
|
|
|
|
|
if deliveryMode == AtLeastOnce {
|
|
|
|
|
sndSettleMode = amqp.SenderSettleModeUnsettled.Ptr()
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-21 17:34:08 +08:00
|
|
|
return &amqp.SenderOptions{
|
|
|
|
|
SourceAddress: address,
|
|
|
|
|
DynamicAddress: false,
|
|
|
|
|
ExpiryPolicy: amqp.ExpiryPolicyLinkDetach,
|
|
|
|
|
ExpiryTimeout: 0,
|
|
|
|
|
Name: linkName,
|
|
|
|
|
Properties: prop,
|
2025-01-16 22:26:12 +08:00
|
|
|
SettlementMode: sndSettleMode,
|
2024-11-21 17:34:08 +08:00
|
|
|
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.
|
2025-02-27 20:58:59 +08:00
|
|
|
func createReceiverLinkOptions(address string, options IConsumerOptions, deliveryMode int) *amqp.ReceiverOptions {
|
2024-11-21 17:34:08 +08:00
|
|
|
prop := make(map[string]any)
|
|
|
|
|
prop["paired"] = true
|
2025-01-22 16:56:23 +08:00
|
|
|
receiverSettleMode := amqp.SenderSettleModeSettled.Ptr()
|
|
|
|
|
/// SndSettleMode = deliveryMode == DeliveryMode.AtMostOnce
|
|
|
|
|
// ? SenderSettleMode.Settled
|
|
|
|
|
// : SenderSettleMode.Unsettled,
|
|
|
|
|
|
|
|
|
|
if deliveryMode == AtLeastOnce {
|
|
|
|
|
receiverSettleMode = amqp.SenderSettleModeUnsettled.Ptr()
|
|
|
|
|
}
|
|
|
|
|
|
2025-02-13 19:04:35 +08:00
|
|
|
result := &amqp.ReceiverOptions{
|
2024-11-21 17:34:08 +08:00
|
|
|
TargetAddress: address,
|
|
|
|
|
DynamicAddress: false,
|
2025-02-13 19:04:35 +08:00
|
|
|
Name: getLinkName(options),
|
2024-11-21 17:34:08 +08:00
|
|
|
Properties: prop,
|
2025-01-22 16:56:23 +08:00
|
|
|
Durability: 0,
|
|
|
|
|
ExpiryTimeout: 0,
|
2024-11-21 17:34:08 +08:00
|
|
|
SettlementMode: amqp.ReceiverSettleModeFirst.Ptr(),
|
2025-01-22 16:56:23 +08:00
|
|
|
RequestedSenderSettleMode: receiverSettleMode,
|
2024-11-21 17:34:08 +08:00
|
|
|
ExpiryPolicy: amqp.ExpiryPolicyLinkDetach,
|
2025-02-13 19:04:35 +08:00
|
|
|
Credit: getInitialCredits(options),
|
|
|
|
|
Filters: getLinkFilters(options),
|
2024-11-21 17:34:08 +08:00
|
|
|
}
|
2025-02-13 19:04:35 +08:00
|
|
|
return result
|
2024-11-21 17:34:08 +08:00
|
|
|
}
|
2025-01-16 22:26:12 +08:00
|
|
|
|
|
|
|
|
func random(max int) int {
|
|
|
|
|
r := rand.New(rand.NewSource(time.Now().Unix()))
|
|
|
|
|
return r.Intn(max)
|
|
|
|
|
}
|
2025-01-22 16:56:23 +08:00
|
|
|
|
|
|
|
|
func validateMessageAnnotations(annotations amqp.Annotations) error {
|
2025-02-24 22:04:19 +08:00
|
|
|
for k := range annotations {
|
2025-01-22 16:56:23 +08:00
|
|
|
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
|
|
|
|
|
}
|