Webアプリケーションは現代に不可欠なツールです。マシンとプロセッサーがより強力になるにつれ、Webアプリケーションは常にパフォーマンス要件を満たさなくてはなりません。4D v18 R6 で、4D Webサーバーが新しいタイプの Webセッション、スケーラブル Web セッション を提供するのはこのためです。
では、詳しく見ていきましょう。
以前は、ストラクチャー設定の Webページにある自動セッション管理オプションを使っていました。サーバー上でセッションデータを保持できるのは便利でした。
4D の Webサーバーはプリエンプティブで、利用可能なすべてのコアを活用して Webプロセスに応答できますが、各セッション (エンドユーザーからのブラウザーを表す) は単一のプロセスで処理されるため、このブラウザーから一度に来る複数のリクエストは、一つずつ順番に処理されていました。
しかし、スケーラブルWebセッションでは、プリエンプティブモードで複数プロセスを処理できます。つまり、スケーラブルWebセッションは、複数のユーザーエージェントのリクエストを同時に処理できるのです。これにより、パフォーマンスが大幅に向上します。
そして、それだけではありません! この新しいスケーラブルWebセッションは、これらのプロセス間でデータを共有することができます。
スケーラブルWebセッションで作業する
さっそく新しいスケーラブルWebセッションを使いたいですか? これほど簡単なことはありません。新しい Web の設定を有効にして、Webサーバーを起動するだけです。
スケーラブルWebセッションは、オブジェクトを介して扱います
この設定を有効にすると、オブジェクトを介してセッションを操作することができます。新しい Sessionコマンドはこのオブジェクトを返します。
On Web Authentication / On Web Connectionなどのデータベースメソッド、4Dタグ、4Dアクション、REST関数 (ORDAデータモデルクラス) によってトリガーされるすべての Webプロセスでこのオブジェクトは利用可能です。
このオブジェクトのおかげで、Webセッションの多くの事柄を扱うことができます。
以下は、デバッガーで見ることのできる例です:
プロセス間でデータを共有する
この Sessionオブジェクトは 共有オブジェクト である storageプロパティを持ちます。ユーザーエージェントから来るリクエスト間で共有したいデータは、セッション上の storageプロパティに格納できます。
例
CRM アプリケーションを例に見ていきましょう。各営業担当者は自分の顧客ポートフォリオを管理します。データベースには、リンクされた 2つのデータクラスが含まれています。Customers と SalesPersons です (一人の営業担当者が複数の顧客を持ちます)。
あなたのマシン (IP) で、HTTPSポート (port) を使って Webサーバーを起動したとします。
営業担当者が Webブラウザーで IP:port/4DACTION/authenticate?userId=1 という URL を入力すると、authenticate メソッドが呼び出されます。
営業担当者の上位3顧客がセッションに保存されます。以下は、authenticate メソッドのコードです:
var $indexUserId : Integer
var $userId : Integer
var $info : Object
var $userTop3 : cs.CustomersSelection
var $sales : cs.SalesPersonsEntity
ARRAY TEXT($anames; 0)
ARRAY TEXT($avalues; 0)
WEB GET VARIABLES($anames; $avalues)
$indexUserId:=Find in array($anames; "userId")
$userId:=Num($avalues{$indexUserId})
$sales:=ds.SalesPersons.query("userId = :1"; $userId).first()
If ($sales#Null)
Use (Session.storage)
If (Session.storage.myTop3=Null)
$userTop3:=$sales.customers.orderBy("totalPurchase desc").slice(0; 3)
Session.storage.myTop3:=$userTop3
End if
End use
end if
WEB SEND HTTP REDIRECT("/sessionStorage.shtml")
次に、この上位3顧客は、ユーザーエージェントから来るすべてリクエストで (たとえば、SHTMLページで) アクセスできるようになっています:
<center><h3>Your top 3 customers</h3></center>
<table class="table">
<!--#4DCODE
$i:=0
$myTop3:=Session.storage.myTop3
-->
<tr><th>Name</th><th>Total purchase</th></tr>
<!--#4DLOOP ($i<$myTop3.length)-->
<tr>
<td ><!--#4DTEXT $myTop3[$i].name--></td>
<td ><center><!--#4DTEXT $myTop3[$i].totalPurchase--></center></td>
</tr>
<!--#4DEVAL $i:=$i+1-->
<!--#4DENDLOOP-->
</table>
そして、その結果がこちらです:
今後の展開
私たちは、将来のために正確な権限管理に取り組んでいます。そうすれば、権限に応じてデータへのアクセスや操作を許可することができるようになります。
現在は、setPrivileges()関数を使って、ユーザーの情報をセッションに格納することができます。この関数は、権限に対してさらなるアクションを扱えるように将来のリリースで拡張される予定です。
例
var $indexUserId : Integer
var $userId : Integer
var $sales : cs.SalesPersonsEntity
var $info : Object
ARRAY TEXT($anames; 0)
ARRAY TEXT($avalues; 0)
WEB GET VARIABLES($anames; $avalues)
$indexUserId:=Find in array($anames; "userId")
$userId:=Num($avalues{$indexUserId})
$sales:=ds.SalesPersons.query("userId = :1"; $userId).first()
$info:=New object()
$info.userName:=$sales.firstname+" "+$sales.lastname
Session.setPrivileges($info)
つまり、下のコードを追加することで、Webページをカスタマイズすることができるのです:
<center>
<h3>
Hello <!--#4DEVAL Choose(Session.userName # ""; Session.userName; "nobody")-->
</h3>
</center>
以下はその結果です:
デバッガーのスクリーンショットで気づいたかもしれませんが、スケーラブル Web セッションは 60分間非アクティブ状態 (つまり、セッションを要求するリクエストがない) が続くと終了 (タイムアウト) します。
上記の HDI をダウンロードして、4Dフォーラムでの議論に参加してください。