package fr.openwide.core.showcase.core.business.task.model; import java.io.IOException; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import fr.openwide.core.commons.util.report.BatchReport; import fr.openwide.core.jpa.exception.SecurityServiceException; import fr.openwide.core.jpa.exception.ServiceException; import fr.openwide.core.jpa.more.business.task.model.AbstractTask; import fr.openwide.core.jpa.more.business.task.model.BatchReportBean; import fr.openwide.core.jpa.more.business.task.model.IQueueId; import fr.openwide.core.jpa.more.business.task.model.TaskExecutionResult; import fr.openwide.core.showcase.core.business.user.model.User; import fr.openwide.core.showcase.core.business.user.service.IUserService; public class FailedWithBusinessExceptionTask extends AbstractTask { private static final long serialVersionUID = 5633587943863303524L; @Autowired private IUserService userService; private ShowcaseTaskQueueId queueId; protected FailedWithBusinessExceptionTask() { } public FailedWithBusinessExceptionTask(ShowcaseTaskQueueId queueId) { super(FailedWithBusinessExceptionTask.class.getSimpleName(), TaskTypeEnum.FAILED.getTaskType(), new Date()); this.queueId = queueId; } @Override public IQueueId selectQueue() { return queueId; } @Override protected TaskExecutionResult doTask() throws Exception { BatchReport batchReport = new BatchReport(); try { doSomething(batchReport); return TaskExecutionResult.completed(new BatchReportBean(batchReport)); } catch (MyBusinessException e) { batchReport.error("Task stopped and cancelled by business exception."); return TaskExecutionResult.failed(new BatchReportBean(batchReport), e); } } protected void doSomething(BatchReport batchReport) throws MyBusinessException, ServiceException, SecurityServiceException { batchReport.info("Doing something."); // Will be rolled back in case of task failure User user = userService.getByUserName("admin"); user.setPosition(user.getPosition() + 1); userService.update(user); try { try { doSomethingWhichFail(); } catch (RuntimeException | IOException e) { throw new IllegalStateException("No way.", e); } } catch (RuntimeException e) { throw new MyBusinessException("Expected business exception wich must cancel the task.", e); } // Rest of the task... } protected void doSomethingWhichFail() throws IOException { throw new IOException("IO error."); } }