10014---Trail ~ CronJobs
发布日期:2021-06-28 19:53:05 浏览次数:2 分类:技术文章

本文共 14421 字,大约阅读时间需要 48 分钟。

Motivation

CronJobs provide a means for performing business logic at particular times and intervals. For example, 

an administrator might want to perform an inventory every Sunday at midnight,

 or notify the web administrator every hour between 9 and 5 from Monday to Saturday of the peak loads on the servers.

Our cronjob should run on a daily basis and send eMails containing a ranking-list.

 If you are lucky enough to have an SMTP server that you can use, you can set up the details as below. 

If you don't, the Cronjob will just echo the text to the command prompt.

Setting up eMail with gmail

We'll configure here a sample gmail SMTP server. You can create an account to be used with this training ().

config/local.properties

mail.from=cuppy-no-reply@hybris.demail.replyto=cuppy-no-reply@hybris.demail.smtp.server=smtp.gmail.commail.smtp.port=587mail.smtp.user=YOUR_GMAIL_ACCOUNTmail.smtp.password=YOUR_GMAIL_PASSWORDmail.smtp.starttls.enable=true

Defining the Job

Create a new java class SendRankingJob in the package de/hybris/platform/cuppytrail/jobs:

de/hybris/platform/cuppytrail/jobs/SendRankingJob.java
/* * [y] hybris Platform * * Copyright (c) 2000-2011 hybris AG * All rights reserved. * * This software is the confidential and proprietary information of hybris * ("Confidential Information"). You shall not disclose such Confidential * Information and shall use it only in accordance with the terms of the * license agreement you entered into with hybris. * * */package de.hybris.platform.cuppytrail.jobs; import de.hybris.platform.cronjob.enums.CronJobResult;import de.hybris.platform.cronjob.enums.CronJobStatus;import de.hybris.platform.cronjob.model.CronJobModel;import de.hybris.platform.cuppy.model.PlayerModel;import de.hybris.platform.cuppy.services.MailService;import de.hybris.platform.cuppy.services.PlayerService;import de.hybris.platform.cuppy.services.RankingData;import de.hybris.platform.servicelayer.cronjob.AbstractJobPerformable;import de.hybris.platform.servicelayer.cronjob.PerformResult; import java.util.List; import org.apache.log4j.Logger;  public class SendRankingJob extends AbstractJobPerformable
{ private static final Logger LOG = Logger.getLogger(SendRankingJob.class); private PlayerService playerService; private MailService mailService; @Override public PerformResult perform(final CronJobModel cronJob) { LOG.info("Sending ranking mails"); final List
rankings = playerService.getRankings(); if (rankings.isEmpty()) { LOG.info("No competitions have changed, skipping send of ranking mails"); return new PerformResult(CronJobResult.SUCCESS, CronJobStatus.FINISHED); } for (final PlayerModel player : playerService.getAllPlayers()) { final List
playerRankings = playerService.filterRankingsForPlayer(rankings, player); if (!playerRankings.isEmpty() && player.isSendNewsletter()) { mailService.sendRankingMail(player, playerRankings); } } return new PerformResult(CronJobResult.SUCCESS, CronJobStatus.FINISHED); } public void setPlayerService(final PlayerService playerService) { this.playerService = playerService; } public void setMailService(final MailService trailMailService) { this.mailService = trailMailService; }}
The new JobPerformable has to be defined as a Spring bean in cuppytrail-spring.xml. 

Add the following line at the bottom of the file, but inside the beans-tag:

resources/cuppytrail-spring.xml

Rebuild the hybris Platform by calling ant in the $/{HYBRIS_BIN_DIR}/platform directory. 
(warning) Run a system update with only essential data checked - during the phase of essential data creation, 

for each Spring definition of a class implementing the JobPerformable interface, a ServicelayerJob instance gets created and the code attribute of the job is set to the name of the Spring bean.

You can check in the FlexibleSearch console:  that the new item was created by executing the following query:

select {code} from {servicelayerjob} where {code} = 'sendRankingJob'

Create the CronJob and the Trigger

To create the CronJob and the Trigger, you can either:

  • You can go in the hybris Admin Console to the Console tab select ImpEx Import and execute the following impex-script there by clicking on the Import Content button

INSERT_UPDATE CronJob; code[unique=true];job(code);singleExecutable;sessionLanguage(isocode);sendRankingCronJob;sendRankingJob;false;de INSERT_UPDATE Trigger;cronjob(code)[unique=true];cronExpression#% afterEach: impex.getLastImportedItem().setActivationTime(new Date());; sendRankingCronJob; 0 0 0 * *
A cron expression is a string comprised of 6 or 7 fields separated by white space. Fields can contain any of the allowed values, along with various combinations of allowed special characters for that field.

---

  • Quartz cron trigger is used, see  for more details.

    Any changes you are making for testing can easily be redeployed or reexecuted.

  • OR create the file resources/impex/essentialdataJobs.impex with the same content. Further changes are only taken into account after a server-restart and a system update (with only essential data checked). Changes made to resources after being loaded as classloader-resources are not visible.
