【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ではSpringSparkといったWebフレームワークを利用することができますが、Thriftがインターフェイスを担ってくれるため今回はシンプルにServletとして実装を進めます。Servletの実装は公式のサンプルが参考になります。

フォルダ構成

まずはフォルダ構成を見ていきましょう。公式のサンプルに合わせてフォルダ構成を整えていきます。gen-javaに自動生成されたファイル群はcom.example.thriftに配置しています。前回も書きましたが、場所の調整はIDLnamespaceで行うことができます。

コーディング

サーバー側でコーディングが必要なのは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を実装します。ThriftIDLで記述した内容がすべて盛り込まれているため、あとは処理の中身を実装していくだけです。
前回お話しした除算時のゼロ除算の例外処理もここで行います。

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;
    }
}

スポンサーリンク

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成

【Delphi Sample】並列プログラミング1