Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Azure Service Bus library for Rust. Send and receive messages using queues, topics, and subscriptions. Triggers: "service bus rust", "ServiceBusClient rust", "send message servicebus rust", "receive message servicebus rust", "queue rust messaging", "topic subscription rust".
.claude/skills/sickn33-azure-servicebus-rust/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 25% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 12% | 0% |
Use this skill when you need azure Service Bus library for Rust. Send and receive messages using queues, topics, and subscriptions. Triggers: "service bus rust", "ServiceBusClient rust", "send message servicebus rust", "receive message servicebus rust", "queue rust messaging", "topic subscription rust".
Client library for Azure Service Bus — enterprise message broker with queues and publish-subscribe topics.
> ⚠️ WARNING: This crate is in early development and SHOULD NOT be used in production. APIs may change without notice.
Use this skill when:
> IMPORTANT: Only use the official azure_messaging_servicebus crate published by the azure-sdk crates.io user. Do NOT use unofficial or community crates. Official crates use underscores in names and none have version 0.21.0.
shcargo add azure_messaging_servicebus azure_identity tokio
> If your code uses azure_core types directly, add azure_core to Cargo.toml. If you only use azure_messaging_servicebus re-exports, direct azure_core dependency is optional.
bashSERVICEBUS_NAMESPACE=<namespace>.servicebus.windows.net # Required — fully qualified namespace
| Concept | Description | | ---------------- | --------------------------------------------------------------- | | Namespace | Container for all messaging components | | Queue | Point-to-point messaging with competing consumers | | Topic | Publish-subscribe messaging — one sender, many subscribers | | Subscription | Receives messages from a topic | | Message | Package of data and metadata, with completion/abandon semantics |
rustuse azure_identity::DeveloperToolsCredential; use azure_messaging_servicebus::ServiceBusClient; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // Local dev: DeveloperToolsCredential. Production: use ManagedIdentityCredential. let credential = DeveloperToolsCredential::new(None)?; let client = ServiceBusClient::builder() .open("your_namespace.servicebus.windows.net", credential.clone()) .await?; Ok(()) }
rustuse azure_identity::DeveloperToolsCredential; use azure_messaging_servicebus::{ServiceBusClient, Message}; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let credential = DeveloperToolsCredential::new(None)?; let client = ServiceBusClient::builder() .open("your_namespace.servicebus.windows.net", credential.clone()) .await?; let sender = client.create_sender("my_queue", None).await?; let message = Message::from("Hello, Service Bus!"); sender.send_message(message, None).await?; Ok(()) }
rustuse azure_identity::DeveloperToolsCredential; use azure_messaging_servicebus::ServiceBusClient; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let credential = DeveloperToolsCredential::new(None)?; let client = ServiceBusClient::builder() .open("your_namespace.servicebus.windows.net", credential.clone()) .await?; let receiver = client.create_receiver("my_queue", None).await?; let messages = receiver.receive_messages(5, None).await?; for message in messages { println!("Received: {}", message.body_as_string()?); receiver.complete_message(&message, None).await?; } Ok(()) }
rustlet sender = client.create_sender("my_topic", None).await?; let message = Message::from("Hello, Topic subscribers!"); sender.send_message(message, None).await?;
rustlet receiver = client .create_receiver_for_subscription("my_topic", "my_subscription", None) .await?; let messages = receiver.receive_messages(5, None).await?; for message in messages { println!("Received: {}", message.body_as_string()?); receiver.complete_message(&message, None).await?; }
| Action | Purpose | | ---------- | -------------------------------------------------- | | complete | Remove message from queue — processing succeeded | | abandon | Release lock — message becomes available for retry |
Always complete messages after successful processing to prevent redelivery.
For Entra ID auth, assign one of these roles:
| Role | Access | | --------------------------------- | ---------------- | | Azure Service Bus Data Sender | Send messages | | Azure Service Bus Data Receiver | Receive messages | | Azure Service Bus Data Owner | Full access |
cargo add to manage dependencies, never edit Cargo.toml directly. Add and remove Rust SDK dependencies with cargo commands instead of manual manifest edits.azure_core only when importing azure_core types directly. If your code imports azure_core::http::Url, azure_core::http::RequestContent, or azure_core::error::ErrorKind, include azure_core; otherwise a direct dependency is optional.DeveloperToolsCredential for local dev, ManagedIdentityCredential for production — Rust does not provide a single DefaultAzureCredential typecomplete_message after processing to remove from queue| Resource | Link | | ------------- | ----------------------------------------------------------------------------------------------- | | API Reference | https://docs.rs/azure_messaging_servicebus/latest/azure_messaging_servicebus | | crates.io | https://crates.io/crates/azure_messaging_servicebus | | Source Code | https://github.com/Azure/azure-sdk-for-rust/tree/main/sdk/servicebus/azure_messaging_servicebus |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 14,823 | 6,163 | -58% | 1 | 1 | 0% | 3,628 | 3,205 | -12% | 0 | 0 | — |
case-02 | fail→pass | 13,488 | 8,717 | -35% | 1 | 1 | 0% | 2,821 | 3,676 | +30% | 0 | 0 | — |
case-03 | fail→pass | 9,708 | 5,714 | -41% | 1 | 1 | 0% | 2,026 | 2,941 | +45% | 0 | 0 | — |
case-04 | pass→pass | 7,027 | 3,641 | -48% | 1 | 1 | 0% | 1,255 | 2,460 | +96% | 0 | 0 | — |
case-05 | fail→pass | 11,724 | 4,382 | -63% | 1 | 1 | 0% | 2,100 | 2,616 | +25% | 0 | 0 | — |
case-06 | fail→pass | 8,514 | 2,450 | -71% | 1 | 1 | 0% | 1,925 | 2,149 | +12% | 0 | 0 | — |
case-07 | pass→pass | 14,749 | 5,621 | -62% | 1 | 1 | 0% | 2,589 | 2,715 | +5% | 0 | 0 | — |
case-08 | fail→pass | 9,640 | 5,054 | -48% | 1 | 1 | 0% | 1,934 | 2,733 | +41% | 0 | 0 | — |
case-09 | fail→fail | 10,103 | 4,429 | -56% | 1 | 1 | 0% | 1,901 | 2,594 | +36% | 0 | 0 | — |
case-10 | pass→pass | 9,877 | 4,977 | -50% | 1 | 1 | 0% | 1,818 | 2,685 | +48% | 0 | 0 | — |
case-11 | fail→pass | 11,175 | 4,999 | -55% | 1 | 1 | 0% | 2,400 | 2,780 | +16% | 0 | 0 | — |
case-12 | pass→pass | 10,443 | 4,553 | -56% | 1 | 1 | 0% | 2,042 | 2,531 | +24% | 0 | 0 | — |
case-13 | pass→pass | 8,947 | 3,643 | -59% | 1 | 1 | 0% | 1,851 | 2,420 | +31% | 0 | 0 | — |
case-14 | pass→pass | 7,959 | 5,550 | -30% | 1 | 1 | 0% | 1,714 | 2,954 | +72% | 0 | 0 | — |
case-15 | pass→pass | 11,808 | 6,466 | -45% | 1 | 1 | 0% | 2,000 | 3,016 | +51% | 0 | 0 | — |
case-16 | pass→pass | 11,865 | 7,635 | -36% | 1 | 1 | 0% | 2,365 | 3,335 | +41% | 0 | 0 | — |
case-17 | fail→fail | 15,201 | 3,637 | -76% | 1 | 1 | 0% | 2,351 | 2,291 | -3% | 0 | 0 | — |
case-18 | pass→pass | 9,774 | 2,860 | -71% | 1 | 1 | 0% | 2,123 | 2,248 | +6% | 0 | 0 | — |
case-19 | pass→pass | 12,767 | 9,249 | -28% | 1 | 1 | 0% | 2,125 | 3,365 | +58% | 0 | 0 | — |
case-20 | pass→pass | 10,246 | 3,591 | -65% | 1 | 1 | 0% | 2,141 | 2,448 | +14% | 0 | 0 | — |
case-21 | pass→fail | 3,815 | 2,324 | -39% | 1 | 1 | 0% | 672 | 1,990 | +196% | 0 | 0 | — |
case-22 | pass→pass | 10,833 | 7,929 | -27% | 1 | 1 | 0% | 2,129 | 3,270 | +54% | 0 | 0 | — |
case-23 | pass→pass | 14,859 | 9,919 | -33% | 1 | 1 | 0% | 3,330 | 3,738 | +12% | 0 | 0 | — |
case-24 | pass→pass | 13,867 | 7,485 | -46% | 1 | 1 | 0% | 2,825 | 3,124 | +11% | 0 | 0 | — |
case-25 | pass→pass | 14,066 | 11,079 | -21% | 1 | 1 | 0% | 2,991 | 4,069 | +36% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +24 percentage points is the difference between those two pass rates over the 25 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.