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:
-
Visita https://newsapi.org/register.
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.
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.
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");
}
}
}
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

