{"id":"69fdf66f-d9ce-4359-a588-a598186ca1d3","shortId":"yREtXt","kind":"skill","title":"azure-messaging-webpubsub-java","tagline":"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.","description":"# Azure Web PubSub SDK for Java\n\nBuild real-time web applications using the Azure Web PubSub SDK for Java.\n\n## Installation\n\n```xml\n<dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-messaging-webpubsub</artifactId>\n    <version>1.5.0</version>\n</dependency>\n```\n\n## Client Creation\n\n### With Connection String\n\n```java\nimport com.azure.messaging.webpubsub.WebPubSubServiceClient;\nimport com.azure.messaging.webpubsub.WebPubSubServiceClientBuilder;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .connectionString(\"<connection-string>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### With Access Key\n\n```java\nimport com.azure.core.credential.AzureKeyCredential;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .credential(new AzureKeyCredential(\"<access-key>\"))\n    .endpoint(\"<endpoint>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### With DefaultAzureCredential\n\n```java\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .endpoint(\"<endpoint>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### Async Client\n\n```java\nimport com.azure.messaging.webpubsub.WebPubSubServiceAsyncClient;\n\nWebPubSubServiceAsyncClient asyncClient = new WebPubSubServiceClientBuilder()\n    .connectionString(\"<connection-string>\")\n    .hub(\"chat\")\n    .buildAsyncClient();\n```\n\n## Key Concepts\n\n- **Hub**: Logical isolation unit for connections\n- **Group**: Subset of connections within a hub\n- **Connection**: Individual WebSocket client connection\n- **User**: Entity that can have multiple connections\n\n## Core Patterns\n\n### Send to All Connections\n\n```java\nimport com.azure.messaging.webpubsub.models.WebPubSubContentType;\n\n// Send text message\nclient.sendToAll(\"Hello everyone!\", WebPubSubContentType.TEXT_PLAIN);\n\n// Send JSON\nString jsonMessage = \"{\\\"type\\\": \\\"notification\\\", \\\"message\\\": \\\"New update!\\\"}\";\nclient.sendToAll(jsonMessage, WebPubSubContentType.APPLICATION_JSON);\n```\n\n### Send to All with Filter\n\n```java\nimport com.azure.core.http.rest.RequestOptions;\nimport com.azure.core.util.BinaryData;\n\nBinaryData message = BinaryData.fromString(\"Hello filtered users!\");\n\n// Filter by userId\nclient.sendToAllWithResponse(\n    message,\n    WebPubSubContentType.TEXT_PLAIN,\n    message.getLength(),\n    new RequestOptions().addQueryParam(\"filter\", \"userId ne 'user1'\"));\n\n// Filter by groups\nclient.sendToAllWithResponse(\n    message,\n    WebPubSubContentType.TEXT_PLAIN,\n    message.getLength(),\n    new RequestOptions().addQueryParam(\"filter\", \"'GroupA' in groups and not('GroupB' in groups)\"));\n```\n\n### Send to Group\n\n```java\n// Send to all connections in a group\nclient.sendToGroup(\"java-developers\", \"Hello Java devs!\", WebPubSubContentType.TEXT_PLAIN);\n\n// Send JSON to group\nString json = \"{\\\"event\\\": \\\"update\\\", \\\"data\\\": {\\\"version\\\": \\\"2.0\\\"}}\";\nclient.sendToGroup(\"subscribers\", json, WebPubSubContentType.APPLICATION_JSON);\n```\n\n### Send to Specific Connection\n\n```java\n// Send to a specific connection by ID\nclient.sendToConnection(\"connectionId123\", \"Private message\", WebPubSubContentType.TEXT_PLAIN);\n```\n\n### Send to User\n\n```java\n// Send to all connections for a specific user\nclient.sendToUser(\"andy\", \"Hello Andy!\", WebPubSubContentType.TEXT_PLAIN);\n```\n\n### Manage Groups\n\n```java\n// Add connection to group\nclient.addConnectionToGroup(\"premium-users\", \"connectionId123\");\n\n// Remove connection from group\nclient.removeConnectionFromGroup(\"premium-users\", \"connectionId123\");\n\n// Add user to group (all their connections)\nclient.addUserToGroup(\"admin-group\", \"userId456\");\n\n// Remove user from group\nclient.removeUserFromGroup(\"admin-group\", \"userId456\");\n\n// Check if user is in group\nboolean exists = client.userExistsInGroup(\"admin-group\", \"userId456\");\n```\n\n### Manage Connections\n\n```java\n// Check if connection exists\nboolean connected = client.connectionExists(\"connectionId123\");\n\n// Close a connection\nclient.closeConnection(\"connectionId123\");\n\n// Close with reason\nclient.closeConnection(\"connectionId123\", \"Session expired\");\n\n// Check if user exists (has any connections)\nboolean userOnline = client.userExists(\"userId456\");\n\n// Close all connections for a user\nclient.closeUserConnections(\"userId456\");\n\n// Close all connections in a group\nclient.closeGroupConnections(\"inactive-group\");\n```\n\n### Generate Client Access Token\n\n```java\nimport com.azure.messaging.webpubsub.models.GetClientAccessTokenOptions;\nimport com.azure.messaging.webpubsub.models.WebPubSubClientAccessToken;\n\n// Basic token\nWebPubSubClientAccessToken token = client.getClientAccessToken(\n    new GetClientAccessTokenOptions());\nSystem.out.println(\"URL: \" + token.getUrl());\n\n// With user ID\nWebPubSubClientAccessToken userToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions().setUserId(\"user123\"));\n\n// With roles (permissions)\nWebPubSubClientAccessToken roleToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .addRole(\"webpubsub.joinLeaveGroup\")\n        .addRole(\"webpubsub.sendToGroup\"));\n\n// With groups to join on connect\nWebPubSubClientAccessToken groupToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .addGroup(\"announcements\")\n        .addGroup(\"updates\"));\n\n// With custom expiration\nWebPubSubClientAccessToken expToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .setExpiresAfter(Duration.ofHours(2)));\n```\n\n### Grant/Revoke Permissions\n\n```java\nimport com.azure.messaging.webpubsub.models.WebPubSubPermission;\n\n// Grant permission to send to a group\nclient.grantPermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n\n// Revoke permission\nclient.revokePermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n\n// Check permission\nboolean hasPermission = client.checkPermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n```\n\n### Async Operations\n\n```java\nasyncClient.sendToAll(\"Async message!\", WebPubSubContentType.TEXT_PLAIN)\n    .subscribe(\n        unused -> System.out.println(\"Message sent\"),\n        error -> System.err.println(\"Error: \" + error.getMessage())\n    );\n\nasyncClient.sendToGroup(\"developers\", \"Group message\", WebPubSubContentType.TEXT_PLAIN)\n    .doOnSuccess(v -> System.out.println(\"Sent to group\"))\n    .doOnError(e -> System.err.println(\"Failed: \" + e))\n    .subscribe();\n```\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\n\ntry {\n    client.sendToConnection(\"invalid-id\", \"test\", WebPubSubContentType.TEXT_PLAIN);\n} catch (HttpResponseException e) {\n    System.out.println(\"Status: \" + e.getResponse().getStatusCode());\n    System.out.println(\"Error: \" + e.getMessage());\n}\n```\n\n## Environment Variables\n\n```bash\nWEB_PUBSUB_CONNECTION_STRING=Endpoint=https://<resource>.webpubsub.azure.com;AccessKey=...\nWEB_PUBSUB_ENDPOINT=https://<resource>.webpubsub.azure.com\nWEB_PUBSUB_ACCESS_KEY=<your-access-key>\n```\n\n## Client Roles\n\n| Role | Permission |\n|------|------------|\n| `webpubsub.joinLeaveGroup` | Join/leave any group |\n| `webpubsub.sendToGroup` | Send to any group |\n| `webpubsub.joinLeaveGroup.<group>` | Join/leave specific group |\n| `webpubsub.sendToGroup.<group>` | Send to specific group |\n\n## Best Practices\n\n1. **Use Groups**: Organize connections into groups for targeted messaging\n2. **User IDs**: Associate connections with user IDs for user-level messaging\n3. **Token Expiration**: Set appropriate token expiration for security\n4. **Roles**: Grant minimal required permissions via roles\n5. **Hub Isolation**: Use separate hubs for different application features\n6. **Connection Management**: Clean up inactive connections\n\n## Trigger Phrases\n\n- \"Web PubSub Java\"\n- \"WebSocket messaging Azure\"\n- \"real-time push notifications\"\n- \"server-sent events\"\n- \"chat application backend\"\n- \"live updates broadcasting\"\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["azure","messaging","webpubsub","java","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents"],"capabilities":["skill","source-sickn33","skill-azure-messaging-webpubsub-java","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-messaging-webpubsub-java","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34928 github stars · SKILL.md body (8,685 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T18:50:31.537Z","embedding":null,"createdAt":"2026-04-18T21:32:38.843Z","updatedAt":"2026-04-24T18:50:31.537Z","lastSeenAt":"2026-04-24T18:50:31.537Z","tsv":"'1':644 '1.5.0':64 '2':489,654 '2.0':268 '3':667 '4':676 '5':684 '6':694 'access':84,419,618 'accesskey':611 'action':736 'add':313,331 'addgroup':473,475 'addqueryparam':213,228,509,523,539 'addrol':456,458 'admin':340,349,362 'admin-group':339,348,361 'andi':305,307 'announc':474 'applic':11,29,48,692,719,730 'appropri':671 'ask':774 'associ':657 'async':117,544,548 'asynccli':123 'asyncclient.sendtoall':547 'asyncclient.sendtogroup':561 'azur':2,13,37,51,61,708 'azure-messaging-webpubsub':60 'azure-messaging-webpubsub-java':1 'azurekeycredenti':95 'backend':720 'base':24 'bash':604 'basic':426 'best':642 'binarydata':197 'binarydata.fromstring':199 'boolean':358,372,395,530 'boundari':782 'broadcast':723 'build':6,43,112 'buildasynccli':129 'buildclient':82,99,116 'catch':592 'chat':28,81,98,115,128,512,526,542,718 'chat-room':511,525,541 'check':352,368,388,528 'clarif':776 'clean':697 'clear':749 'client':34,65,76,90,106,118,148,418,620 'client.addconnectiontogroup':317 'client.addusertogroup':338 'client.checkpermission':532 'client.closeconnection':379,384 'client.closegroupconnections':413 'client.closeuserconnections':405 'client.connectionexists':374 'client.getclientaccesstoken':430,441,451,468,482 'client.grantpermission':502 'client.removeconnectionfromgroup':326 'client.removeuserfromgroup':347 'client.revokepermission':516 'client.sendtoall':169,183 'client.sendtoallwithresponse':206,221 'client.sendtoconnection':286,585 'client.sendtogroup':249,269 'client.sendtouser':304 'client.userexists':397 'client.userexistsingroup':360 'close':376,381,399,407 'com.azure':59 'com.azure.core.credential.azurekeycredential':88 'com.azure.core.exception.httpresponseexception':583 'com.azure.core.http.rest.requestoptions':194 'com.azure.core.util.binarydata':196 'com.azure.identity.defaultazurecredentialbuilder':104 'com.azure.messaging.webpubsub.models.getclientaccesstokenoptions':423 'com.azure.messaging.webpubsub.models.webpubsubclientaccesstoken':425 'com.azure.messaging.webpubsub.models.webpubsubcontenttype':165 'com.azure.messaging.webpubsub.models.webpubsubpermission':494 'com.azure.messaging.webpubsub.webpubsubserviceasyncclient':121 'com.azure.messaging.webpubsub.webpubsubserviceclient':72 'com.azure.messaging.webpubsub.webpubsubserviceclientbuilder':74 'concept':131 'connect':68,137,141,145,149,156,162,245,277,283,299,314,323,337,366,370,373,378,394,401,409,465,607,648,658,695,700 'connectionid123':287,321,330,375,380,385,506,520,536 'connectionstr':79,126 'core':157 'creation':66 'credenti':93,109 'criteria':785 'custom':478 'data':266 'defaultazurecredenti':101 'defaultazurecredentialbuild':111 'describ':737,753 'dev':255 'develop':252,562 'differ':691 'doonerror':573 'doonsuccess':567 'duration.ofhours':488 'e':574,577,594 'e.getmessage':601 'e.getresponse':597 'endpoint':96,113,609,614 'entiti':151 'environ':602,765 'environment-specif':764 'error':557,559,579,600 'error.getmessage':560 'event':264,717 'everyon':171 'execut':732 'exist':359,371,391 'expert':770 'expir':387,479,669,673 'exptoken':481 'fail':576 'featur':693 'filter':191,201,203,214,218,229 'generat':417 'getclientaccesstokenopt':432,443,453,470,484 'getstatuscod':598 'grant':495,678 'grant/revoke':490 'group':138,220,232,237,240,248,261,311,316,325,334,341,346,350,357,363,412,416,461,501,505,519,535,563,572,627,632,636,641,646,650 'groupa':230 'groupb':235 'grouptoken':467 'handl':580 'haspermiss':531 'hello':170,200,253,306 'httpresponseexcept':593 'hub':80,97,114,127,132,144,685,689 'id':285,438,588,656,661 'implement':21 'import':71,73,87,103,120,164,193,195,422,424,493,582 'inact':415,699 'inactive-group':414 'individu':146 'input':779 'instal':57 'invalid':587 'invalid-id':586 'isol':134,686 'java':5,18,42,56,70,86,102,119,163,192,241,251,254,278,295,312,367,421,492,546,581,705 'java-develop':250 'join':463 'join/leave':625,634 'json':175,186,259,263,271,273 'jsonmessag':177,184 'key':85,130,619 'level':665 'limit':741 'live':26,721 'logic':133 'manag':310,365,696 'match':750 'messag':3,25,62,168,180,198,207,222,289,549,555,564,653,666,707 'message.getlength':210,225 'minim':679 'miss':787 'multipl':155 'ne':216 'new':77,91,94,107,110,124,181,211,226,431,442,452,469,483,507,521,537 'notif':36,179,713 'oper':545 'organ':647 'output':759 'overview':740 'pattern':158 'permiss':448,491,496,515,529,623,681,780 'phrase':702 'plain':173,209,224,257,291,309,551,566,591 'practic':643 'premium':319,328 'premium-us':318,327 'privat':288 'pubsub':15,39,53,606,613,617,704 'push':35,712 'real':8,45,710 'real-tim':7,44,709 'reason':383 'remov':322,343 'requestopt':212,227,508,522,538 'requir':680,778 'review':771 'revok':514 'role':447,621,622,677,683 'roletoken':450 'room':513,527,543 'safeti':781 'scope':752 'sdk':16,40,54 'secur':675 'send':159,166,174,187,238,242,258,274,279,292,296,498,629,638 'sent':556,570,716 'separ':688 'server':32,715 'server-s':714 'server-to-cli':31 'session':386 'set':670 'setexpiresaft':487 'setuserid':444,454,471,485 'skill':728,744 'skill-azure-messaging-webpubsub-java' 'source-sickn33' 'specif':276,282,302,635,640,766 'status':596 'stop':772 'string':69,176,262,608 'subscrib':270,552,578 'subset':139 'substitut':762 'success':784 'system.err.println':558,575 'system.out.println':433,554,569,595,599 'target':652 'targetnam':510,524,540 'task':748 'test':589,768 'text':167 'time':9,46,711 'token':420,427,429,668,672 'token.geturl':435 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':757 'tri':584 'trigger':701 'type':178 'unit':135 'unus':553 'updat':27,182,265,476,722 'url':434 'use':19,49,645,687,726,742 'user':150,202,294,303,320,329,332,344,354,390,404,437,655,660,664 'user-level':663 'user1':217 'user123':445,455,472,486 'userid':205,215 'userid456':342,351,364,398,406 'useronlin':396 'usertoken':440 'v':568 'valid':767 'variabl':603 'version':267 'via':682 'web':10,14,38,47,52,605,612,616,703 'webpubsub':4,63 'webpubsub.azure.com':610,615 'webpubsub.joinleavegroup':457,624,633 'webpubsub.sendtogroup':459,628,637 'webpubsubclientaccesstoken':428,439,449,466,480 'webpubsubcontenttype.application':185,272 'webpubsubcontenttype.text':172,208,223,256,290,308,550,565,590 'webpubsubpermission.send':503,517,533 'webpubsubserviceasynccli':122 'webpubsubservicecli':75,89,105 'webpubsubserviceclientbuild':78,92,108,125 'websocket':23,147,706 'websocket-bas':22 'within':142 'workflow':734 'xml':58","prices":[{"id":"9bd9aeab-599c-466f-bf9e-cbec198eeb6f","listingId":"69fdf66f-d9ce-4359-a588-a598186ca1d3","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:32:38.843Z"}],"sources":[{"listingId":"69fdf66f-d9ce-4359-a588-a598186ca1d3","source":"github","sourceId":"sickn33/antigravity-awesome-skills/azure-messaging-webpubsub-java","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-messaging-webpubsub-java","isPrimary":false,"firstSeenAt":"2026-04-18T21:32:38.843Z","lastSeenAt":"2026-04-24T18:50:31.537Z"}],"details":{"listingId":"69fdf66f-d9ce-4359-a588-a598186ca1d3","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"azure-messaging-webpubsub-java","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34928,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"b31bdc761e10e88209c542a6473ce34690e8412e","skill_md_path":"skills/azure-messaging-webpubsub-java/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-messaging-webpubsub-java"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"azure-messaging-webpubsub-java","description":"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."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-messaging-webpubsub-java"},"updatedAt":"2026-04-24T18:50:31.537Z"}}