[opencms-dev] Create a scheduled job from jsp
Luis Rodriguez Fernandez
luis.rodriguez at fundacionctic.org
Tue Sep 6 12:20:54 CEST 2005
Buenos días. Soy Luis Rodríguez Fernández, de la Fundación CTIC. Estoy tratando de crear un boletín de news para openCms, para ello pretendo tener una tarea programada que envíe correos con las noticias (contenidos estructurados de OpenCMS).
Tengo una clase que implementa el interfaz I_CmsScheduledJob. En el método launch lo que trato de hacer es cargar una serie de páginas jsp que serán las encargadas de construir dichos correos. La manera de cargarlas sería usando el método export de la clase CmsJspLoader. Como dicho método necesitaba de la request y la response encapsulé la creación de la tarea en una jsp, el código de la jsp es el siguiente:
<%@page import="org.opencms.main.CmsContextInfo,
org.opencms.scheduler.CmsScheduledJobInfo,
org.opencms.scheduler.CmsScheduleManager,
org.opencms.file.CmsObject,
org.opencms.jsp.CmsJspBean,
java.util.SortedMap,
java.util.TreeMap"%>
<%
CmsScheduledJobInfo csji = new CmsScheduledJobInfo();
CmsScheduleManager csm = new CmsScheduleManager();
CmsJspBean cjb = new CmsJspBean();
cjb.init(pageContext,request,response);
CmsObject cmsObj = cjb.getCmsObject();
CmsContextInfo cci = new CmsContextInfo(cjb.getRequestContext());
csji.setCronExpression("0 0/1 * * * ?");
csji.setClassName("org.fundacionctic.opencms.business.services.NewsLetterCmsScheduledJob");
csji.setActive(true);
csji.setContextInfo(cci);
csji.setJobName("boletin");
SortedMap parametros = new TreeMap();
parametros.put("request",request);
parametros.put("response",response);
csji.setParameters(parametros);
csm.initialize(cmsObj);
csm.scheduleJob(cmsObj,csji);
%>
La tarea efectivamente se ejecuta cada minuto, pero el problema viene en la implementación del método export de la clase CmsJspLoader.
El código del método launch es el siguiente:
public String launch(CmsObject arg0, Map arg1) throws Exception {
CmsJspLoader crl = new CmsJspLoader();
crl.setFlexCache(newCmsFlexCache(newCmsFlexCacheConfiguration()));
crl.initConfiguration();
I_CmsResourceCollector collector = OpenCms.getResourceManager()
.getContentCollector("singleFile");
List m_collectorResult = collector.getResults(arg0, "singleFile",
"/system/modules/org.opencms.fundacionctic.newsletter/elements/cabeceraBoletin.jsp");
CmsResource e = (CmsResource)m_collectorResult.get(0);
byte[] contenidoHtml = null;
HttpServletRequestWrapper hsrw = new HttpServletRequestWrapper((HttpServletRequest)arg1.get("request"));
HttpServletResponseWrapper hsrew = new HttpServletResponseWrapper((HttpServletResponse)arg1.get("response"));
contenidoHtml = crl.export(arg0,e,hsrw,hsrew);
String contenido = new String(contenidoHtml);
System.out.println(contenido);
return null;
}
Para probar pongo a mano el tipo de colector y el recurso que quiero cargar (system/modules/org.opencms.fundacionctic.newsletter/elements/cabeceraBoletin.jsp), más adelante haría esto configurable mediante un formulario (lo que en el fondo estoy haciendo es un imitar al manejador de tareas del OpenCMS).
Todo parece correcto pero al hacer el export me da la siguiente excepción:
java.lang.NullPointerException
at org.apache.coyote.tomcat5.CoyoteRequest.setAttribute(CoyoteRequest.java:1472)
at org.apache.coyote.tomcat5.CoyoteRequestFacade.setAttribute(CoyoteRequestFacade.java:351)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:283)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:283)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:283)
at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:283)
at org.opencms.flex.CmsFlexController.setController(CmsFlexController.java:277)
at org.opencms.loader.CmsJspLoader.getController(CmsJspLoader.java:561)
at org.opencms.loader.CmsJspLoader.export(CmsJspLoader.java:245)
at org.fundacionctic.opencms.business.services.NewsLetterCmsScheduledJob.launch(NewsLetterCmsScheduledJob.java:376)
at org.opencms.scheduler.CmsScheduleManager.execute(CmsScheduleManager.java:171)
at org.quartz.core.JobRunShell.run(JobRunShell.java:191)
En el fondo, el método que falla es este:
/**
* Stores the given controller in the given request (using a request attribute).<p>
*
* @param req the request where to store the controller in
* @param controller the controller to store
*/
public static void setController(ServletRequest req, CmsFlexController controller) {
req.setAttribute(CmsFlexController.ATTRIBUTE_NAME, controller);
}
Alguna idea?
Gracias y un saludo. Luis
More information about the opencms-dev
mailing list