Aviso:

Para brindarle información de soporte completa de manera más rápida, el contenido de esta página ha sido traducido al español mediante traducción automática. Para consultar la información de soporte más precisa, consulte la versión en inglés de este contenido.

Configurar la Job Function

A continuación, comenzaremos a codificar la aplicación de noticias configurando el componente de job function.

El directorio de la función, en este caso functions/NewsFetch, contiene:

  • El archivo principal de función FetchNews.java
  • El archivo de configuración catalyst-config.json
  • Archivos de biblioteca Java en la carpeta lib
  • Archivos de dependencias .classpath y .project

Agregaremos código en el archivo FetchNews.java. No modificarás el código de los archivos de configuración y dependencias.

Como se mencionó en la introducción, la job function realiza dos tareas: hacer las llamadas API a la NewsAPI para obtener noticias, y poblar las noticias en el Data Store de Catalyst. Las llamadas API se realizan usando una clave API proporcionada por NewsAPI.

Registrarse en NewsAPI

Antes de codificar la job function, debes registrarte para una suscripción gratuita de desarrollador con NewsAPI y obtener la clave API de la siguiente manera:

  1. Visita https://newsapi.org/register.

  2. Proporciona los detalles requeridos y haz clic en Submit. register-api-key

Después de completar tu registro, NewsAPI te proporcionará una clave API. Debes usarla en tu función cron, como se indica después de la sección de código.

api-key

Agregar código de la función

Puedes copiar el código a continuación y pegarlo en FetchNews.java ubicado en el directorio functions/NewsFetch de tu proyecto y guardar el archivo. Puedes usar cualquier IDE para trabajar con los archivos de la aplicación.

Nota: Por favor revisa el código proporcionado en esta sección para asegurarte de comprenderlo completamente.
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());
    // Nombres de tablas para cada categoría
    static String[] TABLENAME = { "HEADLINES", "BUSINESS", "ENTERTAINMENT", "HEALTH", "SCIENCE", "SPORTS", "TECHNOLOGY" };
    static String COUNTRY = "US"; 
    static String APIKEY = "cc30ddcae1684e848f08ed474f6aaf0e"; // Proporciona la clave API que obtuviste de NewsAPI dentro de las comillas
    @Override
    public JOB_STATUS handleJobExecute(JobRequest request, Context context) throws Exception {
        try {
            ZCProject.initProject();
            OkHttpClient client = new OkHttpClient();
            // Obtener noticias para cada categoría
            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]);
        // Recorrer los artículos disponibles de forma segura (máximo 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

Nota: Después de copiar y pegar este código en tu archivo de función, asegúrate de reemplazar el valor de APIKEY en la línea 26 con la clave API que obtuviste de NewsAPI.

La job function ahora está configurada. Discutiremos la arquitectura de la aplicación después de configurar el client.

Última actualización 2026-03-20 21:51:56 +0530 IST

ENLACES RELACIONADOS

Job Scheduling Job Functions