お知らせ:

当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の英語版を参照してください。

Job Functionの設定

次に、Job Functionコンポーネントを設定して、ニュースアプリケーションのコーディングを開始します。

この関数のディレクトリ(functions/NewsFetch)には以下が含まれています:

  • FetchNews.javaメイン関数ファイル
  • catalyst-config.json設定ファイル
  • libフォルダ内のJavaライブラリファイル
  • .classpathおよび.project依存関係ファイル

FetchNews.javaファイルにコードを追加します。設定ファイルや依存関係ファイルのコードは変更しません。

はじめにで説明した通り、Job Functionは2つのタスクを実行します:NewsAPIへのAPI呼び出しによるニュース取得と、Catalyst Data Storeへのニュースの格納です。API呼び出しは、NewsAPIが提供するAPIキーを使用して行われます。

NewsAPIへの登録

Job Functionのコーディングを行う前に、NewsAPIの無料開発者サブスクリプションに登録し、以下の方法でAPIキーを取得する必要があります:

  1. https://newsapi.org/registerにアクセスします。

  2. 必要な情報を入力し、Submitをクリックします。 register-api-key

登録が完了すると、NewsAPIからAPIキーが提供されます。コードセクションの後の指示に従って、このキーをCron関数で使用する必要があります。

api-key

関数コードの追加

以下のコードをコピーして、プロジェクトのfunctions/NewsFetchディレクトリにあるFetchNews.javaに貼り付けてファイルを保存します。アプリケーションのファイルの操作には任意のIDEを使用できます。

Note: このセクションに記載されているコードを十分に理解するために、必ず目を通してください。
FetchNews.java
copy
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.catalyst.Context;
import com.catalyst.job.JOB_STATUS;
import com.catalyst.job.JobRequest;
import com.catalyst.job.CatalystJobHandler;
import com.zc.common.ZCProject;
import com.zc.component.object.ZCObject;
import com.zc.component.object.ZCRowObject;
import com.zc.component.object.ZCTable;
import com.zc.component.zcql.ZCQL;
import org.json.JSONArray;
import org.json.JSONObject;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class FetchNews implements CatalystJobHandler {
    private static final Logger LOGGER = Logger.getLogger(FetchNews.class.getName());
    // 各カテゴリのテーブル名
    static String[] TABLENAME = { "HEADLINES", "BUSINESS", "ENTERTAINMENT", "HEALTH", "SCIENCE", "SPORTS", "TECHNOLOGY" };
    static String COUNTRY = "US"; 
    static String APIKEY = "cc30ddcae1684e848f08ed474f6aaf0e"; // NewsAPIから取得したAPIキーを引用符内に入力してください
    @Override
    public JOB_STATUS handleJobExecute(JobRequest request, Context context) throws Exception {
        try {
            ZCProject.initProject();
            OkHttpClient client = new OkHttpClient();
            // 各カテゴリのニュースを取得
            for (int i = 0; i < TABLENAME.length; i++) {
                HttpUrl.Builder urlBuilder = HttpUrl.parse("http://newsapi.org/v2/top-headlines").newBuilder();
                urlBuilder.addQueryParameter("country", COUNTRY);
                urlBuilder.addQueryParameter("apiKey", APIKEY);
                if (!TABLENAME[i].equals("HEADLINES")) {
                    urlBuilder.addQueryParameter("category", TABLENAME[i]);
                }
                String url = urlBuilder.build().toString();
                Request requests = new Request.Builder().url(url).build();
                Response response = client.newCall(requests).execute();
                if (response.code() == 200) {
                    JSONObject responseObject = new JSONObject(response.body().string());
                    JSONArray responseArray = responseObject.getJSONArray("articles");
                    pushNewstoDatastore(responseArray, i);
                } else {
                    LOGGER.log(Level.SEVERE, "Error fetching data from News API for " + TABLENAME[i]);
                }
                LOGGER.log(Level.INFO, "News updated for " + TABLENAME[i]);
            }
        } catch (Exception e) {
            LOGGER.log(Level.SEVERE, "Exception in Job Function", e);
            return JOB_STATUS.FAILURE;
        }
        return JOB_STATUS.SUCCESS;
    }
    private void pushNewstoDatastore(JSONArray responseArray, int length) throws Exception {
        String action = null;
        String query = "select ROWID from " + TABLENAME[length];
        ArrayList<ZCRowObject> rowList = ZCQL.getInstance().executeQuery(query);
        ZCObject object = ZCObject.getInstance();
        ZCTable table = object.getTable(TABLENAME[length]);
        // 利用可能な記事を安全にループ(最大15件)
        for (int i = 0; i < responseArray.length() && i < 15; i++) {
            JSONObject response = responseArray.getJSONObject(i);
            String title = response.optString("title", "No Title").replaceAll("'", "");
            String url = response.optString("url", "No URL");
            ZCRowObject row = ZCRowObject.getInstance();
            row.set("title", title);
            row.set("url", url);
            if (rowList.size() > i) {
                String rowid = rowList.get(i).get("ROWID").toString();
                Long ID = Long.parseLong(rowid);
                row.set("ROWID", ID);
                String upd = "Update " + TABLENAME[length] +
                             " set title = '" + title + "', url = '" + url + "' where ROWID = " + rowid;
                ZCQL.getInstance().executeQuery(upd);
                action = "Update";
            } else {
                table.insertRow(row);
                action = "Insert";
            }
        }
        if ("Update".equals(action)) {
            LOGGER.log(Level.INFO, TABLENAME[length] + " table updated with latest news");
        } else if ("Insert".equals(action)) {
            LOGGER.log(Level.INFO, TABLENAME[length] + " table inserted with new news");
        }
    }
}

View more

Note: このコードを関数ファイルにコピー&ペーストした後、26行目のAPIKEYの値を、NewsAPIから取得したAPIキーに必ず置き換えてください。

Job Functionの設定が完了しました。クライアントの設定後にアプリケーションのアーキテクチャについて説明します。

最終更新日 2026-02-23 18:09:41 +0530 IST

関連リンク

Job Scheduling Job Functions