【Delphi Sample】Delphi と Google App Engine と Thrift と Java その2
【Delphi Sample】Delphi と Google App Engine と Thrift と Java その2
Google App Engine(GAE/J)
とDelphi
間をApache Thrift
を使って通信するサンプルの第2回目です。今回はサーバー側の実装を進めます。
サーバーアプリケーション
Google App EngineではSpringやSparkといったWebフレームワークを利用することができますが、Thriftがインターフェイスを担ってくれるため今回はシンプルにServletとして実装を進めます。Servletの実装は公式のサンプルが参考になります。
フォルダ構成
まずはフォルダ構成を見ていきましょう。公式のサンプルに合わせてフォルダ構成を整えていきます。gen-java
に自動生成されたファイル群はcom.example.thrift
に配置しています。前回も書きましたが、場所の調整はIDL
のnamespace
で行うことができます。
コーディング
サーバー側でコーディングが必要なのはWebでの受け口と実際の処理を行う部分です。
CalculatorHandler.java
まずは受け口を見ていきましょう。@WebServlet
を利用して、クラスとURLをマッピングします。もちろんweb.xml
に記述する方法でも構いません。
プロトコルにはTBinaryProtocol
を利用しています。これは計算量(CPU資源)をできるだけ抑えたいと考えたからです。データ量を削減したいという場合はTCompactProtocol
を使ってください。両者の比較を行ってくれている方もいました。
package com.example.handler;
import com.example.service.CalculatorServiceImpl;
import com.example.thrift.CalculatorService;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServlet;
import javax.servlet.annotation.WebServlet;
@WebServlet(name = "CalculatorHandler", urlPatterns = "/calculator")
public class CalculatorHandler extends TServlet {
public CalculatorHandler() {
super(new CalculatorService.Processor<>(new CalculatorServiceImpl()), new TBinaryProtocol.Factory());
}
}
CalculatorServiceImpl.java
次に、実際の処理を行う部分を見ていきましょう。自動生成されたコード中のIface
を実装します。Thrift
のIDL
で記述した内容がすべて盛り込まれているため、あとは処理の中身を実装していくだけです。
前回お話しした除算時のゼロ除算の例外処理もここで行います。
IDL
で宣言した型情報が言語に合わせた形でコード生成されていることに注目してください。型も意識しつつインターフェイス設計するのがよさそうです。
package com.example.service;
import com.example.thrift.CalculatorService;
import com.example.thrift.TInvalidParameterException;
import org.apache.thrift.TException;
public class CalculatorServiceImpl implements CalculatorService.Iface {
@Override
public int add(int param1, int param2) throws TException {
return param1 + param2;
}
@Override
public int sub(int param1, int param2) throws TException {
return param1 - param2;
}
@Override
public int mul(int param1, int param2) throws TException {
return param1 * param2;
}
@Override
public int div(int param1, int param2) throws TInvalidParameterException {
if (param2 == 0){
throw new TInvalidParameterException("Divide by Zero.");
}
return param1 / param2;
}
}
コメント
コメントを投稿