LWC の Platform Event Listener が受信しない?原因と解決策

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 を確認

コメント