Azure Communication Chat (Java)
Créez des applications de chat en temps réel avec gestion des fils de discussion, messagerie, participants et accusés de lecture.
Installation
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-communication-chat</artifactId>
<version>1.6.0</version>
</dependency>
Création du client
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 requiert un CommunicationTokenCredential (jeton d'accès utilisateur)
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();
// Client asynchrone
ChatAsyncClient chatAsyncClient = new ChatClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildAsyncClient();
Concepts clés
| Classe |
Objectif |
ChatClient |
Créer/supprimer des fils de discussion, obtenir des clients de fil |
ChatThreadClient |
Opérations au sein d'un fil (messages, participants, accusés) |
ChatParticipant |
Utilisateur dans un fil de discussion avec nom d'affichage |
ChatMessage |
Contenu du message, type, informations sur l'expéditeur, horodatages |
ChatMessageReadReceipt |
Suivi des accusés de lecture par participant |
Créer un fil de discussion
import com.azure.communication.chat.models.*;
import com.azure.communication.common.CommunicationUserIdentifier;
import java.util.ArrayList;
import java.util.List;
// Définir les 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);
// Créer le fil
CreateChatThreadOptions options = new CreateChatThreadOptions("Project Discussion")
.setParticipants(participants);
CreateChatThreadResult result = chatClient.createChatThread(options);
String threadId = result.getChatThread().getId();
// Obtenir le client de fil pour les opérations
ChatThreadClient threadClient = chatClient.getChatThreadClient(threadId);
Envoyer des messages
// Envoyer un message texte
SendChatMessageOptions messageOptions = new SendChatMessageOptions()
.setContent("Hello, team!")
.setSenderDisplayName("Alice")
.setType(ChatMessageType.TEXT);
SendChatMessageResult sendResult = threadClient.sendMessage(messageOptions);
String messageId = sendResult.getId();
// Envoyer un message HTML
SendChatMessageOptions htmlOptions = new SendChatMessageOptions()
.setContent("<strong>Important:</strong> Meeting at 3pm")
.setType(ChatMessageType.HTML);
threadClient.sendMessage(htmlOptions);
Récupérer les messages
import com.azure.core.util.paging.PagedIterable;
// Lister tous les 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());
// Vérifier si modifié ou supprimé
if (message.getEditedOn() != null) {
System.out.println("Edited: " + message.getEditedOn());
}
if (message.getDeletedOn() != null) {
System.out.println("Deleted: " + message.getDeletedOn());
}
}
// Obtenir un message spécifique
ChatMessage message = threadClient.getMessage(messageId);
Mettre à jour et supprimer des messages
// Mettre à jour le message
UpdateChatMessageOptions updateOptions = new UpdateChatMessageOptions()
.setContent("Updated message content");
threadClient.updateMessage(messageId, updateOptions);
// Supprimer le message
threadClient.deleteMessage(messageId);
Gérer les participants
// Lister les 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());
}
// Ajouter des participants
List<ChatParticipant> newParticipants = new ArrayList<>();
newParticipants.add(new ChatParticipant()
.setCommunicationIdentifier(new CommunicationUserIdentifier("<new-user-id>"))
.setDisplayName("Charlie")
.setShareHistoryTime(OffsetDateTime.now().minusDays(7))); // Partager les 7 derniers jours
threadClient.addParticipants(newParticipants);
// Supprimer un participant
CommunicationUserIdentifier userToRemove = new CommunicationUserIdentifier("<user-id>");
threadClient.removeParticipant(userToRemove);
Accusés de lecture
// Envoyer un accusé de lecture
threadClient.sendReadReceipt(messageId);
// Obtenir les accusés de lecture
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());
}
Notifications de saisie
import com.azure.communication.chat.models.TypingNotificationOptions;
// Envoyer une notification de saisie
TypingNotificationOptions typingOptions = new TypingNotificationOptions()
.setSenderDisplayName("Alice");
threadClient.sendTypingNotificationWithResponse(typingOptions, Context.NONE);
// Notification de saisie simple
threadClient.sendTypingNotification();
Opérations sur les fils
// Obtenir les propriétés du fil
ChatThreadProperties properties = threadClient.getProperties();
System.out.println("Topic: " + properties.getTopic());
System.out.println("Created: " + properties.getCreatedOn());
// Mettre à jour le sujet
threadClient.updateTopic("New Project Discussion Topic");
// Supprimer le fil
chatClient.deleteChatThread(threadId);
Lister les fils
// Lister tous les fils de discussion pour l'utilisateur
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
import com.azure.core.http.rest.PagedResponse;
// Parcourir les 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()));
});
Gestion des erreurs
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());
}
}
Types de messages
| Type |
Description |
TEXT |
Message de chat régulier |
HTML |
Message formaté HTML |
TOPIC_UPDATED |
Message système - sujet modifié |
PARTICIPANT_ADDED |
Message système - participant rejointe |
PARTICIPANT_REMOVED |
Message système - participant quitté |
Variables d'environnement
AZURE_COMMUNICATION_ENDPOINT=https://<resource>.communication.azure.com
AZURE_COMMUNICATION_USER_TOKEN=<user-access-token>
Bonnes pratiques
- Gestion des jetons - Les jetons utilisateur expirent ; implémentez la logique d'actualisation avec
CommunicationTokenRefreshOptions
- Pagination - Utilisez
listMessages(options) avec maxPageSize pour les grands fils
- Partage d'historique - Définissez
shareHistoryTime lors de l'ajout de participants pour contrôler la visibilité des messages
- Types de messages - Filtrez les messages système (
PARTICIPANT_ADDED, etc.) des messages utilisateur
- Accusés de lecture - Envoyez les accusés de lecture uniquement lorsque les messages sont réellement visualisés par l'utilisateur
Expressions déclencheurs
- "application de chat Java", "messagerie en temps réel Java"
- "fil de discussion", "participants au chat", "messages de chat"
- "accusés de lecture", "notifications de saisie"
- "Azure Communication Services chat"