From c73f348c77ec68dd8a35a1b22534e2626ec550bb Mon Sep 17 00:00:00 2001 From: juanf <juanf> Date: Tue, 23 Sep 2014 12:29:10 +0000 Subject: [PATCH] SSDM-351: Implement a queue for all asynchronous registartion from openbis UI (big refactoring + custom import) SVN: 32483 --- .../web/server/CommonClientService.java | 40 ++++++++++++---- .../generic/server/AbstractServer.java | 48 ------------------- .../openbis/generic/server/CommonServer.java | 21 -------- .../generic/server/CommonServerLogger.java | 9 ---- .../openbis/generic/shared/ICommonServer.java | 7 --- 5 files changed, 31 insertions(+), 94 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java index 6fe8c846a36..66fecaa4d28 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.server; import java.io.Reader; +import java.io.Writer; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -27,6 +28,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; +import javax.annotation.Resource; import javax.servlet.http.HttpSession; import org.apache.commons.io.FileUtils; @@ -218,6 +220,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader; +import ch.systemsx.cisd.openbis.plugin.generic.client.web.server.queue.ConsumerQueue; +import ch.systemsx.cisd.openbis.plugin.generic.client.web.server.queue.ConsumerTask; /** * The {@link ICommonClientService} implementation. @@ -227,6 +231,9 @@ import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader; public final class CommonClientService extends AbstractClientService implements ICommonClientService { + @Resource(name = "registration-queue") + private ConsumerQueue asyncRegistrationQueue; + private final ICommonServer commonServer; public CommonClientService(final ICommonServer commonServer, @@ -2709,10 +2716,12 @@ public final class CommonClientService extends AbstractClientService implements } @Override - public List<BatchRegistrationResult> performCustomImport(String sessionKey, String customImportCode, boolean async, String userEmail) + public List<BatchRegistrationResult> performCustomImport(final String sessionKey, final String customImportCode, final boolean async, final String userEmail) { HttpSession httpSession = getHttpSession(); UploadedFilesBean uploadedFiles = null; + ConsumerTask asyncCustomImportTask = null; + try { uploadedFiles = (UploadedFilesBean) httpSession.getAttribute(sessionKey); @@ -2722,7 +2731,23 @@ public final class CommonClientService extends AbstractClientService implements if (async) { - commonServer.performCustomImportAsync(getSessionToken(), customImportCode, customImportFile, userEmail); + asyncCustomImportTask = new ConsumerTask(uploadedFiles) { + @Override + public String getName() { return "Custom import"; } + + @Override + public String getUserEmail() { return userEmail; } + + @Override + public void doActionOrThrowException(Writer writer) + { + //Some stuff is repeated on the async executor, this is expected + CustomImportFile customImportFileAsync = getCustomImportFile(this.getFilesForTask()); + //Execute task + commonServer.performCustomImport(getSessionToken(), customImportCode, customImportFileAsync); + } + }; + return AsyncBatchRegistrationResult.singletonList(customImportFile.getFileName()); } else { @@ -2742,13 +2767,10 @@ public final class CommonClientService extends AbstractClientService implements + " (More details can be found in the server logs.)"); } finally { - if (uploadedFiles != null) - { - uploadedFiles.deleteTransferredFiles(); - } - if (httpSession != null) - { - httpSession.removeAttribute(sessionKey); + if (async && (asyncCustomImportTask != null)) { + asyncRegistrationQueue.addTaskAsLast(asyncCustomImportTask); + } else { + cleanUploadedFiles(sessionKey, httpSession, uploadedFiles); } } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java index c43144f565e..9765718227b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java @@ -16,17 +16,12 @@ package ch.systemsx.cisd.openbis.generic.server; -import java.io.StringWriter; import java.util.ArrayList; import java.util.Collections; -import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import javax.annotation.Resource; @@ -41,7 +36,6 @@ import ch.systemsx.cisd.common.action.IDelegatedActionWithResult; import ch.systemsx.cisd.common.exceptions.InvalidSessionException; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.mail.MailClient; import ch.systemsx.cisd.common.mail.MailClientParameters; import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer; import ch.systemsx.cisd.openbis.common.spring.AbstractServiceWithLogger; @@ -99,8 +93,6 @@ import ch.systemsx.cisd.openbis.generic.shared.util.ServerUtils; */ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> implements IServer { - protected static ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 10, 360, - TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); private final static String ETL_SERVER_USERNAME_PREFIX = "etlserver"; @@ -978,52 +970,12 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp } } - protected void executeASync(final String userEmail, final IASyncAction action) - { - final IMailClient mailClient = new MailClient(mailClientParameters); - Runnable task = new Runnable() - { - @Override - public void run() - { - StringWriter writer = new StringWriter(); - boolean success = true; - Date startDate = new Date(); - try - { - success = action.doAction(writer); - } catch (RuntimeException e) - { - operationLog.error("Asynchronous action '" + action.getName() - + "' failed. ", e); - success = false; - } finally - { - sendEmail(mailClient, writer.toString(), - getSubject(action.getName(), startDate, success), userEmail); - } - } - }; - executor.submit(task); - } - protected void sendEmail(IMailClient mailClient, String content, String subject, String... recipient) { mailClient.sendMessage(subject, content, null, null, recipient); } - private static String getSubject(String actionName, Date startDate, boolean success) - { - return addDate(actionName + " " + (success ? "successfully performed" : "failed"), - startDate); - } - - private static String addDate(String subject, Date startDate) - { - return subject + " (initiated at " + startDate + ")"; - } - static boolean isResolved(String name) { return StringUtils.isNotBlank(name) && name.startsWith("${") == false; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java index 342e3d3a5b0..48d4adc7c27 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java @@ -4127,27 +4127,6 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt return searchHelper.searchForMaterials(session.getUserName(), criteria); } - @Override - @RolesAllowed(RoleWithHierarchy.SPACE_USER) - public void performCustomImportAsync(final String sessionToken, final String customImportCode, - final CustomImportFile customImportFile, final String userEmail) throws UserFailureException - { - executeASync(userEmail, new AbstractASyncAction() - { - @Override - public String getName() - { - return "Custom import"; - } - - @Override - protected void doActionOrThrowException(Writer messageWriter) - { - commonServer.performCustomImport(sessionToken, customImportCode, customImportFile); - } - }); - } - @Override @RolesAllowed(RoleWithHierarchy.SPACE_USER) public void performCustomImport(String sessionToken, String customImportCode, diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java index ad0da899be3..4c5b2d1a534 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java @@ -1615,15 +1615,6 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe return null; } - @Override - public void performCustomImportAsync(String sessionToken, String customImportCode, - CustomImportFile customImportFile, String userEmail) - { - logAccess(sessionToken, "performCustomImportAsync", - "CUSTOM_IMPORT_CODE(%s), CUSTOM_IMPORT_FILE(%s), USER_EMAIL(%s)", customImportCode, - customImportFile, userEmail); - } - @Override public void performCustomImport(String sessionToken, String customImportCode, CustomImportFile customImportFile) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java index 08e3100362c..3f371a0afba 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java @@ -1451,13 +1451,6 @@ public interface ICommonServer extends IServer @Transactional(readOnly = true) public List<Material> searchForMaterials(String sessionToken, DetailedSearchCriteria criteria); - /** - * Performs an asynchronous import of file to the dss. - */ - @Transactional - public void performCustomImportAsync(String sessionToken, String customImportCode, - CustomImportFile customImportFile, String userEmail) throws UserFailureException; - /** * Performs an import of file to the dss. */ -- GitLab