Add bulk operation to set message complete and abandon status
This commit is contained in:
Родитель
7dafc265e8
Коммит
ad141185d5
|
@ -0,0 +1,82 @@
|
||||||
|
package servicebus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/Azure/azure-amqp-common-go/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
// MessageStatus defines an acceptable Message disposition status.
|
||||||
|
MessageStatus dispositionStatus
|
||||||
|
// BatchDispositionIterator provides an iterator over LockTokenIDs
|
||||||
|
BatchDispositionIterator struct {
|
||||||
|
LockTokenIDs []*uuid.UUID
|
||||||
|
Status MessageStatus
|
||||||
|
cursor int
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Complete exposes completedDisposition
|
||||||
|
Complete MessageStatus = MessageStatus(completedDisposition)
|
||||||
|
// Abort exposes abandonedDisposition
|
||||||
|
Abort MessageStatus = MessageStatus(abandonedDisposition)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Done communicates whether there are more messages remaining to be iterated over.
|
||||||
|
func (bdi *BatchDispositionIterator) Done() bool {
|
||||||
|
return len(bdi.LockTokenIDs) == bdi.cursor
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next iterates to the next LockToken
|
||||||
|
func (bdi *BatchDispositionIterator) Next() (uuid *uuid.UUID) {
|
||||||
|
if done := bdi.Done(); done == false {
|
||||||
|
uuid = bdi.LockTokenIDs[bdi.cursor]
|
||||||
|
bdi.cursor++
|
||||||
|
}
|
||||||
|
return uuid
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bdi *BatchDispositionIterator) doUpdate(ctx context.Context, ec entityConnector) error {
|
||||||
|
for !bdi.Done() {
|
||||||
|
if uuid := bdi.Next(); uuid != nil {
|
||||||
|
m := &Message{
|
||||||
|
LockToken: uuid,
|
||||||
|
}
|
||||||
|
m.ec = ec
|
||||||
|
err := m.sendDisposition(ctx, bdi.Status)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendBatchDisposition updates the LockToken id to the desired status.
|
||||||
|
func (q *Queue) SendBatchDisposition(ctx context.Context, iterator BatchDispositionIterator) error {
|
||||||
|
span, ctx := q.startSpanFromContext(ctx, "sb.Queue.SendBatchDisposition")
|
||||||
|
defer span.Finish()
|
||||||
|
return iterator.doUpdate(ctx, q)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendBatchDisposition updates the LockToken id to the desired status.
|
||||||
|
func (s *Subscription) SendBatchDisposition(ctx context.Context, iterator BatchDispositionIterator) error {
|
||||||
|
span, ctx := s.startSpanFromContext(ctx, "sb.Subscription.SendBatchDisposition")
|
||||||
|
defer span.Finish()
|
||||||
|
return iterator.doUpdate(ctx, s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Message) sendDisposition(ctx context.Context, dispositionStatus MessageStatus) (err error) {
|
||||||
|
switch dispositionStatus {
|
||||||
|
case Complete:
|
||||||
|
err = m.Complete(ctx)
|
||||||
|
case Abort:
|
||||||
|
err = m.Abandon(ctx)
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("unsupported bulk disposition status %q", dispositionStatus)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package servicebus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/Azure/azure-amqp-common-go/uuid"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestBatchDispositionIterator(t *testing.T) {
|
||||||
|
count := 20
|
||||||
|
fetched := 0
|
||||||
|
lockIDs := []*uuid.UUID{}
|
||||||
|
|
||||||
|
for i := count; i > 0; i-- {
|
||||||
|
lockIDs = append(lockIDs, &uuid.UUID{})
|
||||||
|
}
|
||||||
|
|
||||||
|
bdi := &BatchDispositionIterator{
|
||||||
|
LockTokenIDs: lockIDs,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, 0, bdi.cursor)
|
||||||
|
|
||||||
|
for !bdi.Done() {
|
||||||
|
if uuid := bdi.Next(); uuid != nil {
|
||||||
|
fetched++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assert.Equal(t, count, fetched)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBatchDispositionUnsupportedStatus(t *testing.T) {
|
||||||
|
status := MessageStatus(suspendedDisposition)
|
||||||
|
id, err := uuid.NewV4()
|
||||||
|
if err != nil {
|
||||||
|
assert.Nil(t, err)
|
||||||
|
}
|
||||||
|
bdi := BatchDispositionIterator{
|
||||||
|
LockTokenIDs: []*uuid.UUID{
|
||||||
|
&id,
|
||||||
|
},
|
||||||
|
Status: status,
|
||||||
|
}
|
||||||
|
|
||||||
|
subscription := Subscription{}
|
||||||
|
err = subscription.SendBatchDisposition(context.Background(), bdi)
|
||||||
|
assert.EqualErrorf(t, err, "unsupported bulk disposition status \"suspended\"", err.Error())
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче