Build real-time web applications with Azure Web PubSub SDK for Java. Use when implementing WebSocket-based messaging, live updates, chat applications, or server-to-client push notifications.
Add this skill
npx mdskills install sickn33/azure-messaging-webpubsub-javaComprehensive Java SDK reference with excellent code examples but lacks agent execution context
1---2name: azure-messaging-webpubsub-java3description: Build real-time web applications with Azure Web PubSub SDK for Java. Use when implementing WebSocket-based messaging, live updates, chat applications, or server-to-client push notifications.4package: com.azure:azure-messaging-webpubsub5---67# Azure Web PubSub SDK for Java89Build real-time web applications using the Azure Web PubSub SDK for Java.1011## Installation1213```xml14<dependency>15 <groupId>com.azure</groupId>16 <artifactId>azure-messaging-webpubsub</artifactId>17 <version>1.5.0</version>18</dependency>19```2021## Client Creation2223### With Connection String2425```java26import com.azure.messaging.webpubsub.WebPubSubServiceClient;27import com.azure.messaging.webpubsub.WebPubSubServiceClientBuilder;2829WebPubSubServiceClient client = new WebPubSubServiceClientBuilder()30 .connectionString("<connection-string>")31 .hub("chat")32 .buildClient();33```3435### With Access Key3637```java38import com.azure.core.credential.AzureKeyCredential;3940WebPubSubServiceClient client = new WebPubSubServiceClientBuilder()41 .credential(new AzureKeyCredential("<access-key>"))42 .endpoint("<endpoint>")43 .hub("chat")44 .buildClient();45```4647### With DefaultAzureCredential4849```java50import com.azure.identity.DefaultAzureCredentialBuilder;5152WebPubSubServiceClient client = new WebPubSubServiceClientBuilder()53 .credential(new DefaultAzureCredentialBuilder().build())54 .endpoint("<endpoint>")55 .hub("chat")56 .buildClient();57```5859### Async Client6061```java62import com.azure.messaging.webpubsub.WebPubSubServiceAsyncClient;6364WebPubSubServiceAsyncClient asyncClient = new WebPubSubServiceClientBuilder()65 .connectionString("<connection-string>")66 .hub("chat")67 .buildAsyncClient();68```6970## Key Concepts7172- **Hub**: Logical isolation unit for connections73- **Group**: Subset of connections within a hub74- **Connection**: Individual WebSocket client connection75- **User**: Entity that can have multiple connections7677## Core Patterns7879### Send to All Connections8081```java82import com.azure.messaging.webpubsub.models.WebPubSubContentType;8384// Send text message85client.sendToAll("Hello everyone!", WebPubSubContentType.TEXT_PLAIN);8687// Send JSON88String jsonMessage = "{\"type\": \"notification\", \"message\": \"New update!\"}";89client.sendToAll(jsonMessage, WebPubSubContentType.APPLICATION_JSON);90```9192### Send to All with Filter9394```java95import com.azure.core.http.rest.RequestOptions;96import com.azure.core.util.BinaryData;9798BinaryData message = BinaryData.fromString("Hello filtered users!");99100// Filter by userId101client.sendToAllWithResponse(102 message,103 WebPubSubContentType.TEXT_PLAIN,104 message.getLength(),105 new RequestOptions().addQueryParam("filter", "userId ne 'user1'"));106107// Filter by groups108client.sendToAllWithResponse(109 message,110 WebPubSubContentType.TEXT_PLAIN,111 message.getLength(),112 new RequestOptions().addQueryParam("filter", "'GroupA' in groups and not('GroupB' in groups)"));113```114115### Send to Group116117```java118// Send to all connections in a group119client.sendToGroup("java-developers", "Hello Java devs!", WebPubSubContentType.TEXT_PLAIN);120121// Send JSON to group122String json = "{\"event\": \"update\", \"data\": {\"version\": \"2.0\"}}";123client.sendToGroup("subscribers", json, WebPubSubContentType.APPLICATION_JSON);124```125126### Send to Specific Connection127128```java129// Send to a specific connection by ID130client.sendToConnection("connectionId123", "Private message", WebPubSubContentType.TEXT_PLAIN);131```132133### Send to User134135```java136// Send to all connections for a specific user137client.sendToUser("andy", "Hello Andy!", WebPubSubContentType.TEXT_PLAIN);138```139140### Manage Groups141142```java143// Add connection to group144client.addConnectionToGroup("premium-users", "connectionId123");145146// Remove connection from group147client.removeConnectionFromGroup("premium-users", "connectionId123");148149// Add user to group (all their connections)150client.addUserToGroup("admin-group", "userId456");151152// Remove user from group153client.removeUserFromGroup("admin-group", "userId456");154155// Check if user is in group156boolean exists = client.userExistsInGroup("admin-group", "userId456");157```158159### Manage Connections160161```java162// Check if connection exists163boolean connected = client.connectionExists("connectionId123");164165// Close a connection166client.closeConnection("connectionId123");167168// Close with reason169client.closeConnection("connectionId123", "Session expired");170171// Check if user exists (has any connections)172boolean userOnline = client.userExists("userId456");173174// Close all connections for a user175client.closeUserConnections("userId456");176177// Close all connections in a group178client.closeGroupConnections("inactive-group");179```180181### Generate Client Access Token182183```java184import com.azure.messaging.webpubsub.models.GetClientAccessTokenOptions;185import com.azure.messaging.webpubsub.models.WebPubSubClientAccessToken;186187// Basic token188WebPubSubClientAccessToken token = client.getClientAccessToken(189 new GetClientAccessTokenOptions());190System.out.println("URL: " + token.getUrl());191192// With user ID193WebPubSubClientAccessToken userToken = client.getClientAccessToken(194 new GetClientAccessTokenOptions().setUserId("user123"));195196// With roles (permissions)197WebPubSubClientAccessToken roleToken = client.getClientAccessToken(198 new GetClientAccessTokenOptions()199 .setUserId("user123")200 .addRole("webpubsub.joinLeaveGroup")201 .addRole("webpubsub.sendToGroup"));202203// With groups to join on connect204WebPubSubClientAccessToken groupToken = client.getClientAccessToken(205 new GetClientAccessTokenOptions()206 .setUserId("user123")207 .addGroup("announcements")208 .addGroup("updates"));209210// With custom expiration211WebPubSubClientAccessToken expToken = client.getClientAccessToken(212 new GetClientAccessTokenOptions()213 .setUserId("user123")214 .setExpiresAfter(Duration.ofHours(2)));215```216217### Grant/Revoke Permissions218219```java220import com.azure.messaging.webpubsub.models.WebPubSubPermission;221222// Grant permission to send to a group223client.grantPermission(224 WebPubSubPermission.SEND_TO_GROUP,225 "connectionId123",226 new RequestOptions().addQueryParam("targetName", "chat-room"));227228// Revoke permission229client.revokePermission(230 WebPubSubPermission.SEND_TO_GROUP,231 "connectionId123",232 new RequestOptions().addQueryParam("targetName", "chat-room"));233234// Check permission235boolean hasPermission = client.checkPermission(236 WebPubSubPermission.SEND_TO_GROUP,237 "connectionId123",238 new RequestOptions().addQueryParam("targetName", "chat-room"));239```240241### Async Operations242243```java244asyncClient.sendToAll("Async message!", WebPubSubContentType.TEXT_PLAIN)245 .subscribe(246 unused -> System.out.println("Message sent"),247 error -> System.err.println("Error: " + error.getMessage())248 );249250asyncClient.sendToGroup("developers", "Group message", WebPubSubContentType.TEXT_PLAIN)251 .doOnSuccess(v -> System.out.println("Sent to group"))252 .doOnError(e -> System.err.println("Failed: " + e))253 .subscribe();254```255256## Error Handling257258```java259import com.azure.core.exception.HttpResponseException;260261try {262 client.sendToConnection("invalid-id", "test", WebPubSubContentType.TEXT_PLAIN);263} catch (HttpResponseException e) {264 System.out.println("Status: " + e.getResponse().getStatusCode());265 System.out.println("Error: " + e.getMessage());266}267```268269## Environment Variables270271```bash272WEB_PUBSUB_CONNECTION_STRING=Endpoint=https://<resource>.webpubsub.azure.com;AccessKey=...273WEB_PUBSUB_ENDPOINT=https://<resource>.webpubsub.azure.com274WEB_PUBSUB_ACCESS_KEY=<your-access-key>275```276277## Client Roles278279| Role | Permission |280|------|------------|281| `webpubsub.joinLeaveGroup` | Join/leave any group |282| `webpubsub.sendToGroup` | Send to any group |283| `webpubsub.joinLeaveGroup.<group>` | Join/leave specific group |284| `webpubsub.sendToGroup.<group>` | Send to specific group |285286## Best Practices2872881. **Use Groups**: Organize connections into groups for targeted messaging2892. **User IDs**: Associate connections with user IDs for user-level messaging2903. **Token Expiration**: Set appropriate token expiration for security2914. **Roles**: Grant minimal required permissions via roles2925. **Hub Isolation**: Use separate hubs for different application features2936. **Connection Management**: Clean up inactive connections294295## Trigger Phrases296297- "Web PubSub Java"298- "WebSocket messaging Azure"299- "real-time push notifications"300- "server-sent events"301- "chat application backend"302- "live updates broadcasting"303
Full transparency — inspect the skill content before installing.