Featured post

Docker setup for Liferay 7 with MySQL

Thursday 3 May 2018

Background Task Liferay 7 or DXP Part 1


Executing or scheduling background task is always an important activity for developers.

There are so many scenarios where background tasks are used like import/export, sending bulk notification or email, processing orders etc.

You can find this interesting link here which talks in length for background tasks.
What it does not offer is implementation example and changes for background task in Liferay 7/DXP

By following few Liferay conventions, we can easily use this weapon.
In this example I will explain creation of background task, pass parameters and handle errors if any.

In next example I will demonstrate check status, progress and display it over UI.


We will be creating two osgi components for this activity.
1. Create osgi module for background task creation and register it to handler
2. Use above module to create background tasks


Render method to create background task every time portlet loads.

@Overridepublic void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException {
    Random random = new Random(12);

    HttpServletRequest request = PortalUtil
            .getHttpServletRequest(renderRequest);

    ThemeDisplay themeDisplay = (ThemeDisplay) renderRequest
            .getAttribute(WebKeys.THEME_DISPLAY);

    ServiceContext serviceContext = null;
    try {
        serviceContext = ServiceContextFactory.getInstance(renderRequest);
    } catch (PortalException e) {
        logger.error("Eror in getting service context", e.getCause());
    }

    // This taskContextMap can be used as transporter to background job
    Map taskContextMap = new HashMap<>();
    taskContextMap.put("processName", "testing " + random.nextInt());
    taskContextMap.put("totalNodes", String.valueOf(random.nextInt()));
    //taskContextMap.put("serviceContext", serviceContext);    try {
        // Adding the job to liferay background manager
        com.liferay.portal.kernel.backgroundtask.BackgroundTask backgroundTask = backgroundTaskmanager.addBackgroundTask(themeDisplay.getUserId(),
                themeDisplay.getScopeGroupId(), SampleBackgroundTaskExecutor.class.getName(),SampleBackgroundTaskExecutor.class.getName(),taskContextMap, serviceContext);
        // With returned background object you can check status, id etc.
        renderRequest.setAttribute("backgroundTaskId",
                backgroundTask.getBackgroundTaskId());

    } catch (PortalException e) {
        logger.error(e.getCause());
    } catch (SystemException e) {
        logger.error(e.getCause());
    }




Create Background Task Executor

@Component(
        immediate = true,
        property = {"background.task.executor.class.name=com.netcracker.cabinet.background.executor.MigrationBackgroundTaskExecutor"}, 
        // Without this property osgi will not register this as background executor/handler
        service = BackgroundTaskExecutor.class)
public class SampleBackgroundTaskExecutor extends BaseBackgroundTaskExecutor {


isSerial - True

// if it's not serial then multiple instances of this executor can run parallel, to run it in queue mode, we use isSerial true
@Overridepublic boolean isSerial() {
    return true;
}



Main execute method for the Job

public BackgroundTaskResult execute(BackgroundTask backgroundTask)
      throws Exception {
      // taskContextMap which is sent by the caller
      Map taskContextMap = backgroundTask.getTaskContextMap();

      String taskName = (String)taskContextMap.get("processName") ;
      String totalNodes = (String)taskContextMap.get("totalNodes");

      //ServiceContext serviceContext  = (ServiceContext) taskContextMap.get("serviceContext");
   if(LOGGER.isDebugEnabled()){
      LOGGER.debug("Task Name : "+ taskName);
   }

   BackgroundTaskVO messageContent = new BackgroundTaskVO();
   messageContent.setTotalNodes(totalNodes);

   // Sending the data to util for MessageBus
   SampleDataHandlerStatusMessageSenderUtil.sendStatusMessage(messageContent);

  // Telling the system if, background task is successful or not
   BackgroundTaskResult backgroundTaskResult = new BackgroundTaskResult(
      BackgroundTaskConstants.STATUS_SUCCESSFUL);
   backgroundTaskResult.setStatusMessage("Wonder full");
   return backgroundTaskResult;
}



Message Bus update

public static void sendStatusMessage(BackgroundTaskVO messageContent) {
   // Leave if no background task
   if (!BackgroundTaskThreadLocal.hasBackgroundTask()) {
      return;
   }

   // Message Creation
   Message message = createMessage(messageContent);

   // Send message to message bus
   MessageBusUtil.sendMessage(DestinationNames.BACKGROUND_TASK_STATUS,
         message);
}


You can download the source code from here

You are just done, Try & Enjoy the function.............:)

