Author: nfilotto
Date: 2010-09-10 13:05:02 -0400 (Fri, 10 Sep 2010)
New Revision: 3105
Modified:
kernel/trunk/exo.kernel.component.common/src/main/java/org/exoplatform/services/scheduler/impl/JobEnvironmentConfigListener.java
kernel/trunk/exo.kernel.component.common/src/main/java/org/exoplatform/services/scheduler/impl/JobSchedulerServiceImpl.java
kernel/trunk/exo.kernel.component.common/src/test/java/org/exoplatform/services/scheduler/test/TestSchedulerService.java
kernel/trunk/exo.kernel.component.common/src/test/resources/conf/portal/test-configuration.xml
Log:
EXOJCR-951: Review the code to allow multicontainer support
Modified:
kernel/trunk/exo.kernel.component.common/src/main/java/org/exoplatform/services/scheduler/impl/JobEnvironmentConfigListener.java
===================================================================
---
kernel/trunk/exo.kernel.component.common/src/main/java/org/exoplatform/services/scheduler/impl/JobEnvironmentConfigListener.java 2010-09-10
15:19:42 UTC (rev 3104)
+++
kernel/trunk/exo.kernel.component.common/src/main/java/org/exoplatform/services/scheduler/impl/JobEnvironmentConfigListener.java 2010-09-10
17:05:02 UTC (rev 3105)
@@ -18,11 +18,11 @@
*/
package org.exoplatform.services.scheduler.impl;
-import org.exoplatform.container.PortalContainer;
+import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.RootContainer;
import org.exoplatform.container.component.ComponentPlugin;
import org.exoplatform.container.component.ComponentRequestLifecycle;
-import org.exoplatform.container.xml.PortalContainerInfo;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
@@ -33,26 +33,37 @@
* Created by The eXo Platform SAS Author : Hoa Pham hoapham(a)exoplatform.com Oct
* 5, 2005
*/
+@SuppressWarnings("unchecked")
public class JobEnvironmentConfigListener implements JobListener, ComponentPlugin
{
- private String containerName_;
+ static final String NAME = "JobContextConfigListener";
- public JobEnvironmentConfigListener(PortalContainerInfo pinfo)
- {
- containerName_ = pinfo.getContainerName();
- }
-
public void jobToBeExecuted(JobExecutionContext context)
{
- RootContainer rootContainer = RootContainer.getInstance();
- PortalContainer pcontainer =
(PortalContainer)rootContainer.getComponentInstance(containerName_);
- PortalContainer.setInstance(pcontainer);
- List<ComponentRequestLifecycle> components =
- pcontainer.getComponentInstancesOfType(ComponentRequestLifecycle.class);
- for (ComponentRequestLifecycle component : components)
+ String containerName = extractContainerName(context);
+ ExoContainer container = null;
+ if (containerName != null)
{
- component.startRequest(pcontainer);
+ if (containerName.equals(JobSchedulerServiceImpl.STANDALONE_CONTAINER_NAME))
+ {
+ container = ExoContainerContext.getTopContainer();
+ }
+ else
+ {
+ RootContainer rootContainer = RootContainer.getInstance();
+ container = (ExoContainer)rootContainer.getComponentInstance(containerName);
+ }
}
+ if (container != null)
+ {
+ ExoContainerContext.setCurrentContainer(container);
+ List<ComponentRequestLifecycle> components =
+ container.getComponentInstancesOfType(ComponentRequestLifecycle.class);
+ for (ComponentRequestLifecycle component : components)
+ {
+ component.startRequest(container);
+ }
+ }
}
public void jobExecutionVetoed(JobExecutionContext context)
@@ -62,20 +73,35 @@
public void jobWasExecuted(JobExecutionContext context, JobExecutionException
exception)
{
- RootContainer rootContainer = RootContainer.getInstance();
- PortalContainer pcontainer =
(PortalContainer)rootContainer.getComponentInstance(containerName_);
- List<ComponentRequestLifecycle> components =
- pcontainer.getComponentInstancesOfType(ComponentRequestLifecycle.class);
- for (ComponentRequestLifecycle component : components)
+ String containerName = extractContainerName(context);
+ ExoContainer container = null;
+ if (containerName != null)
{
- component.endRequest(pcontainer);
+ if (containerName.equals(JobSchedulerServiceImpl.STANDALONE_CONTAINER_NAME))
+ {
+ container = ExoContainerContext.getTopContainer();
+ }
+ else
+ {
+ RootContainer rootContainer = RootContainer.getInstance();
+ container = (ExoContainer)rootContainer.getComponentInstance(containerName);
+ }
}
- PortalContainer.setInstance(null);
+ if (container != null)
+ {
+ List<ComponentRequestLifecycle> components =
+ container.getComponentInstancesOfType(ComponentRequestLifecycle.class);
+ for (ComponentRequestLifecycle component : components)
+ {
+ component.endRequest(container);
+ }
+ ExoContainerContext.setCurrentContainer(null);
+ }
}
public String getName()
{
- return "JobContextConfigListener";
+ return NAME;
}
public void setName(String s)
@@ -84,11 +110,25 @@
public String getDescription()
{
- return null;
+ return "This JobListener is used to setup the eXo environment properly";
}
public void setDescription(String s)
{
}
+ /**
+ * Extracts the container name from the {@link JobExecutionContext}.
+ * The container name is extracted from the group name
+ */
+ private static String extractContainerName(JobExecutionContext context)
+ {
+ String group = context.getJobDetail().getGroup();
+ if (group == null || (group = group.trim()).length() == 0)
+ {
+ return null;
+ }
+ int index = group.indexOf(':');
+ return index == -1 ? group : group.substring(0, index);
+ }
}
Modified:
kernel/trunk/exo.kernel.component.common/src/main/java/org/exoplatform/services/scheduler/impl/JobSchedulerServiceImpl.java
===================================================================
---
kernel/trunk/exo.kernel.component.common/src/main/java/org/exoplatform/services/scheduler/impl/JobSchedulerServiceImpl.java 2010-09-10
15:19:42 UTC (rev 3104)
+++
kernel/trunk/exo.kernel.component.common/src/main/java/org/exoplatform/services/scheduler/impl/JobSchedulerServiceImpl.java 2010-09-10
17:05:02 UTC (rev 3105)
@@ -20,6 +20,8 @@
import org.exoplatform.container.component.ComponentPlugin;
import org.exoplatform.container.xml.PortalContainerInfo;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
import org.exoplatform.services.scheduler.CronJob;
import org.exoplatform.services.scheduler.JobInfo;
import org.exoplatform.services.scheduler.JobSchedulerService;
@@ -57,6 +59,10 @@
*/
public class JobSchedulerServiceImpl implements JobSchedulerService, Startable
{
+
+ private static final Log log =
ExoLogger.getLogger("exo.kernel.component.common.JobSchedulerServiceImpl");
+
+ static final String STANDALONE_CONTAINER_NAME = "$Standalone";
private final Scheduler scheduler_;
private final String containerName_;
@@ -79,7 +85,7 @@
public JobSchedulerServiceImpl(QuartzSheduler quartzSchduler, QueueTasks qtasks)
{
scheduler_ = quartzSchduler.getQuartzSheduler();
- containerName_ = "Standalone";
+ containerName_ = STANDALONE_CONTAINER_NAME;
qtasks_ = qtasks;
}
@@ -155,7 +161,7 @@
JobInfo jobinfo = getJobInfo(jinfo);
CronTrigger trigger =
new CronTrigger(jobinfo.getJobName(), jobinfo.getGroupName(),
jobinfo.getJobName(), jobinfo.getGroupName(),
- exp);
+ exp);
JobDetail job = new JobDetail(jobinfo.getJobName(), jobinfo.getGroupName(),
jobinfo.getJob());
job.setDescription(jobinfo.getDescription());
scheduler_.addJob(job, true);
@@ -174,7 +180,7 @@
JobInfo jobinfo = getJobInfo(jinfo);
CronTrigger trigger =
new CronTrigger(jobinfo.getJobName(), jobinfo.getGroupName(),
jobinfo.getJobName(), jobinfo.getGroupName(),
- exp);
+ exp);
JobDetail job = new JobDetail(jobinfo.getJobName(), jobinfo.getGroupName(),
jobinfo.getJob());
job.setJobDataMap(jdatamap);
job.setDescription(jobinfo.getDescription());
@@ -205,8 +211,7 @@
public boolean removeJob(JobInfo jinfo) throws Exception
{
JobInfo jobinfo = getJobInfo(jinfo);
- boolean b = scheduler_.deleteJob(jobinfo.getJobName(), jobinfo.getGroupName());
- return b;
+ return scheduler_.deleteJob(jobinfo.getJobName(), jobinfo.getGroupName());
}
public List getAllExcutingJobs() throws Exception
@@ -236,16 +241,13 @@
public List getAllGlobalJobListener() throws Exception
{
- List globalListeners;
- globalListeners = scheduler_.getGlobalJobListeners();
- return globalListeners;
+ return scheduler_.getGlobalJobListeners();
}
public JobListener getGlobalJobListener(String name) throws Exception
{
- List listener;
JobListener jlistener;
- listener = scheduler_.getGlobalJobListeners();
+ List listener = scheduler_.getGlobalJobListeners();
ListIterator iterator = listener.listIterator();
while (iterator.hasNext())
{
@@ -261,8 +263,7 @@
public boolean removeGlobalJobListener(String name) throws Exception
{
JobListener jlistener = getGlobalJobListener(name);
- boolean b = scheduler_.removeGlobalJobListener(jlistener);
- return b;
+ return scheduler_.removeGlobalJobListener(jlistener);
}
public void addJobListener(ComponentPlugin plugin) throws Exception
@@ -290,8 +291,7 @@
public boolean removeJobListener(String name) throws Exception
{
- boolean b = scheduler_.removeJobListener(name);
- return b;
+ return scheduler_.removeJobListener(name);
}
public void addGlobalTriggerListener(ComponentPlugin plugin) throws Exception
@@ -301,16 +301,13 @@
public List getAllGlobalTriggerListener() throws Exception
{
- List listener;
- listener = scheduler_.getGlobalTriggerListeners();
- return listener;
+ return scheduler_.getGlobalTriggerListeners();
}
public TriggerListener getGlobalTriggerListener(String name) throws Exception
{
TriggerListener tlistener;
- List listener;
- listener = scheduler_.getGlobalTriggerListeners();
+ List listener = scheduler_.getGlobalTriggerListeners();
ListIterator iterator = listener.listIterator();
while (iterator.hasNext())
{
@@ -326,8 +323,7 @@
public boolean removeGlobaTriggerListener(String name) throws Exception
{
TriggerListener tlistener = getGlobalTriggerListener(name);
- boolean b = scheduler_.removeGlobalTriggerListener(tlistener);
- return b;
+ return scheduler_.removeGlobalTriggerListener(tlistener);
}
public void addTriggerListener(ComponentPlugin plugin) throws Exception
@@ -350,14 +346,12 @@
public TriggerListener getTriggerListener(String name) throws Exception
{
- TriggerListener tlistener = scheduler_.getTriggerListener(name);
- return tlistener;
+ return scheduler_.getTriggerListener(name);
}
public boolean removeTriggerListener(String name) throws Exception
{
- boolean b = scheduler_.removeTriggerListener(name);
- return b;
+ return scheduler_.removeTriggerListener(name);
}
private JobInfo getJobInfo(JobInfo jinfo) throws Exception
@@ -404,6 +398,17 @@
public void start()
{
+ try
+ {
+ // Ensure that only one JobEnvironmentConfigListener will be registered
+ while (removeGlobalJobListener(JobEnvironmentConfigListener.NAME));
+ // Add the unique instance of JobEnvironmentConfigListener
+ scheduler_.addGlobalJobListener(new JobEnvironmentConfigListener());
+ }
+ catch (Exception e)
+ {
+ log.warn("Could not remove the GlobalJobListener " +
JobEnvironmentConfigListener.NAME, e);
+ }
}
public void stop()
@@ -424,7 +429,7 @@
}
catch (Exception ex)
{
- ex.printStackTrace();
+ log.warn("Could not interrupt all the current jobs properly", ex);
}
}
Modified:
kernel/trunk/exo.kernel.component.common/src/test/java/org/exoplatform/services/scheduler/test/TestSchedulerService.java
===================================================================
---
kernel/trunk/exo.kernel.component.common/src/test/java/org/exoplatform/services/scheduler/test/TestSchedulerService.java 2010-09-10
15:19:42 UTC (rev 3104)
+++
kernel/trunk/exo.kernel.component.common/src/test/java/org/exoplatform/services/scheduler/test/TestSchedulerService.java 2010-09-10
17:05:02 UTC (rev 3105)
@@ -18,9 +18,12 @@
*/
package org.exoplatform.services.scheduler.test;
+import org.exoplatform.commons.utils.PropertyManager;
import org.exoplatform.container.BaseContainerLifecyclePlugin;
import org.exoplatform.container.ExoContainer;
+import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.container.PortalContainer;
+import org.exoplatform.container.RootContainer;
import org.exoplatform.services.scheduler.JobInfo;
import org.exoplatform.services.scheduler.JobSchedulerService;
import org.exoplatform.services.scheduler.PeriodInfo;
@@ -61,6 +64,7 @@
assertEquals(Boolean.TRUE, component.getResult());
}
+
public void testSeviceWithGlobalListener() throws Exception
{
assertTrue("JobScheduler is not deployed correctly", service_ != null);
@@ -272,6 +276,64 @@
System.out.println("-------------------End Test Non Global
Listener---------");
}
+ public void testMultiplePortalContainers() throws Exception
+ {
+ ExoContainer oldContainer = ExoContainerContext.getCurrentContainerIfPresent();
+ MyComponent component;
+ PortalContainer container = null;
+ MyComponent component2;
+ PortalContainer container2 = null;
+ String oldProfileList = System.getProperty(PropertyManager.RUNTIME_PROFILES);
+ try
+ {
+ try
+ {
+ PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES,
"MultiplePortalContainers");
+ component = (MyComponent)(container =
RootContainer.getInstance().getPortalContainer("portal-container")).getComponentInstanceOfType(MyComponent.class);
+ }
+ finally
+ {
+ ExoContainerContext.setCurrentContainer(oldContainer);
+ }
+ try
+ {
+ PropertyManager.setProperty(PropertyManager.RUNTIME_PROFILES,
"MultiplePortalContainers,portal-container2");
+ component2 = (MyComponent)(container2 =
RootContainer.getInstance().getPortalContainer("portal-container2")).getComponentInstanceOfType(MyComponent.class);
+ Thread.sleep(2000);
+ }
+ finally
+ {
+ ExoContainerContext.setCurrentContainer(oldContainer);
+ }
+ }
+ finally
+ {
+ if (oldProfileList == null)
+ {
+ System.clearProperty(PropertyManager.RUNTIME_PROFILES);
+ }
+ else
+ {
+ System.setProperty(PropertyManager.RUNTIME_PROFILES, oldProfileList);
+ }
+ PropertyManager.refresh();
+ if (container != null)
+ {
+ container.stop();
+ }
+
+ if (container2 != null)
+ {
+ container2.stop();
+ }
+ }
+ assertEquals("myJob1", component.name);
+ assertEquals(container, component.container);
+ assertEquals("myJob2", component2.name);
+ assertEquals(container2, component2.container);
+
+ }
+
public static class MyContainerLifecyclePlugin extends BaseContainerLifecyclePlugin
{
@@ -286,6 +348,8 @@
public static class MyComponent
{
+ public ExoContainer container;
+ public String name;
public boolean started;
public final CountDownLatch doneSignal = new CountDownLatch(1);
public Boolean result;
@@ -314,9 +378,19 @@
{
public void execute(JobExecutionContext context) throws JobExecutionException
- {
+ {
MyComponent component =
(MyComponent)PortalContainer.getInstance().getComponentInstanceOfType(MyComponent.class);
component.doSomething();
}
}
+ public static class MyJobMultiplePortalContainers implements Job
+ {
+
+ public void execute(JobExecutionContext context) throws JobExecutionException
+ {
+ MyComponent component =
(MyComponent)PortalContainer.getInstance().getComponentInstanceOfType(MyComponent.class);
+ component.name = context.getJobDetail().getName();
+ component.container = PortalContainer.getInstance();
+ }
+ }
}
Modified:
kernel/trunk/exo.kernel.component.common/src/test/resources/conf/portal/test-configuration.xml
===================================================================
---
kernel/trunk/exo.kernel.component.common/src/test/resources/conf/portal/test-configuration.xml 2010-09-10
15:19:42 UTC (rev 3104)
+++
kernel/trunk/exo.kernel.component.common/src/test/resources/conf/portal/test-configuration.xml 2010-09-10
17:05:02 UTC (rev 3105)
@@ -222,5 +222,26 @@
</properties-param>
</init-params>
</component-plugin>
+ <component-plugin profiles="MultiplePortalContainers">
+ <name>AddJob</name>
+ <set-method>addPeriodJob</set-method>
+ <type>org.exoplatform.services.scheduler.PeriodJob</type>
+ <description>add a job to the JobSchedulerService</description>
+ <init-params>
+ <properties-param>
+ <name>job.info</name>
+ <description>Test QueueTaks</description>
+ <property name="jobName" value="myJob1" />
+ <property profiles="portal-container2"
name="jobName" value="myJob2" />
+ <property name="groupName" value="group2" />
+ <property name="job"
value="org.exoplatform.services.scheduler.test.TestSchedulerService$MyJobMultiplePortalContainers"
/>
+
+ <property name="repeatCount" value="-1" />
+ <property name="period" value="500" />
+ <property name="startTime" value="" />
+ <property name="endTime" value="" />
+ </properties-param>
+ </init-params>
+ </component-plugin>
</external-component-plugins>
</configuration>