tessl install tessl/golang-github-com-azure-azure-sdk-for-go-sdk-storage-azqueue-v2@2.0.1Azure Queue Storage SDK for Go provides comprehensive client library for interacting with Azure's cloud-based message queue service including queue management, message operations, and multiple authentication methods.
QueueClient represents interaction with a specific Azure Storage queue. It provides queue-level operations including message lifecycle management (enqueue, dequeue, peek, update, delete), queue configuration, metadata management, and access control.
Create QueueClient instances with various authentication methods.
// Create queue client with Azure AD credential
func NewQueueClient(queueURL string, cred azcore.TokenCredential, options *ClientOptions) (*QueueClient, error)
// Create queue client with shared key credential
func NewQueueClientWithSharedKeyCredential(queueURL string, cred *SharedKeyCredential, options *ClientOptions) (*QueueClient, error)
// Create queue client from connection string
func NewQueueClientFromConnectionString(connectionString string, queueName string, options *ClientOptions) (*QueueClient, error)
// Create queue client for anonymous/SAS access
func NewQueueClientWithNoCredential(queueURL string, options *ClientOptions) (*QueueClient, error)Usage Examples:
import (
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue/v2"
)
// Azure AD authentication (recommended)
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
// handle error
}
queueClient, err := azqueue.NewQueueClient(
"https://myaccount.queue.core.windows.net/myqueue",
cred,
nil,
)
// Shared key authentication
sharedKeyCred, err := azqueue.NewSharedKeyCredential("myaccount", "mykey")
if err != nil {
// handle error
}
queueClient, err = azqueue.NewQueueClientWithSharedKeyCredential(
"https://myaccount.queue.core.windows.net/myqueue",
sharedKeyCred,
nil,
)
// Connection string authentication
queueClient, err = azqueue.NewQueueClientFromConnectionString(
"DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey;EndpointSuffix=core.windows.net",
"myqueue",
nil,
)
// No credential (for SAS URLs)
queueClient, err = azqueue.NewQueueClientWithNoCredential(
"https://myaccount.queue.core.windows.net/myqueue?<sas-token>",
nil,
)Retrieve the queue endpoint URL.
func (q *QueueClient) URL() stringUsage:
url := queueClient.URL()
// Returns: "https://myaccount.queue.core.windows.net/myqueue"Create the queue.
func (q *QueueClient) Create(ctx context.Context, options *CreateOptions) (CreateResponse, error)
// Options for queue creation
type CreateOptions struct {
// Optional. User-defined name-value pairs associated with the queue
Metadata map[string]*string
}
// Response type
type CreateResponse = generated.QueueClientCreateResponseUsage:
import "context"
// Create queue without metadata
_, err := queueClient.Create(context.TODO(), nil)
if err != nil {
// handle error
}
// Create queue with metadata
metadata := map[string]*string{
"department": to.Ptr("engineering"),
"owner": to.Ptr("alice@example.com"),
}
_, err = queueClient.Create(context.TODO(), &azqueue.CreateOptions{
Metadata: metadata,
})Notes:
Delete the queue.
func (q *QueueClient) Delete(ctx context.Context, options *DeleteOptions) (DeleteResponse, error)
// Options for queue deletion
type DeleteOptions struct {
// Empty struct - no options currently available
}
// Response type
type DeleteResponse = generated.QueueClientDeleteResponseUsage:
_, err := queueClient.Delete(context.TODO(), nil)
if err != nil {
// handle error
}Retrieve queue properties including metadata and approximate message count.
func (q *QueueClient) GetProperties(ctx context.Context, options *GetQueuePropertiesOptions) (GetQueuePropertiesResponse, error)
// Options for getting properties
type GetQueuePropertiesOptions struct {
// Empty struct - no options currently available
}
// Response type
type GetQueuePropertiesResponse = generated.QueueClientGetPropertiesResponseUsage:
resp, err := queueClient.GetProperties(context.TODO(), nil)
if err != nil {
// handle error
}
fmt.Printf("Approximate message count: %d\n", *resp.ApproximateMessagesCount)
if resp.Metadata != nil {
for key, value := range resp.Metadata {
fmt.Printf("Metadata %s: %s\n", key, *value)
}
}Set user-defined metadata on the queue.
func (q *QueueClient) SetMetadata(ctx context.Context, options *SetMetadataOptions) (SetMetadataResponse, error)
// Options for setting metadata
type SetMetadataOptions struct {
// User-defined metadata name-value pairs
Metadata map[string]*string
}
// Response type
type SetMetadataResponse = generated.QueueClientSetMetadataResponseUsage:
metadata := map[string]*string{
"updated": to.Ptr(time.Now().Format(time.RFC3339)),
"department": to.Ptr("sales"),
}
_, err := queueClient.SetMetadata(context.TODO(), &azqueue.SetMetadataOptions{
Metadata: metadata,
})
if err != nil {
// handle error
}Notes:
Retrieve the queue's access policy.
func (q *QueueClient) GetAccessPolicy(ctx context.Context, o *GetAccessPolicyOptions) (GetAccessPolicyResponse, error)
// Options for getting access policy
type GetAccessPolicyOptions struct {
// Empty struct - no options currently available
}
// Response type
type GetAccessPolicyResponse = generated.QueueClientGetAccessPolicyResponse
// Signed identifier
type SignedIdentifier = generated.SignedIdentifier
// Access policy
type AccessPolicy = generated.AccessPolicyUsage:
resp, err := queueClient.GetAccessPolicy(context.TODO(), nil)
if err != nil {
// handle error
}
for _, policy := range resp.SignedIdentifiers {
fmt.Printf("Policy ID: %s\n", *policy.ID)
if policy.AccessPolicy != nil {
fmt.Printf(" Start: %s\n", policy.AccessPolicy.Start.Format(time.RFC3339))
fmt.Printf(" Expiry: %s\n", policy.AccessPolicy.Expiry.Format(time.RFC3339))
fmt.Printf(" Permission: %s\n", *policy.AccessPolicy.Permission)
}
}Set the queue's access policy with signed identifiers.
func (q *QueueClient) SetAccessPolicy(ctx context.Context, o *SetAccessPolicyOptions) (SetAccessPolicyResponse, error)
// Options for setting access policy
type SetAccessPolicyOptions struct {
// Access control list with signed identifiers
QueueACL []*SignedIdentifier
}
// Response type
type SetAccessPolicyResponse = generated.QueueClientSetAccessPolicyResponseUsage:
import "time"
// Create signed identifier with access policy
signedIdentifier := &azqueue.SignedIdentifier{
ID: to.Ptr("policy1"),
AccessPolicy: &azqueue.AccessPolicy{
Start: to.Ptr(time.Now()),
Expiry: to.Ptr(time.Now().Add(24 * time.Hour)),
Permission: to.Ptr("raup"), // read, add, update, process
},
}
_, err := queueClient.SetAccessPolicy(context.TODO(), &azqueue.SetAccessPolicyOptions{
QueueACL: []*azqueue.SignedIdentifier{signedIdentifier},
})
if err != nil {
// handle error
}Notes:
r (read), a (add), u (update), p (process)Add a message to the queue.
func (q *QueueClient) EnqueueMessage(ctx context.Context, content string, o *EnqueueMessageOptions) (EnqueueMessagesResponse, error)
// Options for enqueuing message
type EnqueueMessageOptions struct {
// Time-to-live in seconds (-1 for infinite, default: 7 days)
TimeToLive *int32
// Initial visibility timeout in seconds (0 to 7 days, default: 0)
VisibilityTimeout *int32
}
// Response type
type EnqueueMessagesResponse = generated.MessagesClientEnqueueResponse
// Enqueued message information
type EnqueuedMessage = generated.EnqueuedMessageUsage:
// Simple enqueue
_, err := queueClient.EnqueueMessage(
context.TODO(),
"Hello, Queue!",
nil,
)
if err != nil {
// handle error
}
// Enqueue with options
resp, err := queueClient.EnqueueMessage(
context.TODO(),
"Delayed message",
&azqueue.EnqueueMessageOptions{
TimeToLive: to.Ptr(int32(3600)), // 1 hour TTL
VisibilityTimeout: to.Ptr(int32(60)), // Visible after 60 seconds
},
)
if err != nil {
// handle error
}
// Access enqueued message info
for _, msg := range resp.Messages {
fmt.Printf("Message ID: %s\n", *msg.MessageID)
fmt.Printf("Pop Receipt: %s\n", *msg.PopReceipt)
fmt.Printf("Insertion Time: %s\n", msg.InsertionTime.Format(time.RFC3339))
fmt.Printf("Expiration Time: %s\n", msg.ExpirationTime.Format(time.RFC3339))
}Notes:
Remove and retrieve one message from the queue.
func (q *QueueClient) DequeueMessage(ctx context.Context, o *DequeueMessageOptions) (DequeueMessagesResponse, error)
// Options for dequeuing single message
type DequeueMessageOptions struct {
// Visibility timeout in seconds (0 to 7 days, default: 30)
VisibilityTimeout *int32
}
// Response type (same as DequeueMessages)
type DequeueMessagesResponse = generated.MessagesClientDequeueResponse
// Dequeued message information
type DequeuedMessage = generated.DequeuedMessageUsage:
// Dequeue single message with default visibility timeout
resp, err := queueClient.DequeueMessage(context.TODO(), nil)
if err != nil {
// handle error
}
if len(resp.Messages) > 0 {
msg := resp.Messages[0]
fmt.Printf("Message: %s\n", *msg.MessageText)
fmt.Printf("Message ID: %s\n", *msg.MessageID)
fmt.Printf("Pop Receipt: %s\n", *msg.PopReceipt)
fmt.Printf("Dequeue Count: %d\n", *msg.DequeueCount)
// Process message...
// Delete after processing
_, err = queueClient.DeleteMessage(
context.TODO(),
*msg.MessageID,
*msg.PopReceipt,
nil,
)
}Remove and retrieve multiple messages from the queue (up to 32).
func (q *QueueClient) DequeueMessages(ctx context.Context, o *DequeueMessagesOptions) (DequeueMessagesResponse, error)
// Options for dequeuing multiple messages
type DequeueMessagesOptions struct {
// Number of messages to retrieve (1 to 32, default: 1)
NumberOfMessages *int32
// Visibility timeout in seconds (1 to 7 days, default: 30)
VisibilityTimeout *int32
}Usage:
// Dequeue up to 10 messages
resp, err := queueClient.DequeueMessages(context.TODO(), &azqueue.DequeueMessagesOptions{
NumberOfMessages: to.Ptr(int32(10)),
VisibilityTimeout: to.Ptr(int32(60)), // 60 seconds
})
if err != nil {
// handle error
}
// Process all dequeued messages
for _, msg := range resp.Messages {
fmt.Printf("Message: %s\n", *msg.MessageText)
// Process message...
// Delete after successful processing
_, err = queueClient.DeleteMessage(
context.TODO(),
*msg.MessageID,
*msg.PopReceipt,
nil,
)
}Notes:
View the first message without removing it from the queue.
func (q *QueueClient) PeekMessage(ctx context.Context, o *PeekMessageOptions) (PeekMessagesResponse, error)
// Options for peeking single message
type PeekMessageOptions struct {
// Empty struct - no options currently available
}
// Response type (same as PeekMessages)
type PeekMessagesResponse = generated.MessagesClientPeekResponse
// Peeked message information
type PeekedMessage = generated.PeekedMessageUsage:
resp, err := queueClient.PeekMessage(context.TODO(), nil)
if err != nil {
// handle error
}
if len(resp.Messages) > 0 {
msg := resp.Messages[0]
fmt.Printf("Message: %s\n", *msg.MessageText)
fmt.Printf("Message ID: %s\n", *msg.MessageID)
fmt.Printf("Dequeue Count: %d\n", *msg.DequeueCount)
}Notes:
View multiple messages without removing them from the queue (up to 32).
func (q *QueueClient) PeekMessages(ctx context.Context, o *PeekMessagesOptions) (PeekMessagesResponse, error)
// Options for peeking multiple messages
type PeekMessagesOptions struct {
// Number of messages to peek (1 to 32)
NumberOfMessages *int32
}Usage:
// Peek at up to 10 messages
resp, err := queueClient.PeekMessages(context.TODO(), &azqueue.PeekMessagesOptions{
NumberOfMessages: to.Ptr(int32(10)),
})
if err != nil {
// handle error
}
for i, msg := range resp.Messages {
fmt.Printf("Message %d: %s\n", i+1, *msg.MessageText)
}Update a message's content and/or visibility timeout.
func (q *QueueClient) UpdateMessage(ctx context.Context, messageID string, popReceipt string, content string, o *UpdateMessageOptions) (UpdateMessageResponse, error)
// Options for updating message
type UpdateMessageOptions struct {
// New visibility timeout in seconds (0 to 7 days)
VisibilityTimeout *int32
}
// Response type
type UpdateMessageResponse = generated.MessageIDClientUpdateResponseUsage:
// First, dequeue a message
deqResp, err := queueClient.DequeueMessage(context.TODO(), nil)
if err != nil {
// handle error
}
if len(deqResp.Messages) > 0 {
msg := deqResp.Messages[0]
// Update message content
updResp, err := queueClient.UpdateMessage(
context.TODO(),
*msg.MessageID,
*msg.PopReceipt,
"Updated content",
nil,
)
if err != nil {
// handle error
}
// Use new PopReceipt for subsequent operations
newPopReceipt := *updResp.PopReceipt
fmt.Printf("New Pop Receipt: %s\n", newPopReceipt)
}Usage (extend visibility timeout):
// Extend visibility timeout to continue processing
updResp, err := queueClient.UpdateMessage(
context.TODO(),
messageID,
popReceipt,
messageText, // Keep same content
&azqueue.UpdateMessageOptions{
VisibilityTimeout: to.Ptr(int32(60)), // Extend by 60 seconds
},
)
if err != nil {
// handle error
}
// Use new PopReceipt
popReceipt = *updResp.PopReceiptNotes:
Delete a message from the queue.
func (q *QueueClient) DeleteMessage(ctx context.Context, messageID string, popReceipt string, o *DeleteMessageOptions) (DeleteMessageResponse, error)
// Options for deleting message
type DeleteMessageOptions struct {
// Empty struct - no options currently available
}
// Response type
type DeleteMessageResponse = generated.MessageIDClientDeleteResponseUsage:
// Dequeue and delete
resp, err := queueClient.DequeueMessage(context.TODO(), nil)
if err != nil {
// handle error
}
if len(resp.Messages) > 0 {
msg := resp.Messages[0]
// Process message...
// Delete message
_, err = queueClient.DeleteMessage(
context.TODO(),
*msg.MessageID,
*msg.PopReceipt,
nil,
)
if err != nil {
// handle error
}
}Notes:
Delete all messages from the queue.
func (q *QueueClient) ClearMessages(ctx context.Context, o *ClearMessagesOptions) (ClearMessagesResponse, error)
// Options for clearing messages
type ClearMessagesOptions struct {
// Empty struct - no options currently available
}
// Response type
type ClearMessagesResponse = generated.MessagesClientClearResponseUsage:
_, err := queueClient.ClearMessages(context.TODO(), nil)
if err != nil {
// handle error
}
fmt.Println("All messages cleared from queue")Notes:
Generate a SAS URL for queue-level access.
func (q *QueueClient) GetSASURL(permissions sas.QueuePermissions, expiry time.Time, o *GetSASURLOptions) (string, error)
// Options for SAS URL generation
type GetSASURLOptions struct {
// Optional start time for SAS validity
StartTime *time.Time
}Usage:
import (
"time"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue/v2/sas"
)
// Define permissions
permissions := sas.QueuePermissions{
Read: true,
Add: true,
Update: true,
Process: true,
}
// Generate SAS URL valid for 1 hour
expiry := time.Now().Add(1 * time.Hour)
sasURL, err := queueClient.GetSASURL(permissions, expiry, nil)
if err != nil {
// handle error
}
fmt.Println(sasURL)
// Use sasURL to create a new client with SAS authenticationNotes:
r (read/peek), a (add), u (update), p (process/dequeue+delete)