azure-communication-chat-java
microsoft/skills
Crie aplicativos de bate-papo em tempo real com gerenciamento de threads, envio de mensagens, participantes e confirmações de leitura usando o SDK Java do Azure Communication Services Chat.
...Expandir tudoAzure Communication Chat (Java)
Crie aplicativos de bate-papo em tempo real com gerenciamento de threads, envio de mensagens, participantes e confirmações de leitura.
Instalação
com.azure
azure-communication-chat
1.6.0
Criação do cliente
import com.azure.communication.chat.ChatClient;
import com.azure.communication.chat.ChatClientBuilder;
import com.azure.communication.chat.ChatThreadClient;
import com.azure.communication.common.CommunicationTokenCredential;
// O ChatClient requer um CommunicationTokenCredential (token de acesso do usuário)
String endpoint = "https://.communication.azure.com";
String userAccessToken = "";
CommunicationTokenCredential credential = new CommunicationTokenCredential(userAccessToken);
ChatClient chatClient = new ChatClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildClient();
// Cliente assíncrono
ChatAsyncClient chatAsyncClient = new ChatClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildAsyncClient();
Conceitos-chave
| Classe | Finalidade |
|---|---|
ChatClient |
Criar/excluir threads de bate-papo, obter clientes de threads |
ChatThreadClient |
Operações dentro de um tópico (mensagens, participantes, confirmações de recebimento) |
ChatParticipant |
Usuário em uma conversa com nome de exibição |
ChatMessage |
Conteúdo da mensagem, tipo, informações do remetente, carimbos de data/hora |
ChatMessageReadReceipt |
Rastreamento de confirmação de leitura por participante |
Criar conversa
import com.azure.communication.chat.models.*;
import com.azure.communication.common.CommunicationUserIdentifier;
import java.util.ArrayList;
import java.util.List;
// Definir participantes
List participants = new ArrayList<>();
ChatParticipant participant1 = new ChatParticipant()
.setCommunicationIdentifier(new CommunicationUserIdentifier(""))
.setDisplayName("Alice");
ChatParticipant participant2 = new ChatParticipant()
.setCommunicationIdentifier(new CommunicationUserIdentifier(""))
.setDisplayName("Bob");
participants.add(participant1);
participants.add(participant2);
// Criar tópico
CreateChatThreadOptions options = new CreateChatThreadOptions("Discussão do projeto")
.setParticipants(participants);
CreateChatThreadResult result = chatClient.createChatThread(options);
String threadId = result.getChatThread().getId();
// Obter o cliente do tópico para operações
ChatThreadClient threadClient = chatClient.getChatThreadClient(threadId);
Enviar mensagens
// Enviar mensagem de texto
SendChatMessageOptions messageOptions = new SendChatMessageOptions()
.setContent("Olá, equipe!")
.setSenderDisplayName("Alice")
.setType(ChatMessageType.TEXT);
SendChatMessageResult sendResult = threadClient.sendMessage(messageOptions);
String messageId = sendResult.getId();
// Enviar mensagem em HTML
SendChatMessageOptions htmlOptions = new SendChatMessageOptions()
.setContent("Importante: Reunião às 15h")
.setType(ChatMessageType.HTML);
threadClient.sendMessage(htmlOptions);
Obter mensagens
import com.azure.core.util.paging.PagedIterable;
// Listar todas as mensagens
PagedIterable messages = threadClient.listMessages();
for (ChatMessage message : messages) {
System.out.println("ID: " + message.getId());
System.out.println("Tipo: " + message.getType());
System.out.println("Conteúdo: " + message.getContent().getMessage());
System.out.println("Remetente: " + message.getSenderDisplayName());
System.out.println("Criado em: " + message.getCreatedOn());
// Verificar se foi editada ou excluída
if (message.getEditedOn() != null) {
System.out.println("Editada: " + message.getEditedOn());
}
if (message.getDeletedOn() != null) {
System.out.println("Excluída: " + message.getDeletedOn());
}
}
// Obter mensagem específica
ChatMessage message = threadClient.getMessage(messageId);
Atualizar e excluir mensagens
// Atualizar mensagem
UpdateChatMessageOptions updateOptions = new UpdateChatMessageOptions()
.setContent("Conteúdo da mensagem atualizada");
threadClient.updateMessage(messageId, updateOptions);
// Excluir mensagem
threadClient.deleteMessage(messageId);
Gerenciar participantes
// Listar participantes
PagedIterable participants = threadClient.listParticipants();
for (ChatParticipant participant : participants) {
CommunicationUserIdentifier user =
(CommunicationUserIdentifier) participant.getCommunicationIdentifier();
System.out.println("Usuário: " + user.getId());
System.out.println("Nome de exibição: " + participant.getDisplayName());
}
// Adicionar participantes
List newParticipants = new ArrayList<>();
newParticipants.add(new ChatParticipant()
.setCommunicationIdentifier(new CommunicationUserIdentifier(""))
.setDisplayName("Charlie")
.setShareHistoryTime(OffsetDateTime.now().minusDays(7))); // Compartilhar os últimos 7 dias
threadClient.addParticipants(newParticipants);
// Remover participante
CommunicationUserIdentifier userToRemove = new CommunicationUserIdentifier("");
threadClient.removeParticipant(userToRemove);
Confirmações de leitura
// Enviar confirmação de leitura
threadClient.sendReadReceipt(messageId);
// Obter confirmações de leitura
PagedIterable receipts = threadClient.listReadReceipts();
for (ChatMessageReadReceipt receipt : receipts) {
System.out.println("ID da mensagem: " + receipt.getChatMessageId());
System.out.println("Lida por: " + receipt.getSenderCommunicationIdentifier());
System.out.println("Lida em: " + receipt.getReadOn());
}
Notificações de digitação
import com.azure.communication.chat.models.TypingNotificationOptions;
// Enviar notificação de digitação
TypingNotificationOptions typingOptions = new TypingNotificationOptions()
.setSenderDisplayName("Alice");
threadClient.sendTypingNotificationWithResponse(typingOptions, Context.NONE);
// Notificação simples de digitação
threadClient.sendTypingNotification();
Operações com threads
// Obter propriedades do tópico
ChatThreadProperties properties = threadClient.getProperties();
System.out.println("Tópico: " + properties.getTopic());
System.out.println("Criado em: " + properties.getCreatedOn());
// Atualizar tópico
threadClient.updateTopic("Novo tópico de discussão sobre o projeto");
// Excluir tópico
chatClient.deleteChatThread(threadId);
Listar threads
// Listar todos os tópicos de bate-papo do usuário
PagedIterable threads = chatClient.listChatThreads();
for (ChatThreadItem thread : threads) {
System.out.println("ID do tópico: " + thread.getId());
System.out.println("Tópico: " + thread.getTopic());
System.out.println("Última mensagem: " + thread.getLastMessageReceivedOn());
}
Paginação
import com.azure.core.http.rest.PagedResponse;
// Paginar as mensagens
int maxPageSize = 10;
ListChatMessagesOptions listOptions = new ListChatMessagesOptions()
.setMaxPageSize(maxPageSize);
PagedIterable pagedMessages = threadClient.listMessages(listOptions);
pagedMessages.iterableByPage().forEach(page -> {
System.out.println("Código de status da página: " + page.getStatusCode());
page.getElements().forEach(msg ->
System.out.println("Mensagem: " + msg.getContent().getMessage()));
});
Tratamento de erros
import com.azure.core.exception.HttpResponseException;
try {
threadClient.sendMessage(messageOptions);
} catch (HttpResponseException e) {
switch (e.getResponse().getStatusCode()) {
case 401:
System.out.println("Não autorizado — verifique o token");
break;
case 403:
System.out.println("Proibido — usuário não está no thread");
break;
case 404:
System.out.println("Thread não encontrado");
break;
default:
System.out.println("Erro: " + e.getMessage());
}
}
Tipos de mensagens
| Tipo | Descrição |
|---|---|
TEXTO |
Mensagem normal de bate-papo |
HTML |
Mensagem formatada em HTML |
TÓPICO_ATUALIZADO |
Mensagem do sistema — tópico alterado |
PARTICIPANT_ADDED |
Mensagem do sistema – participante entrou |
PARTICIPANT_REMOVED |
Mensagem do sistema - participante saiu |
Variáveis de ambiente
AZURE_COMMUNICATION_ENDPOINT=https://.communication.azure.com
AZURE_COMMUNICATION_USER_TOKEN=
Práticas recomendadas
- Gerenciamento de tokens – Os tokens de usuário expiram; implemente uma lógica de atualização com
CommunicationTokenRefreshOptions - Paginação — use
listMessages(options)commaxPageSizepara threads grandes - Histórico de compartilhamento — Defina
shareHistoryTimeao adicionar participantes para controlar a visibilidade das mensagens - Tipos de mensagem — Filtre as mensagens do sistema (
PARTICIPANT_ADDED, etc.) das mensagens do usuário - Confirmações de leitura — Envie confirmações somente quando as mensagens forem efetivamente visualizadas pelo usuário
Frases de acionamento
- “aplicativo de bate-papo Java”, “mensagens em tempo real Java”
- “linha de conversa”, “participantes do chat”, “mensagens de chat”
- “confirmações de leitura”, “notificações de digitação”
- “bate-papo do Azure Communication Services”
---
name: azure-communication-chat-java
description: Build real-time chat applications with thread management, messaging, participants, and read receipts using the Azure Communication Services Chat Java SDK.
license: MIT
---
# Azure Communication Chat (Java)
Build real-time chat applications with thread management, messaging, participants, and read receipts.
## Installation
```xml
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-communication-chat</artifactId>
<version>1.6.0</version>
</dependency>
```
## Client Creation
```java
import com.azure.communication.chat.ChatClient;
import com.azure.communication.chat.ChatClientBuilder;
import com.azure.communication.chat.ChatThreadClient;
import com.azure.communication.common.CommunicationTokenCredential;
// ChatClient requires a CommunicationTokenCredential (user access token)
String endpoint = "https://<resource>.communication.azure.com";
String userAccessToken = "<user-access-token>";
CommunicationTokenCredential credential = new CommunicationTokenCredential(userAccessToken);
ChatClient chatClient = new ChatClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildClient();
// Async client
ChatAsyncClient chatAsyncClient = new ChatClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildAsyncClient();
```
## Key Concepts
| Class | Purpose |
|-------|---------|
| `ChatClient` | Create/delete chat threads, get thread clients |
| `ChatThreadClient` | Operations within a thread (messages, participants, receipts) |
| `ChatParticipant` | User in a chat thread with display name |
| `ChatMessage` | Message content, type, sender info, timestamps |
| `ChatMessageReadReceipt` | Read receipt tracking per participant |
## Create Chat Thread
```java
import com.azure.communication.chat.models.*;
import com.azure.communication.common.CommunicationUserIdentifier;
import java.util.ArrayList;
import java.util.List;
// Define participants
List<ChatParticipant> participants = new ArrayList<>();
ChatParticipant participant1 = new ChatParticipant()
.setCommunicationIdentifier(new CommunicationUserIdentifier("<user-id-1>"))
.setDisplayName("Alice");
ChatParticipant participant2 = new ChatParticipant()
.setCommunicationIdentifier(new CommunicationUserIdentifier("<user-id-2>"))
.setDisplayName("Bob");
participants.add(participant1);
participants.add(participant2);
// Create thread
CreateChatThreadOptions options = new CreateChatThreadOptions("Project Discussion")
.setParticipants(participants);
CreateChatThreadResult result = chatClient.createChatThread(options);
String threadId = result.getChatThread().getId();
// Get thread client for operations
ChatThreadClient threadClient = chatClient.getChatThreadClient(threadId);
```
## Send Messages
```java
// Send text message
SendChatMessageOptions messageOptions = new SendChatMessageOptions()
.setContent("Hello, team!")
.setSenderDisplayName("Alice")
.setType(ChatMessageType.TEXT);
SendChatMessageResult sendResult = threadClient.sendMessage(messageOptions);
String messageId = sendResult.getId();
// Send HTML message
SendChatMessageOptions htmlOptions = new SendChatMessageOptions()
.setContent("<strong>Important:</strong> Meeting at 3pm")
.setType(ChatMessageType.HTML);
threadClient.sendMessage(htmlOptions);
```
## Get Messages
```java
import com.azure.core.util.paging.PagedIterable;
// List all messages
PagedIterable<ChatMessage> messages = threadClient.listMessages();
for (ChatMessage message : messages) {
System.out.println("ID: " + message.getId());
System.out.println("Type: " + message.getType());
System.out.println("Content: " + message.getContent().getMessage());
System.out.println("Sender: " + message.getSenderDisplayName());
System.out.println("Created: " + message.getCreatedOn());
// Check if edited or deleted
if (message.getEditedOn() != null) {
System.out.println("Edited: " + message.getEditedOn());
}
if (message.getDeletedOn() != null) {
System.out.println("Deleted: " + message.getDeletedOn());
}
}
// Get specific message
ChatMessage message = threadClient.getMessage(messageId);
```
## Update and Delete Messages
```java
// Update message
UpdateChatMessageOptions updateOptions = new UpdateChatMessageOptions()
.setContent("Updated message content");
threadClient.updateMessage(messageId, updateOptions);
// Delete message
threadClient.deleteMessage(messageId);
```
## Manage Participants
```java
// List participants
PagedIterable<ChatParticipant> participants = threadClient.listParticipants();
for (ChatParticipant participant : participants) {
CommunicationUserIdentifier user =
(CommunicationUserIdentifier) participant.getCommunicationIdentifier();
System.out.println("User: " + user.getId());
System.out.println("Display Name: " + participant.getDisplayName());
}
// Add participants
List<ChatParticipant> newParticipants = new ArrayList<>();
newParticipants.add(new ChatParticipant()
.setCommunicationIdentifier(new CommunicationUserIdentifier("<new-user-id>"))
.setDisplayName("Charlie")
.setShareHistoryTime(OffsetDateTime.now().minusDays(7))); // Share last 7 days
threadClient.addParticipants(newParticipants);
// Remove participant
CommunicationUserIdentifier userToRemove = new CommunicationUserIdentifier("<user-id>");
threadClient.removeParticipant(userToRemove);
```
## Read Receipts
```java
// Send read receipt
threadClient.sendReadReceipt(messageId);
// Get read receipts
PagedIterable<ChatMessageReadReceipt> receipts = threadClient.listReadReceipts();
for (ChatMessageReadReceipt receipt : receipts) {
System.out.println("Message ID: " + receipt.getChatMessageId());
System.out.println("Read by: " + receipt.getSenderCommunicationIdentifier());
System.out.println("Read at: " + receipt.getReadOn());
}
```
## Typing Notifications
```java
import com.azure.communication.chat.models.TypingNotificationOptions;
// Send typing notification
TypingNotificationOptions typingOptions = new TypingNotificationOptions()
.setSenderDisplayName("Alice");
threadClient.sendTypingNotificationWithResponse(typingOptions, Context.NONE);
// Simple typing notification
threadClient.sendTypingNotification();
```
## Thread Operations
```java
// Get thread properties
ChatThreadProperties properties = threadClient.getProperties();
System.out.println("Topic: " + properties.getTopic());
System.out.println("Created: " + properties.getCreatedOn());
// Update topic
threadClient.updateTopic("New Project Discussion Topic");
// Delete thread
chatClient.deleteChatThread(threadId);
```
## List Threads
```java
// List all chat threads for the user
PagedIterable<ChatThreadItem> threads = chatClient.listChatThreads();
for (ChatThreadItem thread : threads) {
System.out.println("Thread ID: " + thread.getId());
System.out.println("Topic: " + thread.getTopic());
System.out.println("Last message: " + thread.getLastMessageReceivedOn());
}
```
## Pagination
```java
import com.azure.core.http.rest.PagedResponse;
// Paginate through messages
int maxPageSize = 10;
ListChatMessagesOptions listOptions = new ListChatMessagesOptions()
.setMaxPageSize(maxPageSize);
PagedIterable<ChatMessage> pagedMessages = threadClient.listMessages(listOptions);
pagedMessages.iterableByPage().forEach(page -> {
System.out.println("Page status code: " + page.getStatusCode());
page.getElements().forEach(msg ->
System.out.println("Message: " + msg.getContent().getMessage()));
});
```
## Error Handling
```java
import com.azure.core.exception.HttpResponseException;
try {
threadClient.sendMessage(messageOptions);
} catch (HttpResponseException e) {
switch (e.getResponse().getStatusCode()) {
case 401:
System.out.println("Unauthorized - check token");
break;
case 403:
System.out.println("Forbidden - user not in thread");
break;
case 404:
System.out.println("Thread not found");
break;
default:
System.out.println("Error: " + e.getMessage());
}
}
```
## Message Types
| Type | Description |
|------|-------------|
| `TEXT` | Regular chat message |
| `HTML` | HTML-formatted message |
| `TOPIC_UPDATED` | System message - topic changed |
| `PARTICIPANT_ADDED` | System message - participant joined |
| `PARTICIPANT_REMOVED` | System message - participant left |
## Environment Variables
```bash
AZURE_COMMUNICATION_ENDPOINT=https://<resource>.communication.azure.com
AZURE_COMMUNICATION_USER_TOKEN=<user-access-token>
```
## Best Practices
1. **Token Management** - User tokens expire; implement refresh logic with `CommunicationTokenRefreshOptions`
2. **Pagination** - Use `listMessages(options)` with `maxPageSize` for large threads
3. **Share History** - Set `shareHistoryTime` when adding participants to control message visibility
4. **Message Types** - Filter system messages (`PARTICIPANT_ADDED`, etc.) from user messages
5. **Read Receipts** - Send receipts only when messages are actually viewed by user
## Trigger Phrases
- "chat application Java", "real-time messaging Java"
- "chat thread", "chat participants", "chat messages"
- "read receipts", "typing notifications"
- "Azure Communication Services chat"
Todos os arquivos
0 arquivosInstalar azure-communication-chat-java
Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.
Baixar ZIPClone o repositório e copie os arquivos da habilidade para o seu projeto.
git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-java/skills/azure-communication-chat-java # Copy SKILL.md to your .claude/skills/ directory
Copiar





Lar
