Errors on Cron Job execution

Bonjour,

[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-10-14 23:22 (revision 3c63448f648587d9a89ec04d597946d26e4f7937)
Encoding=UTF-8
EndpointIP=172.17.0.4
EndpointURL=http://244663a571d9:8080
TimeZone=Europe/Paris
SystemDate=2020-11-05 10:19:04

[Application]
ApplicationVersion=0.16 dev
ContextPath=
ContextURL=https://ope.rfs.ope.aws.renault.com
ActiveSessions=1
TotalUsers=18
EnabledUsers=10
LastLoginDate=

[Server]
ServerInfo=Apache Tomcat/9.0.39
ServerType=WEB
User=root

[OS]
Name=Linux
Architecture=amd64
Version=4.14.186-110.268.amzn1.x86_64
SystemEncoding=UTF-8

J’ai un cron job:

Ce job devrait être lancé en automatique tous les jours à 18h pour générer des fichiers, en faisant appel à des méthodes de génération de fichiers.
Voici un exemple d’une méthode de génération du fichier:

public String generateInfoService() {
	Grant g = getGrant();
	ByteArrayOutputStream baos = null;
	SitesGenerateInfoServiceTCENL adf = (SitesGenerateInfoServiceTCENL) g.getTmpObject("SitesGenerateInfoServiceTCENL");
	BusinessObjectTool adfTool = new BusinessObjectTool(adf);
	acp = (SitesAccessPoint)getGrant().getTmpObject("SitesAccessPoint");
	acpTool = new BusinessObjectTool(acp);
	apa = (SitesAccessPointAttachment)getGrant().getTmpObject("SitesAccessPointAttachment");
	apaTool = new BusinessObjectTool(apa);
	aaa = (SitesAccessPointAttachmentAttribute)getGrant().getTmpObject("SitesAccessPointAttachmentAttribute");
	aaaTool = new BusinessObjectTool(aaa);
	api = (SitesAccessPointIdentifierValue) getGrant().getTmpObject("SitesAccessPointIdentifierValue");
	apiTool = new BusinessObjectTool(api);
	idt = (SitesIdentifierType) getGrant().getTmpObject("SitesIdentifierType");
	idtTool = new BusinessObjectTool(idt);
	
	try {
		
		baos = new ByteArrayOutputStream();
		StringBuilder content = new StringBuilder();
		idt.resetFilters();
		String idtId = idtTool.search(new JSONObject().put("sitesIdtName", "RAFT_CODE")).get(0)[0];
		apa.resetFilters();
		List<String[]> rowsApaIds = apaTool.search(new JSONObject().put("sitesApaType", "RAFT_EXCEPTION"));
		for (String[] rowsApaId: rowsApaIds) {
			String apaId = rowsApaId[0];
			apa.select(apaId);
			String acpId1 = apa.getFieldValue("sitesApaAcp1Id");
			String acpId2 = apa.getFieldValue("sitesApaAcp2Id");
			String apaEndDate = apa.getFieldValue("sitesApaEndDate");
			String raftCodeAcp1 = retrieveApiId(acpId1, idtId);
			String raftCodeAcp2 = retrieveApiId(acpId2, idtId);
			String factoryCode = "";
			aaa.resetFilters();
			List<String[]> rowsAaaIds = aaaTool.search(new JSONObject().put("sitesAaaApaId", apaId).put("sitesAaaType", "FACTORY_CODE"));
			if (rowsAaaIds.size() > 0) {
				String aaaId = rowsAaaIds.get(0)[0];
				aaa.select(aaaId);
				factoryCode = aaa.getFieldValue("sitesAaaValue");
			}
			if (!factoryCode.isEmpty() && "".equals(apaEndDate)) {
				charactersNumberControl(content, 10, "00" + raftCodeAcp1);
				String effectiveDate = apa.getFieldValue("sitesApaEffectiveDate");
				String enDate = "";
				if (effectiveDate.length() == 10) {
					String DD = effectiveDate.substring(8);
					String MM = effectiveDate.substring(5, 7);
					String YYYY = effectiveDate.substring(0, 4);
					enDate = DD + "." + MM + "." + YYYY;
				}
				charactersNumberControl(content, 10, enDate);
				charactersNumberControl(content, 8, factoryCode);
				charactersNumberControl(content, 10, "00" + raftCodeAcp2);
				String incoterm = "";
				aaa.resetFilters();
				rowsAaaIds = aaaTool.search(new JSONObject().put("sitesAaaApaId", apaId).put("sitesAaaType", "INCOTERM"));
				if (rowsAaaIds.size() > 0) {
					String aaaId = rowsAaaIds.get(0)[0];
					aaa.select(aaaId);
					incoterm = aaa.getFieldValue("sitesAaaValue");
				}
				charactersNumberControl(content, 3, incoterm);
				content.append(newLine);
			}
		}	

		String contentString = content.toString();
		baos.write(contentString.getBytes());
		adfTool.getForCreate();
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        AppLog.info(getClass(), "generateInfoService", "creation date = " + sdf.format(cal.getTime()), g);
        adf.setFieldValue("sitesGeneralDate", sdf.format(cal.getTime()));
		adf.getField("sitesGFile").setDocument(adf, "InfoServiceTCFile.txt", baos.toByteArray());
		adfTool.validateAndCreate();
		
		return contentString;
	}
	catch(Exception e) {
		AppLog.error(getClass(), "generateInfoService", "error...", e, g);
	    return Message.formatSimpleError("Error...");
	}

}

Cependant, à l’heure d’exécution de ce cron et en suivant les logs (car j’ai remarqué que les fichiers ne sont parfois pas générés), j’ai vu des messages d’erreur apparaitre. Sans aucune autre modification et quand je relance quelques secondes après ce même Cron en manuel (Force immediate execution of the task) le job est lancé et les fichiers sont bien générés.

Mais je vois aussi qu’à la fin de l’exécution que le status est “Exception”

Pour info, j’ai vu aussi un autre message, qui semble en info lors du déroulement de la génération des fichiers :

Je souhaiterai savoir pourquoi le cron est lancé en erreur à l’heure de l’exécution et si vous avez une idée du message d’erreur/info que je vois passer, même si les fichiers sont à la fin bien générés et au bon format.

Merci d’avance

Le stacktrace des erreur indique un pb aux lignes 117, 100 et 132 du code SitesGenerateRaftFODelta.java, comme je n’ai pas les Numéros de ligne dans votre extrait de code je ne peux pas vous aider, regardez ce qui peut poser pb à ce niveau.

Sinon, je vois que vous n’avez pas de “Run as” user dans votre tâche cron => cela signifie qu’elle sera exécutée par le user system (qui a les droits maximums - i.e. hors restriction par scope - du user designer) or quand vous l’exécutez manuellement vous l’exécutez avec le user courant dans son scope courant qui a peut être des droits différents, bref ce n’est pas à priori comparable.

PS: Autre remarque, si vous n’utilisez aucune méthode specifique de vos classes objets, il est inutile de les caster:

SitesGenerateInfoServiceTCENL adf = (SitesGenerateInfoServiceTCENL) g.getTmpObject("SitesGenerateInfoServiceTCENL");
// vs
ObjecDB adf = g.getTmpObject("SitesGenerateInfoServiceTCENL");

Les lignes correspondent à ceci:

List<String[]> rowsAsgHist = asgHistTool.search(new JSONObject());
List<String[]> rowsApiHist = apiHistTool.search(new JSONObject());
List<String[]> rowsAdrHist = acpAdrHistTool.search(new JSONObject());

Y a une raison pour que ce search engendre des erreurs?

Oui si vos asgHistTool etc. ne sont pas habilité au user qui execute la tâche cron

Mettez plutôt:

AppLog.error(getClass(), "generateInfoService", "error: " + e.getMessage(), e, g);
return Message.formatSimpleError("Error: " + e.getMessage());

Pour avoir le message de l’exception

D’accord, Merci pour vos explications

Bonjour,

J’ai renseigné le “designer” dans “run as” et le Cron se lance bien maintenant en automatique sans aucune erreur :)

Merci de votre support

OK par contre faire exécuter une tâche métier par designer n’est pas forcément idéal. Idéalement il faudrait créer un user ad hoc avec uniquement les droits qu’il faut.

Merci pour cette remarque, effectivement l’export des fichiers est plus rapide après cette modification Merci !!