apex:actionPollerとは。
指定した間隔に従って AJAX 要求をサーバに送信するタイマー。
画面からの処理だが、件数が多い場合はガバナをクリアするため、
バッチで処理をさせる場合があるのですが、
バッチはオンライン処理と違い、処理の終了を画面側に返してくれません。
今回やりたかったことは
・ボタンからバッチ処理を開始する
・バッチ処理中は画面全体が非活性化される
・バッチ処理が完了したら画面が活性化されバッチの処理結果で画面を更新
apex:actionPollerでバッチ処理の状態を監視することで実現できました。
方法は以下。
・まずapex:commandButtonの押下処理でバッチ処理を開始。※このときonclick属性で画面の非活性化を行います。
・apex:actionPollerでrerenderの中の状態判定用javascriptを再描画(再実行)する。
・バッチが完了していたらapex:actionFunctionで画面再描画。
ソースはこんな感じ。
-
<apex:commandButton action="{!バッチ開始処理メソッド}" onclick="画面非活性化処理" rerender="panel"/>
-
<apex:outputPanel id="panel">
-
<apex:actionPoller action="{!バッチ監視処理}" enabled="{!バッチ処理中フラグ}" interval="10" rerender="panel"/>
-
<script>
-
function onChecked(){
-
if({!バッチ完了フラグ}) isComplete();
-
}
-
onChecked();
-
</script>
-
</apex:outputPanel>
-
<apex:actionFunction action="{!画面再描画処理メソッド}" name="isComplete"/>
バッチがエラーで終わった際の対策も入れておく必要があります。
その他のSalesforce記事
VisualforceでcommandButtonにrerender属性を設定して、 oncompleteにコールバック処理を記載したら動作してくれない。