--- title: "Job Functionの設定" url: https://docs.catalyst.zoho.com/ja/tutorials/newsapp/java/configure-job-function/ description: "Catalyst Job Scheduling Cronコンポーネントと、Javaで記述されたJob FunctionおよびAdvanced I/O Functionを使用して、サードパーティサービスから定期的にニュースを自動取得するWebニュースアプリケーションを構築します。" last_updated: 2026-08-17T12:16:04Z service: All Services type: tutorial related_links: - name: "Job Scheduling" url: /ja/job-scheduling/getting-started/introduction/ - name: "Job Functions" url: /ja/serverless/help/functions/job-functions/ --- # Job Functionの設定 次に、Job Functionコンポーネントを設定して、ニュースアプリケーションのコーディングを開始します。 この関数のディレクトリ(`functions/NewsFetch`)には以下が含まれています: * `FetchNews.java`メイン関数ファイル * `catalyst-config.json`設定ファイル * `lib`フォルダ内のJavaライブラリファイル * `.classpath`および`.project`依存関係ファイル `FetchNews.java`ファイルにコードを追加します。設定ファイルや依存関係ファイルのコードは変更しません。 [はじめに](https://docs.catalyst.zoho.com/ja/tutorials/newsapp/java/introduction/)で説明した通り、Job Functionは2つのタスクを実行します:[NewsAPI](https://newsapi.org/)へのAPI呼び出しによるニュース取得と、Catalyst Data Storeへのニュースの格納です。API呼び出しは、NewsAPIが提供するAPIキーを使用して行われます。 ### NewsAPIへの登録 Job Functionのコーディングを行う前に、NewsAPIの無料開発者サブスクリプションに登録し、以下の方法でAPIキーを取得する必要があります: 1. [https://newsapi.org/register](https://newsapi.org/register)にアクセスします。 2. 必要な情報を入力し、**Submit**をクリックします。 ![register-api-key](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/register-api-key.webp) 登録が完了すると、NewsAPIからAPIキーが提供されます。コードセクションの後の指示に従って、このキーをCron関数で使用する必要があります。 ![api-key](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/api-key.webp) ### 関数コードの追加 以下のコードをコピーして、プロジェクトの`functions/NewsFetch`ディレクトリにある`FetchNews.java`に貼り付けてファイルを保存します。アプリケーションのファイルの操作には任意のIDEを使用できます。 > **Note**: このセクションに記載されているコードを十分に理解するために、必ず目を通してください。 **FetchNews.java** ```java 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の設定が完了しました。クライアントの設定後にアプリケーションのアーキテクチャについて説明します。