===

l10NService.getLocalizedString("mail.registration.subject", new Object[]{ player.getUid() })
mail.registration.subject=Player {0} has registered
=======

DefaultMailService.java

/** * */package de.hybris.platform.cuppy.services.impl;import de.hybris.platform.commons.model.renderer.RendererTemplateModel;import de.hybris.platform.commons.renderer.RendererService;import de.hybris.platform.commons.renderer.exceptions.RendererException;import de.hybris.platform.cuppy.model.MatchModel;import de.hybris.platform.cuppy.model.NewsModel;import de.hybris.platform.cuppy.model.PlayerModel;import de.hybris.platform.cuppy.services.MailService;import de.hybris.platform.cuppy.services.RankingData;import de.hybris.platform.cuppy.services.SingletonScopedComponent;import de.hybris.platform.servicelayer.i18n.FormatFactory;import de.hybris.platform.servicelayer.i18n.I18NService;import de.hybris.platform.servicelayer.i18n.L10NService;import de.hybris.platform.servicelayer.session.SessionExecutionBody;import de.hybris.platform.servicelayer.session.SessionService;import de.hybris.platform.util.Config;import java.io.StringWriter;import java.text.DateFormat;import java.util.ArrayList;import java.util.List;import java.util.Locale;import javax.mail.MessagingException;import javax.mail.internet.MimeMessage;import org.apache.commons.lang.StringEscapeUtils;import org.apache.log4j.Logger;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.mail.MailException;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.mail.javamail.MimeMessageHelper;import org.springframework.mail.javamail.MimeMessagePreparator;/** * @author andreas.thaler *  */@SingletonScopedComponent(value = "mailService")public class DefaultMailService implements MailService, InitializingBean{	private final static Logger LOG = Logger.getLogger(DefaultMailService.class);	private String domain;	private String fromAddress;	private String replyToAddress;	@Autowired	private JavaMailSender mailSender;	@Autowired	private SessionService sessionService;	@Autowired	private I18NService i18nService;	@Autowired	private FormatFactory formatFactory;	@Autowired	private RendererService rendererService;	@Autowired	private L10NService l10NService;	@Override	public void afterPropertiesSet()	{		domain = Config.getParameter("cuppy.domain");		fromAddress = Config.getParameter("mail.from");		replyToAddress = Config.getParameter("mail.replyto");		if (domain == null || domain.isEmpty() || fromAddress == null || fromAddress.isEmpty() || replyToAddress == null				|| replyToAddress.isEmpty())		{			throw new IllegalStateException(					"Can not start mail service, please configure properties 'cuppy.domain','mail.from' and 'mail.replyto'");		}	}	@Override	public void sendConfirmationMail(final PlayerModel player)	{		final MailPreparator preparer = new MailPreparator()		{			@Override			public void prepare(final MimeMessageHelper message) throws MessagingException			{				message.setSubject(l10NService.getLocalizedString("mail.confirmation.subject"));				message.setText(l10NService.getLocalizedString("mail.confirmation.body", new Object[]				{ player.getName(), "http://" + domain + "/index.zul", player.getUid() }));			}		};		send(preparer, player);	}	@Override	public void sendRegistrationMail(final PlayerModel player, final List
admins) { for (final PlayerModel admin : admins) { final MailPreparator preparer = new MailPreparator() { @Override public void prepare(final MimeMessageHelper message) throws MessagingException { message.setSubject(l10NService.getLocalizedString("mail.registration.subject", new Object[] { player.getUid() })); message.setText(l10NService.getLocalizedString("mail.registration.body", new Object[] { admin.getName(), "http://" + domain + "/index.zul?persp=cuppy.perspective.cuppy&events=activation&act-item=" + player.getPk().toString() })); } }; send(preparer, admin); } } @Override public void sendNewsletter(final NewsModel news, final List
players) { for (final PlayerModel player : players) { if (player.isSendNewsletter()) { final MailPreparator preparer = new MailPreparator() { @Override public void prepare(final MimeMessageHelper message) throws MessagingException { message.setSubject(l10NService.getLocalizedString("mail.news.subject")); message.setText("" + l10NService.getLocalizedString("mail.news.text", new Object[] { StringEscapeUtils.escapeHtml(player.getName()), news.getContent() }) + "", true); } }; send(preparer, player); } } } @Override public void sendReminder(final List
matches, final PlayerModel player) { final MailPreparator preparer = new MailPreparator() { @Override public void prepare(final MimeMessageHelper message) throws MessagingException { final DateFormat dateFormat = formatFactory.createDateTimeFormat(DateFormat.MEDIUM, DateFormat.MEDIUM); final List
matchReminders = new ArrayList
(); for (final MatchModel match : matches) { final String name = match.getGroup().getCompetition().getName(); final String kickOffTime = dateFormat.format(match.getDate()); final String home = match.getHomeTeam().getName(); final String guest = match.getGuestTeam().getName(); final MatchReminderHelper reminder = new MatchReminderHelper(name, kickOffTime, home, guest); matchReminders.add(reminder); } final ReminderContext reminderContext = new ReminderContext(player, matchReminders); final StringWriter mailMessage = new StringWriter(); final RendererTemplateModel reminderTemplate = rendererService.getRendererTemplateForCode("reminder"); rendererService.render(reminderTemplate, reminderContext, mailMessage); message.setSubject(l10NService.getLocalizedString("mail.reminder.subject")); message.setText(mailMessage.toString(), true); } }; send(preparer, player); } @Override public void sendNewPassword(final PlayerModel player, final String newPassword) { final MailPreparator preparer = new MailPreparator() { @Override public void prepare(final MimeMessageHelper message) throws MessagingException { message.setSubject(l10NService.getLocalizedString("mail.newpassword.subject")); message.setText(l10NService.getLocalizedString("mail.newpassword.body", new Object[] { player.getName(), "http://" + domain + "/index.zul", player.getUid(), newPassword })); } }; send(preparer, player); } private String getMailExceptionMessage(final MailException exception) { final StringBuilder result = new StringBuilder(exception.getMessage()); if (exception.getCause() != null) { final Throwable cause = exception.getCause(); result.append(": ").append(exception.getMessage()); if (cause.getCause() != null) { result.append(": ").append(cause.getMessage()); } } return result.toString(); } protected void send(final MailPreparator preparer, final PlayerModel player) { sessionService.executeInLocalView(new SessionExecutionBody() { @Override public void executeWithoutResult() { i18nService.setLocalizationFallbackEnabled(true); if (player.getSessionLanguage() != null) { i18nService.setCurrentLocale(new Locale(player.getSessionLanguage().getIsocode())); } final MimeMessagePreparator preparator = new MimeMessagePreparator() { @Override public void prepare(final MimeMessage mimeMessage) throws Exception //NOPMD { final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, "UTF-8"); message.setTo(player.getEMail()); message.setFrom(fromAddress); message.setReplyTo(replyToAddress); preparer.prepare(message); } }; try { mailSender.send(preparator); } catch (final MailException e) { //log it and go on LOG.error("Can not send mail to " + player.getUid() + " - " + player.getEMail() + ": " + getMailExceptionMessage(e)); } } }); } @Override public void sendRankingMail(final PlayerModel player, final List
rankings) { try { final MailPreparator preparer = new MailPreparator() { @Override public void prepare(final MimeMessageHelper message) throws MessagingException { message.setSubject(l10NService.getLocalizedString("mail.ranking.subject")); final RendererTemplateModel template = rendererService.getRendererTemplateForCode("rankingMail"); final StringWriter renderedText = new StringWriter(); rendererService.render(template, new RankingMailContext(rankings, player), renderedText); message.setText(renderedText.getBuffer().toString(), true); } }; send(preparer, player); } catch (final RendererException e) { LOG.error("Error while rendering ranking mail for " + player.getUid() + ", skipping send of mail", e); } } protected interface MailPreparator { void prepare(MimeMessageHelper message) throws Exception; //NOPMD } public void setMailSender(final JavaMailSender mailSender) { this.mailSender = mailSender; }}

转载地址:https://blog.csdn.net/xxxcyzyy/article/details/51056683 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:10032---java实现图片裁剪缩放工具类
下一篇:10013---Trail ~ Catalogs

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月28日 13时47分55秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

android热修复框架对比,12年高级工程师的“飞升之路”,含泪整理面经 2019-04-29
Android多线程实现方式及并发与同步,技术详细介绍 2019-04-29
Android开发究竟该如何学习,成功入职字节跳动 2019-04-29
三年老Android经验面经,看看这篇文章吧! 2019-04-29
为什么Android要采用Binder作为IPC机制?成功入职腾讯 2019-04-29
海量算法高频面试题精编解析,附超全教程文档 2019-04-29
深入浅出Android性能调优,系列篇 2019-04-29
深入浅出Android性能调优,附大厂真题面经 2019-04-29
深入解析Android-AutoLayout,全网疯传 2019-04-29
深入解析android核心组件和应用框架,最全Android知识总结 2019-04-29
深入解析android核心组件和应用框架,社招面试心得 2019-04-29
深度解析跳槽从开始到结束完整流程,持续更新中 2019-04-29
深度解析跳槽从开始到结束完整流程,面试真题解析 2019-04-29
hashmap扩容过程,字节大神强推千页PDF学习笔记,经典好文 2019-04-29
kotlin面试题!Android大厂高频面试题解析,薪资翻倍 2019-04-29
kotlin面试题!一口气拿了9家公司的offer,已拿offer入职 2019-04-29
retrofit优点,互联网寒冬公司倒闭后,年薪50W 2019-04-29
retrofit原理面试,Android性能优化最佳实践,面试必备 2019-04-29
【工作感悟】Android多进程从头讲到尾,offer拿到手软 2019-04-29
【微信小程序】面试一路绿灯Offer拿到手软,好文推荐 2019-04-29