Pivotal Knowledge Base

フォローする

Function Execution コールのタイムアウト設定

適用範囲

GemFire 8.1 にて動作確認済み

目的

GemFire における Function Execution フレームワークで、クライアントが結果を待つ間に "タイムアウト" させる方法について記載する。

解決策

現状の Function Execution フレームワークを使って、GemFire クライアントは、GemFire サーバー側で、GemFire サーバースレッドを用いて実行可能なコードを投入することができる。GemFire の Java API ドキュメント(GemFire Java API)で Execution インターフェースを見ると、引数に、実行したい Function の ID をとることができる execute() というメソッドがある。例えば、"com.pivotal.bookshop.functions.FindCustomerByCity" という ID で GemFire サーバーに登録され、サーバークラスパスに追加された Function をコールするような、以下の FunctionExecutor というクラスを記述するものとする。

public class FunctionExecutor {
	private ApplicationContext appContext;
	private Region<Integer, Customer> cusRegion;
	
	public static void main(String[] args) {
		FunctionExecutor exe = new FunctionExecutor();
		exe.getCustomerRegion();
		exe.execute();
	}
	
	public void execute(){
		Execution exe = FunctionService.onRegion(cusRegion).withArgs("San Francisco");
		ResultCollector result = exe.execute("com.pivotal.bookshop.functions.FindCustomerByCity");
		System.out.println("Result :"+result.getResult());
	}

	private void getCustomerRegion(){
		appContext = new ClassPathXmlApplicationContext("META-INF/spring/gemfire/spring-client-cache-config.xml");
		this.cusRegion = appContext.getBean("Customer",Region.class);
		
	}
}

上述の execute() メソッドのコードを見ると、最初の行で、Function 実行対象となる "リージョン" を定義する一方で、オプションで任意の変数を渡し、Execution オブジェクトを生成している。

Execution exe = FunctionService.onRegion(cusRegion).withArgs("San Francisco");

その後、GemFire サーバー側で Function を実行するために、Execution クラスに対してコールしている。これは、ブロッキングコールとなり、execute() メソッドは、当該メソッドを実行する全てのサーバーから全ての結果を取得するまで待ち続ける。GemFire 8.1 においては、この execute() メソッドの待ち状態にタイムアウトを設定可能とするシステムプロパティーが導入された。この機能は、内部的にサーバーに対してオープンされたソケットにタイムアウト値を設定することによって実現している。プロパティー名は "gemfire.CLIENT_FUNCTION_TIMEOUT" で、ミリ秒単位でタイムアウト値を設定する。

ResultCollector result = exe.execute("com.pivotal.bookshop.functions.FindCustomerByCity");

その後、結果を取得するため、新規に生成した ResultCollector オブジェクトをコールしている。このコールは、全ての結果を順次取得するが、取得方法についてユーザーが独自に実装することも可能である。

result.getResult(timeout, TimeUnit)

上述のコールで結果を取得する場合は、タイムアウトが発生すると、ユーザー実装でハンドル可能な、FunctionException をスローする。

 

コメント

Powered by Zendesk