- リンクを取得
- ×
- メール
- 他のアプリ
- リンクを取得
- ×
- メール
- 他のアプリ
LWC の Platform Event Listener が不安定に受信する原因と解決策
🔹 はじめに
Salesforce の Platform Event は、リアルタイムデータのストリーミングに最適な機能ですが、LWC (Lightning Web Components) でリスナーを実装すると イベントが不安定に受信される ケースがあります。
「特定のイベントが受信されない」「一度受信した後に再度受信できない」 などの問題が発生する場合、考えられる原因はいくつかあります。
本記事では、考えられる 原因 と 解決策 を詳しく解説します。
🔹 LWC の Platform Event 受信の仕組み
LWC で Platform Event を受信するには、 EMP API (Event Monitoring API) を使用して購読 (subscribe) する必要があります。
しかし、購読のタイミングやコンポーネントのライフサイクルによって、イベントを正しく受信できないことがあります。
🔹 受信できない原因と解決策
1️⃣ Platform Event の購読タイミング
✅ 原因
EMP API は、購読が確立された後に発行されたイベント しか配信しません。
そのため、LWC のコンポーネントが 購読前に Platform Event が発行された場合、受信されません。
🔧 解決策
- LWC が確実に購読された後にイベントを発行する。
- コンソールログを追加して 購読のタイミングを確認 する。
ログを追加する例:
registerListener() { console.log('購読を開始: ', this.channelName); subscribe(this.channelName, -1, (message) => { console.log('イベントを受信:', JSON.stringify(message)); this.handleEvent(message); }) .then(response => { console.log('購読成功:', response); this.subscription = response; }) .catch(error => { console.error('購読失敗:', error); }); onError(error => { console.error('EMP API エラー:', JSON.stringify(error)); }); }
2️⃣ LWC の Navigation による購読の中断
✅ 原因
LWC が Lightning レコードページ上で動作している場合、異なるレコードに移動しても connectedCallback()
が再実行されないことがあります。
その結果、前の購読が解除されず、新しい購読が開始されない ため、イベントを受信できません。
🔧 解決策
recordId の変更を検知し、購読をリセットする。
import { LightningElement, api, wire } from 'lwc'; import { CurrentPageReference } from 'lightning/navigation'; export default class JobUpdateListener extends LightningElement { @api recordId; currentRecordId; @wire(CurrentPageReference) setCurrentPageReference(pageRef) { if (pageRef && pageRef.state && pageRef.state.recordId) { if (this.currentRecordId !== pageRef.state.recordId) { this.currentRecordId = pageRef.state.recordId; this.unregisterListener(); // 既存の購読を解除 this.registerListener(); // 新しい購読を開始 } } } }
この実装により、レコードが切り替わるたびに購読がリセットされるため、確実に最新のイベントを受信できます。
3️⃣ Unsubscribe の処理が適切でない
✅ 原因
unsubscribe()
を呼び出す前に、購読オブジェクトが有効かどうかを確認しないと、正しく解除できない場合があります。
🔧 解決策
購読オブジェクトが存在するかどうかをチェックしてから unsubscribe()
を実行する。
if (this.subscription && this.subscription.id) { unsubscribe(this.subscription, response => { console.log('購読解除成功:', response); }).catch(error => console.error('購読解除失敗:', error)); }
4️⃣ Platform Event のデータが古すぎる
✅ 原因
Salesforce の Platform Event は 最大 24 時間しか保持されません。
そのため、24 時間以上前のイベントは受信できません。
🔧 解決策
常に 最新のイベントを発行してテストする。
5️⃣ WebSocket のブロック(ネットワーク問題)
✅ 原因
ブラウザの拡張機能(MavensMate, Salesforce Inspector, AdBlock など)が WebSocket 通信を妨害することがあります。
🔧 解決策
- 開発者ツールの「Console」と「Network (WS)」タブを確認 し、WebSocket が正しく動作しているかチェックする。
- プライベートウィンドウ(シークレットモード)で実行 し、ブラウザ拡張機能の影響を受けない環境で試す。
🔹 まとめ
問題 | 解決策 |
---|---|
購読のタイミング | 購読後にイベントを発行する & ログを追加 |
ナビゲーションによる中断 | recordId の変更を検知して再購読 |
購読の解除に失敗 | 購読オブジェクトの有効性をチェックしてから解除 |
古いイベントが取得できない | 最新のイベントを発行してテスト |
ネットワークの問題 | 開発者ツールの「Network」タブで WebSocket を確認 |
コメント
コメントを投稿