Build real-time chat applications with Azure Communication Services Chat Java SDK. Use when implementing chat threads, messaging, participants, read receipts, typing notifications, or real-time chat features.
Add this skill
npx mdskills install sickn33/azure-communication-chat-javaComprehensive Java SDK documentation with detailed examples but lacks agent-specific instructions
1---2name: azure-communication-chat-java3description: Build real-time chat applications with Azure Communication Services Chat Java SDK. Use when implementing chat threads, messaging, participants, read receipts, typing notifications, or real-time chat features.4package: com.azure:azure-communication-chat5---67# Azure Communication Chat (Java)89Build real-time chat applications with thread management, messaging, participants, and read receipts.1011## Installation1213```xml14<dependency>15 <groupId>com.azure</groupId>16 <artifactId>azure-communication-chat</artifactId>17 <version>1.6.0</version>18</dependency>19```2021## Client Creation2223```java24import com.azure.communication.chat.ChatClient;25import com.azure.communication.chat.ChatClientBuilder;26import com.azure.communication.chat.ChatThreadClient;27import com.azure.communication.common.CommunicationTokenCredential;2829// ChatClient requires a CommunicationTokenCredential (user access token)30String endpoint = "https://<resource>.communication.azure.com";31String userAccessToken = "<user-access-token>";3233CommunicationTokenCredential credential = new CommunicationTokenCredential(userAccessToken);3435ChatClient chatClient = new ChatClientBuilder()36 .endpoint(endpoint)37 .credential(credential)38 .buildClient();3940// Async client41ChatAsyncClient chatAsyncClient = new ChatClientBuilder()42 .endpoint(endpoint)43 .credential(credential)44 .buildAsyncClient();45```4647## Key Concepts4849| Class | Purpose |50|-------|---------|51| `ChatClient` | Create/delete chat threads, get thread clients |52| `ChatThreadClient` | Operations within a thread (messages, participants, receipts) |53| `ChatParticipant` | User in a chat thread with display name |54| `ChatMessage` | Message content, type, sender info, timestamps |55| `ChatMessageReadReceipt` | Read receipt tracking per participant |5657## Create Chat Thread5859```java60import com.azure.communication.chat.models.*;61import com.azure.communication.common.CommunicationUserIdentifier;62import java.util.ArrayList;63import java.util.List;6465// Define participants66List<ChatParticipant> participants = new ArrayList<>();6768ChatParticipant participant1 = new ChatParticipant()69 .setCommunicationIdentifier(new CommunicationUserIdentifier("<user-id-1>"))70 .setDisplayName("Alice");7172ChatParticipant participant2 = new ChatParticipant()73 .setCommunicationIdentifier(new CommunicationUserIdentifier("<user-id-2>"))74 .setDisplayName("Bob");7576participants.add(participant1);77participants.add(participant2);7879// Create thread80CreateChatThreadOptions options = new CreateChatThreadOptions("Project Discussion")81 .setParticipants(participants);8283CreateChatThreadResult result = chatClient.createChatThread(options);84String threadId = result.getChatThread().getId();8586// Get thread client for operations87ChatThreadClient threadClient = chatClient.getChatThreadClient(threadId);88```8990## Send Messages9192```java93// Send text message94SendChatMessageOptions messageOptions = new SendChatMessageOptions()95 .setContent("Hello, team!")96 .setSenderDisplayName("Alice")97 .setType(ChatMessageType.TEXT);9899SendChatMessageResult sendResult = threadClient.sendMessage(messageOptions);100String messageId = sendResult.getId();101102// Send HTML message103SendChatMessageOptions htmlOptions = new SendChatMessageOptions()104 .setContent("<strong>Important:</strong> Meeting at 3pm")105 .setType(ChatMessageType.HTML);106107threadClient.sendMessage(htmlOptions);108```109110## Get Messages111112```java113import com.azure.core.util.paging.PagedIterable;114115// List all messages116PagedIterable<ChatMessage> messages = threadClient.listMessages();117118for (ChatMessage message : messages) {119 System.out.println("ID: " + message.getId());120 System.out.println("Type: " + message.getType());121 System.out.println("Content: " + message.getContent().getMessage());122 System.out.println("Sender: " + message.getSenderDisplayName());123 System.out.println("Created: " + message.getCreatedOn());124125 // Check if edited or deleted126 if (message.getEditedOn() != null) {127 System.out.println("Edited: " + message.getEditedOn());128 }129 if (message.getDeletedOn() != null) {130 System.out.println("Deleted: " + message.getDeletedOn());131 }132}133134// Get specific message135ChatMessage message = threadClient.getMessage(messageId);136```137138## Update and Delete Messages139140```java141// Update message142UpdateChatMessageOptions updateOptions = new UpdateChatMessageOptions()143 .setContent("Updated message content");144145threadClient.updateMessage(messageId, updateOptions);146147// Delete message148threadClient.deleteMessage(messageId);149```150151## Manage Participants152153```java154// List participants155PagedIterable<ChatParticipant> participants = threadClient.listParticipants();156157for (ChatParticipant participant : participants) {158 CommunicationUserIdentifier user =159 (CommunicationUserIdentifier) participant.getCommunicationIdentifier();160 System.out.println("User: " + user.getId());161 System.out.println("Display Name: " + participant.getDisplayName());162}163164// Add participants165List<ChatParticipant> newParticipants = new ArrayList<>();166newParticipants.add(new ChatParticipant()167 .setCommunicationIdentifier(new CommunicationUserIdentifier("<new-user-id>"))168 .setDisplayName("Charlie")169 .setShareHistoryTime(OffsetDateTime.now().minusDays(7))); // Share last 7 days170171threadClient.addParticipants(newParticipants);172173// Remove participant174CommunicationUserIdentifier userToRemove = new CommunicationUserIdentifier("<user-id>");175threadClient.removeParticipant(userToRemove);176```177178## Read Receipts179180```java181// Send read receipt182threadClient.sendReadReceipt(messageId);183184// Get read receipts185PagedIterable<ChatMessageReadReceipt> receipts = threadClient.listReadReceipts();186187for (ChatMessageReadReceipt receipt : receipts) {188 System.out.println("Message ID: " + receipt.getChatMessageId());189 System.out.println("Read by: " + receipt.getSenderCommunicationIdentifier());190 System.out.println("Read at: " + receipt.getReadOn());191}192```193194## Typing Notifications195196```java197import com.azure.communication.chat.models.TypingNotificationOptions;198199// Send typing notification200TypingNotificationOptions typingOptions = new TypingNotificationOptions()201 .setSenderDisplayName("Alice");202203threadClient.sendTypingNotificationWithResponse(typingOptions, Context.NONE);204205// Simple typing notification206threadClient.sendTypingNotification();207```208209## Thread Operations210211```java212// Get thread properties213ChatThreadProperties properties = threadClient.getProperties();214System.out.println("Topic: " + properties.getTopic());215System.out.println("Created: " + properties.getCreatedOn());216217// Update topic218threadClient.updateTopic("New Project Discussion Topic");219220// Delete thread221chatClient.deleteChatThread(threadId);222```223224## List Threads225226```java227// List all chat threads for the user228PagedIterable<ChatThreadItem> threads = chatClient.listChatThreads();229230for (ChatThreadItem thread : threads) {231 System.out.println("Thread ID: " + thread.getId());232 System.out.println("Topic: " + thread.getTopic());233 System.out.println("Last message: " + thread.getLastMessageReceivedOn());234}235```236237## Pagination238239```java240import com.azure.core.http.rest.PagedResponse;241242// Paginate through messages243int maxPageSize = 10;244ListChatMessagesOptions listOptions = new ListChatMessagesOptions()245 .setMaxPageSize(maxPageSize);246247PagedIterable<ChatMessage> pagedMessages = threadClient.listMessages(listOptions);248249pagedMessages.iterableByPage().forEach(page -> {250 System.out.println("Page status code: " + page.getStatusCode());251 page.getElements().forEach(msg ->252 System.out.println("Message: " + msg.getContent().getMessage()));253});254```255256## Error Handling257258```java259import com.azure.core.exception.HttpResponseException;260261try {262 threadClient.sendMessage(messageOptions);263} catch (HttpResponseException e) {264 switch (e.getResponse().getStatusCode()) {265 case 401:266 System.out.println("Unauthorized - check token");267 break;268 case 403:269 System.out.println("Forbidden - user not in thread");270 break;271 case 404:272 System.out.println("Thread not found");273 break;274 default:275 System.out.println("Error: " + e.getMessage());276 }277}278```279280## Message Types281282| Type | Description |283|------|-------------|284| `TEXT` | Regular chat message |285| `HTML` | HTML-formatted message |286| `TOPIC_UPDATED` | System message - topic changed |287| `PARTICIPANT_ADDED` | System message - participant joined |288| `PARTICIPANT_REMOVED` | System message - participant left |289290## Environment Variables291292```bash293AZURE_COMMUNICATION_ENDPOINT=https://<resource>.communication.azure.com294AZURE_COMMUNICATION_USER_TOKEN=<user-access-token>295```296297## Best Practices2982991. **Token Management** - User tokens expire; implement refresh logic with `CommunicationTokenRefreshOptions`3002. **Pagination** - Use `listMessages(options)` with `maxPageSize` for large threads3013. **Share History** - Set `shareHistoryTime` when adding participants to control message visibility3024. **Message Types** - Filter system messages (`PARTICIPANT_ADDED`, etc.) from user messages3035. **Read Receipts** - Send receipts only when messages are actually viewed by user304305## Trigger Phrases306307- "chat application Java", "real-time messaging Java"308- "chat thread", "chat participants", "chat messages"309- "read receipts", "typing notifications"310- "Azure Communication Services chat"311
Full transparency — inspect the skill content before installing.