Visualforceページを一定間隔で自動更新して結果を表示する方法
処理の途中経過を画面に出し続けたいとき、ページ全体を作り直すリロードは重すぎます。Visualforceにはこのための部品があります。actionPollerの間隔設定と、ビューステートとの付き合いかたを書きます。
なぜ自動更新が要るのか
バッチや非同期処理の進み具合を、ユーザーが操作しなくても画面に反映したい場面があります。JavaScript remotingでApexを呼び、結果が返るたびにlocation.reload()でページ全体を読み込み直す方法も動きますが、毎回ページ全体の表示状態を作り直すため、一部の表示だけ更新したい用途には重すぎます。
Visualforceには、この用途のための標準コンポーネントapex:actionPollerがあります。指定した間隔でコントローラのメソッドを呼び、指定した範囲だけを再描画します。本記事はこちらを使う方法で書きます。
apex:actionPollerの仕組み
| 属性 | 役割 |
|---|---|
| action | 呼び出すコントローラのメソッド |
| interval | 呼び出す間隔(秒)。最小値は5秒、指定しない場合の既定値は60秒です |
| reRender | 再描画するコンポーネントのID |
| enabled | falseにすると呼び出しを止めます |
| status | 通信状態と連動させるapex:actionStatusのID |
⚠️ 公式ドキュメントは、actionPollerで呼ぶメソッドを軽量にするよう求めています。DMLや外部サービスの呼び出しのような重い処理をactionPoller経由で毎回実行すると、ポーリングのたびにその処理が走り、サーバー負荷とレスポンスの遅れにつながります。
Visualforceページを作る
<apex:page controller="VisualforcePagePeriodicProcessingCtrl" sidebar="false" showHeader="false"> <apex:form> <apex:actionPoller action="{!refresh}" interval="10" reRender="statusPanel" /> <apex:outputPanel id="statusPanel"> <div>Visualforceページの自動更新</div> <div>件数: <apex:outputText value="{!recordCount}" /></div> <div>ステータス: <apex:outputText value="{!statusLabel}" /></div> </apex:outputPanel> </apex:form> </apex:page>
10秒ごとにrefreshを呼び出し、statusPanelだけを再描画します。件数とステータスは、それぞれコントローラのプロパティから表示します。
Apexクラスを作る
public with sharing class VisualforcePagePeriodicProcessingCtrl { public Integer recordCount { get; private set; } public String statusLabel { get; private set; } public VisualforcePagePeriodicProcessingCtrl() { statusLabel = '開始'; } public void refresh() { List<Account> accs = [SELECT Id, Name FROM Account LIMIT 10]; recordCount = accs.size(); statusLabel = '取得件数 ' + recordCount + ' 件'; } }
actionPollerから呼ばれるたびにrefreshが実行され、getterで公開したプロパティの値が画面へ反映されます。DMLは行いません。
動作を確認する
ページを開く
「件数」と「ステータス」の表示が最初に1回出ます。
10秒待つ
actionPollerがrefreshを呼び出し、statusPanelの中身だけが書き換わります。ページ全体の再読み込みは起きません。
ブラウザの開発者ツールで通信を見る
10秒間隔でVisualforceのAjaxリクエストが送られていることを確認します。
ビューステートとの付き合いかた
Visualforceのビューステートには170KBの上限があります。actionPollerは呼び出すたびにビューステートをサーバーとやり取りするため、reRenderの範囲を絞り、ページが保持するデータを必要な分だけにすることがポイントです。transientキーワードを付けた変数はビューステートに含まれないので、次の呼び出しまで持ち越さなくてよい値はtransientにします。
ここで間違えやすい
| 間違い | 何が起きるか |
|---|---|
| intervalを5秒未満にする | 指定できません。最小値は5秒です |
| actionPollerのactionでDMLや外部コールを行う | 呼び出すたびにその処理が走り、サーバー負荷とレスポンス遅延が起きます |
| @RemoteActionメソッドをactionに指定する | actionPollerからは呼び出せません。通常のコントローラメソッドを使います |
| ページの保持データが多いままactionPollerで頻繁に更新する | ビューステートの上限(170KB)に近づきやすくなります |
確認した環境
- 2026年9月/Salesforce Summer '26(APIバージョン67.0)時点のVisualforce開発者ガイドで、actionPollerの属性とビューステートの上限を確認しています
まとめ
- Visualforceページの自動更新には、標準コンポーネントのapex:actionPollerを使います
- intervalの最小値は5秒、指定しないときの既定値は60秒です
- actionPollerで呼ぶメソッドは軽量にします。DMLや外部コールは避けます
- actionPollerのactionに指定できるのは通常のコントローラメソッドで、@RemoteActionは指定できません
- ビューステートの上限は170KBです。reRenderの範囲と保持データを絞ることが、快適に動かすポイントです
参考:当時の画面
記事を最初に書いた当時の画面です。いまの手順と違うところは、各画像の説明に書いています。
Salesforceの導入・運用についてご相談ください
導入前の検討から、お使いの環境の改修・運用、AIとの連携まで承ります。状況を伺ったうえで、進め方をご提案します。