SFストリーミングAPIを試してみた

salesforceのストリーミングAPIを利用すればプッシュ通知のようなものを作成できる、ということで試してみた。

仕組み

Long pollingと呼ばれる技術が使用されているよう。
仕組みとしては以下がわかりやすかった。

1.クライアントからは従来のポーリング同様に、サーバに対して要求を発行
2.サーバ側はその要求に対して即時に応答を返さず、ずっと掴んだままにしておく
3.サーバ側でイベントの発生を検知したら、それまで掴みっぱなしになっていた複数の要求に対して一斉に応答を返す
4.応答を受信したブラウザはすぐに次の要求を再発行して、ふたたび応答待ちの状態へと戻る
⇒ 結果的にサーバからのプッシュ通知が行われたような動作になります。
http://www.terrasky.co.jp/blog/?p=802#sthash.HrI4ITMg.dpuf

流れ

作成の手順は以下。

  1. オブジェクトの作成(設定)
  2. PushTopicの作成
  3. PushTopicをチャンネルに登録、テスト

1.オブジェクトの作成(設定)

プッシュするためのオブジェクトとして今回は以下のカスタムオブジェクトを使用した。

オブジェクト名:CustomMessage
プッシュ内容:未読(Unread__c)のチェックボックスがtrueになればプッシュ通知

2.PushTopicの作成

PushTopicは管理画面上からは作成出来ないよう。
開発者コンソールから直接レコードを作成する。

実行させたコードは以下。

1
2
3
4
5
6
7
8
9
PushTopic pushTopic = new PushTopic();
pushTopic.Name = 'UnreadNotification';
pushTopic.Query = 'SELECT Id, Unread__c FROM CustomMessage__c';
pushTopic.NotifyForOperationCreate = true;
pushTopic.NotifyForOperationUpdate = true;
pushTopic.NotifyForOperationUndelete = false;
pushTopic.NotifyForOperationDelete = false;
pushTopic.ApiVersion = 32.0;
insert pushTopic;

NotifyForOperationsNotifyForFieldsは変更出来ない、と怒られた。

通知タイミング

レコードがどうなった時に通知するかを、NotifyForOperationCreate等で設定している。
(これらはデフォルトではtrue)

項目 内容
NotifyForOperationCreate 作成
NotifyForOperationUpdate 更新
NotifyForOperationUndelete 復元
NotifyForOperationDelete 削除

実行後、SOQLで参照してみた。

通知対象

NotifyForFieldsは設定出来ない、と怒られたが、ここはデフォルトではReferencedになっている。
これは、指定したクエリのSELECT句とWHERE句、両方を通知対象とする、という意味のよう。
これをSELECT句だけを対象に、とも出来るのだとか。

今回はSELECTに指定した、Unread__cが作成、更新されると通知される。
(WHERE句がないので、全てのレコード対象)

またこのSELECT句には必ずIDを含める必要があるとのこと。

3.PushTopicをチャンネルに登録、テスト

登録

以下にアクセス。
https://workbench.developerforce.com/login.php

これは、デモ目的でのみ利用可能な、Salesforceから提供されている、ワークベンチのホスト型インスタンス、だそう。
本番利用の際は自前で、ワークベンチの設定が必要なのだとか。
(この辺は未調査)

EnvironmentProductionを選択した。
API Version32を選択。(33はなかった)

規約に同意して、Login with Salesforceをクリック。
承認を求められるので、許可をクリック。

Jump to:で、Streaming Push Topicsを選択。
selectをクリック。

次の画面で接続が行われる。
Push Topicで先程作成した、PushTopicを選択。
デフォルトでは登録されていない状態っぽいので、Subscribeボタンをクリックして登録しておく。
その状態でブラウザを開いたままにしておく。

テスト

新しいウインドウで、再度以下にアクセスし、同じくProductionのバージョン32でログイン。
https://workbench.developerforce.com/login.php

上部メニューのdataから、Insertをクリック。

Object Typeで対象のカスタムオブジェクト(CustomMessage__c)を選択し、Nextをクリック。

オブジェクトをインサートするための情報を入力。
OwinIDは入力しなくても大丈夫だった。

Commit Insertをクリックするとインサートが完了する。

すると、先程開いていた画面に内容が(ほぼ)リアルタイムに通知される。

sobjectには、PushTopicのSELECT句で設定した項目が入っている。

このレコードの作成はこのworkbench上からわざわざ作業しなくても、Salesfroceから直接レコードを新規で作成しても受信は問題なくできた。
あとは、Visualforceのコードに組み込めば受信ページを作れるよう。

制限

色々と制限があるよう。詳しくは以下の記事の最後のほうの表を参照。
http://www.terrasky.co.jp/blog/?p=802

トピック数が20、とか、登録者数が20、とか、結構厳しい。
そもそも、Visualforceでの利用で、SFのアカウントを持っている人が通知を受け取るページを開発するのに使用する事を前提としているっぽい。
通常のwebサービスでSFからの通知を受け取るのに利用出来るかと思って調べていたのだが、どうも違うようだった。

参考

ワークベンチを使用したクイックスタート | Force.com ストリーミング API 開発者ガイド | Salesforce Developers
SFDC:Streaming API 試してみました – tyoshikawa1106のブログ
10分で分かる!使える!ストリーミング API « TerraSky Tech Blog

   このエントリーをはてなブックマークに追加