ブレークアウト ルーム
この記事では、Azure Communication Services を使用して Microsoft Teams のブレークアウト ルームを実装する方法について説明します。 この機能により、Teams 会議の Azure Communication Services ユーザーはブレークアウト ルームに参加できます。 Teams 管理者は、Teams 会議ポリシーを使用して Teams 会議でブレークアウト ルームを誰がどのように利用できるかを制御します。 ブレークアウト ルームに関する追加情報については、Teams のドキュメントを参照してください。
前提条件
- アクティブなサブスクリプションが含まれる Azure アカウント。 「アカウントの無料作成」をご覧ください。
- デプロイ済みの Communication Services リソース。 「Communication Services リソースを作成する」を参照してください。
- 通話クライアントを有効にするためのユーザー アクセス トークン。 詳細については、アクセス トークンの作成と管理に関する記事を参照してください。
- Teams 会議の開催者は、ブレークアウト ルームを有効にする Teams 会議ポリシーを割り当てる必要があります。 「Teams 会議ポリシー」を参照してください。
- 省略可能: クイックスタートを完了して、アプリケーションに音声通話を追加します。
ブレークアウト ルームを管理できるのは、会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーのみです。
サポート
次の表では、Azure Communication Services でのブレークアウト ルームのサポートを定義します。
ID と通話の種類
次の表は、特定のコールの種類と ID に対するブレークアウト ルームのサポートを示しています。
ID | Teams 会議 | ルーム | 1 対 1 の通話 | グループ通話 | 1:1 Teams 相互運用機能通話 | グループ チームの相互運用機能通話 |
---|---|---|---|---|---|---|
Communication Services ユーザー | ✔️ | |||||
Microsoft 365 ユーザー | ✔️ |
操作
次の表は、個々の ID の種類に関連する Calling SDK における個々の API のサポートを示しています。
操作 | Communication Services ユーザー | Microsoft 365 ユーザー |
---|---|---|
割り当てられたブレークアウト ルームを取得する | ✔️ | ✔️ |
すべてのブレークアウト ルームを取得する | ✔️[1] | |
ブレークアウト ルームに参加する | ✔️ | ✔️ |
ブレイクアウト ルームを管理する | ||
ブレークアウト ルーム チャットに参加する | ✔️[2] | |
ブレークアウト ルームの設定を取得する | ✔️ | ✔️ |
[1] 会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーのみ。
[2] Microsoft 365 ユーザーは Graph API を使用してブレークアウト ルーム チャットに参加できます。 チャットのスレッド ID は、割り当てられたブレークアウト ルーム オブジェクトで提供されます。
SDK
次の表は、個々の Azure Communication Services SDK でのブレークアウト ルーム機能のサポートを示しています。
サポートの状態 | Web | Web UI | iOS | iOS UI | Android | Android UI | Windows |
---|---|---|---|---|---|---|---|
サポートの有無 | ✔️ |
SDK のインストール
npm install
コマンドを使用して、JavaScript 用の Azure Communication Services の Common SDK と Calling SDK をインストールします。
npm install @azure/communication-common --save
npm install @azure/communication-calling --save
必要なオブジェクトを初期化する
CallClient
インスタンスは、ほとんどの通話操作に必要です。 新しい CallClient
インスタンスを作成する際に、Logger
インスタンスなどのカスタム オプションを使用してこれを構成できます。
CallClient
インスタンスでは、createCallAgent
を呼び出すことで CallAgent
インスタンスを作成できます。 このメソッドでは、非同期的に CallAgent
インスタンス オブジェクトが返されます。
createCallAgent
メソッドでは、CommunicationTokenCredential
が引数として使用されます。 これは、ユーザー アクセス トークンを受け取ります。
CallClient
インスタンスで getDeviceManager
メソッドを使用して、deviceManager
にアクセスできます。
const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");
// Set the logger's log level
setLogLevel('verbose');
// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
console.log(...args); // Redirect log output to console
};
const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()
Microsoft インフラストラクチャへの SDK 接続を最適に管理する方法
Call Agent
インスタンスは、(呼び出しを結合または開始するために) 呼び出しを管理するのに役立ちます。 呼び出しの SDK を機能させるには、Microsoft インフラストラクチャに接続して着信呼び出しの通知を取得し、他の呼び出しの詳細を調整する必要があります。 Call Agent
には、次の 2 つの状態があります。
接続済み - Connected
の Call Agent
connectionStatue 値は、クライアント SDK が接続されており、Microsoft インフラストラクチャから通知を受信できることを意味します。
切断済み - Disconnected
の Call Agent
connectionStatue 値は、SDK の正常な接続を妨げる問題があることを示します。 Call Agent
を再作成する必要があります。
invalidToken
: トークンが有効期限切れであるか、無効な場合、Call Agent
インスタンスがこのエラーで切断されます。connectionIssue
: クライアントの Microsoft インフラストラクチャへの接続で問題が発生した場合、何度も再試行した後に、Call Agent
がconnectionIssue
エラーを提示します。
connectionState
プロパティの現在の値を調べて、ローカル Call Agent
が Microsoft インフラストラクチャに接続されているかどうかを確認できます。 アクティブな呼び出し中に、connectionStateChanged
イベントをリッスンして、Call Agent
の状態が接続済みから切断済みに変化したかどうかを判断できます。
const connectionState = callAgentInstance.connectionState;
console.log(connectionState); // it may return either of 'Connected' | 'Disconnected'
const connectionStateCallback = (args) => {
console.log(args); // it will return an object with oldState and newState, each of having a value of either of 'Connected' | 'Disconnected'
// it will also return reason, either of 'invalidToken' | 'connectionIssue'
}
callAgentInstance.on('connectionStateChanged', connectionStateCallback);
ブレークアウト ルームを実装する
BreakoutRooms
はクラス Call
の feature
です。 まず、Calling SDK からパッケージ Features
をインポートする必要があります。
import { Features} from "@azure/communication-calling";
breakoutRoom 機能を作成する
その後、呼び出しインスタンスからその機能 API オブジェクトを取得します。
const breakoutRoomsFeature = mainMeetingCall.feature(Features.BreakoutRooms);
breakoutRoom イベントをサブスクライブする
BreakoutRooms
API を使用すると、BreakoutRooms
イベントにサブスクライブできます。 breakoutRoomsUpdated
イベントは、BreakoutRoomsCallFeature
インスタンスから取得します。これには、作成、更新、割り当てられたブレークアウト ルームに関する情報が含まれます。
ブレークアウト ルームの詳細を受信するには、breakoutRoomsUpdated
イベントをサブスクライブします。
breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
breakoutRoom イベントを処理する
イベント breakoutRoomsUpdated
は、次のいずれかのクラスのインスタンスを入力パラメーターとして提供します。 プロパティ type
を使用して、個々のイベントの種類を区別できます。
クラス
BreakoutRoomsEvent
: このイベントは、会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つユーザーがブレークアウト ルームを作成または更新したときにトリガーされます。 会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーは、この種類のイベントを受信できます。 開発者は、プロパティdata
のブレークアウト ルームを使用して、すべてのブレークアウト ルームに関する詳細をレンダリングできます。 このクラスには、"breakoutRooms"
と等しいプロパティtype
があります。export interface BreakoutRoomsEvent { /** * Breakout room event type */ type: "breakoutRooms", /** * list of Breakout rooms */ data: BreakoutRoom[] | undefined; }
クラス
BreakoutRoomsSettingsEvent
: 会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つユーザーがブレークアウト ルームの設定を更新したときに、このイベントがトリガーされます。 開発者はこの情報を使用して、ブレークアウト ルームが終了する時刻を表示したり、メイン ルームに参加するためのボタンを表示するかどうかを決定したりできます。 このクラスには、"breakoutRoomSettings"
と等しいプロパティtype
があります。export interface BreakoutRoomSettingsEvent { /** * Breakout room event type */ type: "breakoutRoomSettings", /** * Breakout Room setting details */ data: BreakoutRoomSettings | undefined; }
クラス
AssignedBreakoutRoomsEvent
: このイベントは、ユーザーがブレークアウト ルームに割り当てられた場合、または割り当てられたブレークアウト ルームが更新されたときにトリガーされます。 ユーザーは、プロパティstate
がopen
に設定されているときにブレークアウト ルームに参加したり、プロパティstate
がclosed
に設定されているときにブレークアウト ルームから退室したり、ブレークアウト ルームの詳細を表示したりできます。 このクラスには、"assignedBreakoutRoom"
と等しいプロパティtype
があります。export interface AssignedBreakoutRoomEvent { /** * Breakout room event type */ type: "assignedBreakoutRoom"; /** * Assigned breakout room details */ data: BreakoutRoom | undefined; }
クラス
JoinBreakoutRoomsEvent
: このイベントは、参加者がブレークアウト ルーム コールに参加しているときにトリガーされます。 このイベントは、ユーザーがブレークアウト ルームに自動的に移動された場合 (つまり、assignedBreakoutRoom
のプロパティstate
がopen
に設定されていて、autoMoveParticipantToBreakoutRoom
がtrue
に設定されている場合)、またはユーザーがブレークアウト ルームに明示的に参加したとき (つまり、autoMoveParticipantToBreakoutRoom
がfalse
に設定されているときにインスタンスassignedBreakoutRoom
のメソッドjoin
を呼び出す) ときに発生します。 プロパティdata
には、開発者がブレークアウト ルーム コールを制御するために使用できるブレークアウト ルームcall
インスタンスが含まれています。 このクラスには、"join"
と等しいプロパティtype
があります。export interface JoinBreakoutRoomEvent { /** * Breakout room event type */ type: "join"; /** * Breakoutroom call object */ data: Call | TeamsCall; }
次のコードは、ブレークアウト ルーム イベントで受け取った重要な情報が示されています。
const breakoutRoomsUpdatedListener = (event) => {
switch(event.type) {
case "breakoutRooms":
const breakoutRooms = event.data;
console.log(`Breakout rooms are created or updated. There are ${breakoutRooms.length} breakout rooms in total.`);
breakoutRooms.forEach((room)=>{
console.log(`- ${room.displayName}`);
});
break;
case "assignedBreakoutRooms":
const assignedRoom = event.data;
console.log(`You are assigned to breakout room named: ${assignedRoom.displayName}`);
console.log(`Assigned breakout room thread Id: ${assignedRoom.threadId}`);
console.log(`Automatically move participants to breakout room: ${assignedRoom.autoMoveParticipantToBreakoutRoom}`);
console.log(`Assigned breakout room state : ${assignedRoom.state }`);
break;
case "breakoutRoomsSettings":
const breakoutRoomSettings = event.data;
console.log(`Breakout room ends at: ${breakoutRoomSettings.roomEndTime}`);
console.log(`Disable the user to return to main meeting from breakout room call : ${breakoutRoomSettings.disableReturnToMainMeeting}`);
break;
case "join":
const breakoutRoomCall = event.data;
console.log(`You have joined breakout room with call ID: ${breakoutRoomCall.id}`);
break;
}
}
breakoutRoomsFeature.on('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
利用可能なブレークアウト ルームを一覧表示する
会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーは、すべてのブレークアウト ルームにアクセスできます。
const breakoutRooms = breakoutRoomsFeature.breakoutRooms;
breakoutRooms.forEach((room)=>{
console.log(`- ${room.displayName}`);
});
招待者を一覧表示する
会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーは、個々のブレークアウト ルームに割り当てられた参加者を管理できます。
breakoutRooms.forEach((room)=>{
console.log(`${room.displayName}`);
room.invitees.forEach((invitee) => {
console.log(`- ${invitee.id}`);
})
})
ブレークアウト ルームに参加する
assignedBreakoutRoom
のプロパティ autoMoveParticipantToBreakoutRoom
が true
に設定されているときに、プロパティ state
が open
に設定されると、ユーザーは自動的にブレークアウト ルームに移動されます。 autoMoveParticipantToBreakoutRoom
が false
に設定されている場合は、次のコードを使用してブレークアウト ルームに参加します。
これにより、プロパティ type
が join
として設定されたクラス JoinBreakoutRoomsEvent
で breakoutRoomsUpdated
イベントがトリガーされます。 プロパティ data
内のクラス call
のインスタンスを使用して、ブレークアウト ルーム コールを管理できます。
const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await breakoutRoom.join();
}
ユーザーがブレークアウト ルームにいて、会議の開催者が新しいブレークアウト ルームをユーザーに割り当てると、ユーザーは assignedBreakoutRooms
の種類 breakoutRoomsUpdated
イベントを受け取ります。 このイベントには、最新のブレークアウト ルームの詳細が含まれています。 ユーザーは、前のブレークアウト ルーム呼び出しを hangUp()
する必要があります。 autoMoveParticipantToBreakoutRoom
が true
に設定されている場合、ユーザーは自動的に移動されます。それ以外の場合、ユーザーは新しいブレークアウト ルームで join
メソッドを明示的に呼び出す必要があります。
//Breakout room which is assigned initially.
const breakoutRoom = breakoutRoomsFeature.assignedBreakoutRoom;
if(breakoutRoom.state == 'open' && !breakoutRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await breakoutRoom.join();
}
// `breakoutRoomsUpdated` event which contains the details of the new breakout room
let assignedRoom = undefined;
const breakoutRoomsUpdatedListener = (event) => {
switch(event.type) {
case "assignedBreakoutRooms":
const assignedRoom = event.data;
break;
}
}
if(assignedRoom.threadId != breakoutRoom.threadId && breakoutRooms != null)
{
await breakoutRoom.hangUp();
}
if(assignedRoom.state == 'open' && !assignedRoom.autoMoveParticipantToBreakoutRoom) {
const breakoutRoomCall = await assignedRoom.join();
}
会議の開催者、共同開催者、またはブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーは、ブレークアウト ルーム マネージャーまたはメイン会議の開催者によって作成されたブレークアウト ルームの一覧を取得します。 この場合、この動作が若干異なります。 このユーザーは、ブレークアウト ルームに参加するために、join()
メソッドを明示的に呼び出す必要があります。 ユーザーは最初はメイン会議で保留中になり、最終的にはメイン会議から削除されます。 ユーザーは、ブレークアウト ルームで更新プログラムを受け取るために、breakoutRoomCall
の breakoutRooms 機能を初期化する必要があります。
ユーザーがブレークアウト ルームのいずれかに参加する場合、ユーザーは明示的に join
メソッドを呼び出します。
const breakoutRoom = breakoutRoomsFeature.breakoutRooms[0];
if(breakoutRoom.state == 'open') {
const breakoutRoomCall = await breakoutRoom.join();
}
ブレークアウト ルームを終了するには、ユーザーはブレークアウト ルーム呼び出しで hangUp()
関数を実行する必要があります。 ユーザーは、メイン会議の通話を再開するために ReturnToMainMeeting
を呼び出します。
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
ブレークアウト ルームから退出する
ブレークアウト ルームの状態が closed
の場合、ユーザーはクラス AssignedBreakoutRoomsEvent
を持つイベント breakoutRoomsUpdated
や、assignedBreakoutRoom
のプロパティ state
が closed
に設定されたことを示す assignedBreakoutRooms
と等しいプロパティ type
を受け取ることで、ブレークアウト ルームの終了について通知されます。 ユーザーはブレークアウト ルームを自動的に退出し、上に示すように returnToMainMeeting()
を呼び出すことでメイン会議に戻ることができます。
ユーザーがルームを閉じる前にブレークアウト ルームから退出するときに、ブレークアウト ルームの設定 breakoutRoomsFeature.breakoutRoomsSettings
のプロパティ disableReturnToMainMeeting
が false
に設定されている場合、ユーザーは次のコードを使用してメイン会議の通話に戻れます。
breakoutRoomCall.hangUp();
const mainMeetingCall = breakoutRoomCall.returnToMainMeeting();
ブレークアウト ルームの参加者を取得する
ブレークアウト ルームに参加しているときに、次のコードを使用して、ブレークアウト ルームのリモート参加者の一覧を取得できます。
const breakoutRoomParticipants = [breakoutRoomCall.remoteParticipants.values()].map((p: SDK.RemoteParticipant) => { p.displayName || p.identifier });
console.log(`Participants of the breakoutRoom : <br/>" + breakoutRoomParticipants.join("<br/>")`);
ブレークアウト ルーム イベントの受信を停止する
breakoutRooms イベントの受信を停止するには、次のコードを使用します。
breakoutRoomsFeature.off('breakoutRoomsUpdated', breakoutRoomsUpdatedListener);
ブレークアウト ルームのプロパティ
ブレークアウト ルームには次のプロパティがあります。
Note
次のサンプル コードは、すべてのブレークアウト ルーム プロパティを効率的に表示します。 表示されたとおりに再利用するためのものではありません。 実際には、ブレイクアウト ルームのシナリオに必要なプロパティのみを使用します。
const displayName : string = breakoutRoom.displayName;
const threadId : string = breakoutRoom.threadId;
const state : BreakoutRoomState = breakoutRoom.state;
const autoMoveParticipantToBreakoutRoom : boolean = breakoutRoom.autoMoveParticipantToBreakoutRoom;
const call : Call | TeamsCall = breakoutRoom.call;
const invitees : Invitee[] = breakoutRoom.invitees;
ブレークアウト ルームのプロパティ | 説明 |
---|---|
displayName |
ブレークアウト ルームの名前。 このプロパティは読み取り専用です。 |
threadId |
チャット スレッド ID を使用して、ブレークアウト ルームのチャットに参加します。 このプロパティは読み取り専用です。 |
state |
ブレークアウト ルームの状態。 これは open 、closed のいずれかにできます。 ユーザーは、状態が open の場合にのみブレークアウト ルームに参加できます。 このプロパティは読み取り専用です。 |
autoMoveParticipantToBreakoutRoom |
assignedBreakoutRoom の state が open に設定されているときに、ユーザーがブレークアウト ルームに自動的に移動されるかどうかを示すブール値。 このプロパティは読み取り専用です。 ブレークアウト ルームの Teams UI 設定では、開催者、共同開催者、またはブレークアウト ルーム マネージャーがこの特定の設定を調整できます。 このオプションを true に設定すると、参加者は自動的に指定されたブレイクアウト ルームに転送されます。 逆に、このプロパティを false に設定する場合は、join メソッドを手動で呼び出して参加者をブレークアウト ルームに移動させる必要があります。 |
call |
ブレークアウト ルーム コールのオブジェクト。 このオブジェクトは、ユーザーがブレークアウト ルーム コールに自動的に参加したとき、または assignedBreakoutRoom オブジェクトで join メソッドを呼び出すことによって返されます。 このプロパティは読み取り専用です。 |
invitees |
ブレークアウト ルームに割り当てられている招待者の一覧。 このプロパティは読み取り専用です。 |
ブレークアウト ルームの設定
ブレークアウト ルームは、次のプロパティを持つ設定を共有します。
const disableReturnToMainMeeting : boolean = breakoutRoomsSettings.disableReturnToMainMeeting;
const roomEndTime : TimestampInfo = breakoutRoomsSettings.roomEndTime;
ブレークアウト ルームのプロパティ | 説明 |
---|---|
disableReturnToMainMeeting |
参加者がブレークアウト ルーム コールからメイン会議に戻れないようにします。 このプロパティは読み取り専用です。 ブレークアウト ルームの Teams UI 設定では、開催者、共同開催者、またはブレークアウト ルーム マネージャーは、この特定の設定を調整して、ブレークアウト ルームの参加者がメイン会議に戻ることができるタイミングを制御できます。 |
roomEndTime |
会議の開催者、共同開催者、またはメイン会議のブレークアウト ルーム マネージャーのロールを持つ Microsoft 365 ユーザーによって設定されたブレークアウト ルームの終了時間。 このプロパティは読み取り専用です。 |
トラブルシューティング
エラー コード | サブコード | 結果カテゴリ | 理由 | 解決方法 |
---|---|---|---|---|
400 | 46250 | ExpectedError | ブレークアウト ルーム機能は、Teams 会議でのみ使用できます。 | 独自のブレークアウト ルーム メカニズムを実装するか、Teams 会議を使用します。 |
405 | 46251 | ExpectedError | Azure Communication Services では、この機能は現在使用できません。 | 数日後に API を試してください。 |
500 | 46254 | UnexpectedServerError | 予期しないエラーが発生したため、ブレークアウト ルームに参加できません。 | assignedBreakoutRoom の state が open で、breakoutRoomsFeature.assignedBreakoutRoom.join() メソッドが明示的に呼び出されることを確認してください。 問題が解決しない場合は、ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。 |
500 | 46255 | UnexpectedServerError | メイン会議を開催できません。 | assignedBreakoutRoom の state が open で、breakoutRoomsFeature.assignedBreakoutRoom.join() メソッドが明示的に呼び出されることを確認してください。 問題が解決しない場合は、ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。 |
412 | 46256 | ExpectedError | ルームが終了したため、ブレークアウトルームに参加できません。 | assignedBreakoutRoom の state が open で、breakoutRoomsFeature.assignedBreakoutRoom.join() メソッドが明示的に呼び出されることを確認してください。 |
412 | 46257 | UnexpectedServerError | メイン会議を再開できません。 | ブレークアウト ルームから手動で退出する場合は、セクション Leave breakout room で定義されている手順に従います。 問題が解決しない場合は、ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。 |
412 | 46258 | UnexpectedClientError | ブレークアウト ルームの詳細を読み取ることができません。 | ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。 |
500 | 46259 | UnexpectedServerError | ブレークアウト ルーム コールを切断できませんでした。 | ブレークアウト ルームから手動で退出する場合は、セクション Leave breakout room で定義されている手順に従います。 |
412 | 46260 | UnexpectedClientError | ブレークアウト ルームはまだ割り当てられていないため、参加できません。 | 割り当てられたブレークアウト ルームの詳細が breakoutRoomsFeature.assignedBreakoutRoom にあることを確認してください。 assignedBreakoutRoom の state が open で、breakoutRoomsFeature.assignedBreakoutRoom.join() メソッドが明示的に呼び出されることを確認してください。 |
412 | 46261 | UnexpectedClientError | メイン会議に参加できません。 | breakoutRoomsFeature.assignedBreakoutRoom.returnToMainMeeting() メソッドを呼び出して、もう一度やり直してください。 問題が解決しない場合は、ブラウザー コンソール ログを収集し、Azure Communication Services サポートにお問い合わせください。 |
412 | 46262 | ExpectedError | メイン会議に既に含まれています。 | このメソッドは、参加者がブレークアウト ルームにいてメイン会議から削除された場合にのみ呼び出してください。 |
412 | 46263 | UnexpectedClientError | 既存のブレークアウト ルームの通話の切断に失敗しました。 | もう一度 hangup() メソッドを呼び出して、呼び出しを切断してみてください。 join() メソッドを呼び出して、ブレークアウト ルームにもう一度参加します。 |