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キーを取得する必要があります:
-
https://newsapi.org/registerにアクセスします。
登録が完了すると、NewsAPIからAPIキーが提供されます。コードセクションの後の指示に従って、このキーをCron関数で使用する必要があります。
関数コードの追加
以下のコードをコピーして、プロジェクトの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");
}
}
}
Note: このコードを関数ファイルにコピー&ペーストした後、26行目のAPIKEYの値を、NewsAPIから取得したAPIキーに必ず置き換えてください。
Job Functionの設定が完了しました。クライアントの設定後にアプリケーションのアーキテクチャについて説明します。
最終更新日 2026-02-23 18:09:41 +0530 IST