27 comments:

  1. Hi Buddy Nice article !! Just a question where at which point you are adding the real task like importing a file or anything else in this code ?

    ReplyDelete
  2. Thanks for your great and helpful presentation I like your good service. I always appreciate your post. That is very interesting I love reading and I am always searching for informative information like this.AngularJS Training in Chennai | Best AngularJS Training Institute in Chennai

    ReplyDelete
  3. Very nice post here thanks for it .I always like and such a super contents of these post.Excellent and very cool idea and great content of different kinds of the valuable information's.

    machine learning course in Chennai
    machine learning training center in Chennai
    machine learning certification in chennai
    Android training in chennai
    PMP training in chennai

    ReplyDelete
  4. I want to tell you how cool I spend my free time on this site is just super genteelonline slot games A bunch of slots and slot machines. Many people can even meet someone and of course have fun

    ReplyDelete
  5. Yet, then again, these progressions will significantly affect everybody all over the place. In both individual and expert lives. machine learning course in pune

    ReplyDelete
  6. Hi,Very nice post.Thanks for the information provided.It is very interesting and very informative.I am always impressed with your post and helpful tips.Keep posting tips and relevant content as usual.
    big data training in btm

    ReplyDelete
  7. I’m going to read this. I’ll be sure to come back. thanks for sharing. and also This article gives the light in which we can observe the reality. this is very nice one and gives indepth information. thanks for this nice article... https://www.markedcardsforsale.com/marked-cards.html

    ReplyDelete
  8. This is my first time visit to your blog and I am very interested in the articles that you serve. Provide enough knowledge for me. Thank you for sharing useful and don't forget, keep sharing useful info: https://www.cardslenses.com/marked-cards.shtml

    ReplyDelete
  9. I have been checking out a few of your stories and i can state pretty good stuff. I will definitely bookmark your blog Digital Marketing Sydney

    ReplyDelete
  10. It is a great website.. The Design looks very good.. Keep working like that!. metal dice

    ReplyDelete
  11. Thanks for a very interesting blog. What else may I get that kind of info written in such a perfect approach? I’ve a undertaking that I am simply now operating on, and I have been at the look out for such info. d&d dice sets

    ReplyDelete
  12. Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work. dr martens mono black

    ReplyDelete
  13. Seeking to take your'office'outside to those times, or looking to work while travelling? mindmap templates

    ReplyDelete
  14. Location, area, area is as yet the key of purchasing Miami real estate. Purchasing Miami real estate in light of the fact that the cost is low in a declining territory is serious mix-up that ought to be evaded. fast essay writing

    ReplyDelete
  15. It is an excellent blog, I have ever seen. I found all the material on this blog utmost unique and well written. And, I have decided to visit it again and again. The Best Task Management Tool

    ReplyDelete
  16. I would like to say that this blog really convinced me to do it! Thanks, very good post. pg777th.com

    ReplyDelete
  17. Ucuz, kaliteli ve organik sosyal medya hizmetleri satın almak için Ravje Medyayı tercih edebilir ve sosyal medya hesaplarını hızla büyütebilirsin. Ravje Medya ile sosyal medya hesaplarını organik ve gerçek kişiler ile geliştirebilir, kişisel ya da ticari hesapların için Ravje Medyayı tercih edebilirsin. Ravje Medya internet sitesine giriş yapmak için hemen tıkla: https://www.ravje.com

    İnstagram takipçi satın almak için Ravje Medya hizmetlerini tercih edebilir, güvenilir ve gerçek takipçilere Ravje Medya ile ulaşabilirsin. İnstagram takipçi satın almak artık Ravje Medya ile oldukça güvenilir. Hemen instagram takipçi satın almak için Ravje Medyanın ilgili sayfasını ziyaret et: instagram takipçi satın al

    Tiktok takipçi satın al istiyorsan tercihini Ravje Medya yap! Ravje Medya uzman kadrosu ve profesyonel ekibi ile sizlere Tiktok takipçi satın alma hizmetide sunmaktadır. Tiktok takipçi satın almak için hemen tıkla: tiktok takipçi satın al

    ReplyDelete
  18. 2. defa geldim ve çok güzel yorumladım.

    ReplyDelete
  19. Thanks for sharing this quality information with us. I really enjoyed reading. Will surely going to share this URL with my friends.

    ReplyDelete