You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by wo...@apache.org on 2007/10/22 13:57:41 UTC
svn commit: r587066 [1/3] - in /portals/jetspeed-2/trunk: ./
components/jetspeed-portal/
components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/
components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/invoker/
compo...
Author: woonsan
Date: Mon Oct 22 04:57:40 2007
New Revision: 587066
URL: http://svn.apache.org/viewvc?rev=587066&view=rev
Log:
[JS2-785] Parallel Rendering on Websphere 6.1
Reduced errors significantly in parallel rendering on Websphere 6.1.
- Cleaned up aggregation and rendering codes.
- Adjusted a portal session invalidation problem.
- Added wrapping on servlet request of WebSphere to support multithreaded request access.
- Added CommonJ Work Manager facility to use Container's Work Manager for parallel rendering thread pool. (Optional)
Added:
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/CommonjWorkerMonitorImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/invoker/AdjustedSRTServletRequestDump.java
Modified:
portals/jetspeed-2/trunk/components/jetspeed-portal/pom.xml
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerMonitorImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/invoker/ServletPortletInvoker.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/invoker/ServletPortletInvokerFactory.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/session/PortalSessionMonitorImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/container/session/PortalSessionsManagerImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/engine/servlet/ServletRequestImpl.java
portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/request/JetspeedRequestContextComponent.java
portals/jetspeed-2/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/aggregator/WorkerMonitor.java
portals/jetspeed-2/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/container/session/PortalSessionMonitor.java
portals/jetspeed-2/trunk/jetspeed-api/src/main/java/org/apache/jetspeed/container/session/PortletApplicationSessionMonitor.java
portals/jetspeed-2/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/aggregator/CurrentWorkerContext.java
portals/jetspeed-2/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/container/JetspeedContainerServlet.java
portals/jetspeed-2/trunk/jetspeed-commons/src/main/java/org/apache/jetspeed/container/session/PortletApplicationSessionMonitorImpl.java
portals/jetspeed-2/trunk/jetspeed-portal-resources/src/main/resources/webapp/WEB-INF/assembly/aggregation.xml
portals/jetspeed-2/trunk/jetspeed-portal-resources/src/main/resources/webapp/WEB-INF/assembly/pluto-factories.xml
portals/jetspeed-2/trunk/jetspeed-portal-resources/src/main/resources/webapp/WEB-INF/web.xml
portals/jetspeed-2/trunk/pom.xml
Modified: portals/jetspeed-2/trunk/components/jetspeed-portal/pom.xml
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/jetspeed-portal/pom.xml?rev=587066&r1=587065&r2=587066&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/jetspeed-portal/pom.xml (original)
+++ portals/jetspeed-2/trunk/components/jetspeed-portal/pom.xml Mon Oct 22 04:57:40 2007
@@ -126,7 +126,21 @@
<groupId>ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
-
+
+ <dependency>
+ <groupId>asm</groupId>
+ <artifactId>asm</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>asm</groupId>
+ <artifactId>asm-attrs</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commonj</groupId>
+ <artifactId>commonj-twm</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
<!-- Test Dependencies -->
<dependency>
<groupId>${pom.groupId}</groupId>
Modified: portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java?rev=587066&r1=587065&r2=587066&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java (original)
+++ portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/AsyncPageAggregatorImpl.java Mon Oct 22 04:57:40 2007
@@ -197,7 +197,7 @@
log.info("Aggregating " + page.getPath() + ". Parallel: " + parallelJobCount + ", Sequential: " + sequentialJobCount);
}
- CurrentWorkerContext.setCurrentWorkerContextUsed(parallelJobCount > 0 && sequentialJobCount > 0);
+ CurrentWorkerContext.setParallelRenderingMode(parallelJobCount > 0);
// kick off the parallel rendering jobs
Iterator iter = parallelJobs.iterator();
@@ -237,6 +237,9 @@
{
log.error("Exception during synchronizing all portlet rendering jobs.", e);
}
+
+ // Now, restore it to non parallel mode for rendering layout portlets.
+ CurrentWorkerContext.setParallelRenderingMode(false);
// render layout fragments.
iter = layoutFragments.iterator();
Added: portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/CommonjWorkerMonitorImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/CommonjWorkerMonitorImpl.java?rev=587066&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/CommonjWorkerMonitorImpl.java (added)
+++ portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/CommonjWorkerMonitorImpl.java Mon Oct 22 04:57:40 2007
@@ -0,0 +1,263 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jetspeed.aggregator.impl;
+
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Collections;
+import java.util.Iterator;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jetspeed.aggregator.RenderingJob;
+import org.apache.jetspeed.aggregator.WorkerMonitor;
+import org.apache.jetspeed.aggregator.PortletContent;
+import org.apache.jetspeed.aggregator.CurrentWorkerContext;
+
+import commonj.work.WorkManager;
+import commonj.work.Work;
+import commonj.work.WorkItem;
+import commonj.work.WorkListener;
+import commonj.work.WorkEvent;
+
+/**
+ * The CommonjWorkerMonitorImpl is responsible for dispatching jobs to workers
+ * It wraps CommonJ WorkManager supported by IBM WebSphere and BEA WebLogic sever.
+ *
+ * @author <a href="mailto:woon_san@apache.org">Woonsan Ko</a>
+ * @version $Id: CommonjWorkerMonitorImpl.java 568339 2007-08-22 00:14:51Z ate $
+ */
+public class CommonjWorkerMonitorImpl implements WorkerMonitor, WorkListener
+{
+
+ public static final String ACCESS_CONTROL_CONTEXT_WORKER_ATTR = AccessControlContext.class.getName();
+
+ /** CommonJ Work Manamger provided by JavaEE container */
+ protected WorkManager workManager;
+
+ /** Work items to be monitored for timeout checking */
+ protected List workItemsMonitored = Collections.synchronizedList(new LinkedList());
+
+ public CommonjWorkerMonitorImpl(WorkManager workManager)
+ {
+ this.workManager = workManager;
+ }
+
+ /** Commons logging */
+ protected final static Log log = LogFactory.getLog(CommonjWorkerMonitorImpl.class);
+
+ /** Renering Job Timeout monitor */
+ protected CommonjWorkerRenderingJobTimeoutMonitor jobMonitor = null;
+
+ public void start()
+ {
+ jobMonitor = new CommonjWorkerRenderingJobTimeoutMonitor(1000);
+ jobMonitor.start();
+ }
+
+ public void stop()
+ {
+ if (jobMonitor != null)
+ {
+ jobMonitor.endThread();
+ }
+
+ jobMonitor = null;
+ }
+
+ /**
+ * Assign a job to a worker and execute it or queue the job if no
+ * worker is available.
+ *
+ * @param job the Job to process
+ */
+ public void process(RenderingJob job)
+ {
+ AccessControlContext context = AccessController.getContext();
+ job.setWorkerAttribute(ACCESS_CONTROL_CONTEXT_WORKER_ATTR, context);
+
+ try
+ {
+ WorkItem workItem = this.workManager.schedule(new RenderingJobCommonjWork(job), this);
+ this.workItemsMonitored.add(workItem);
+ }
+ catch (Throwable t)
+ {
+ log.error("Worker exception", t);
+ }
+ }
+
+ public int getQueuedJobsCount()
+ {
+ return 0;
+ }
+
+ /**
+ * Returns a snapshot of the available jobs
+ * @return available jobs
+ */
+ public int getAvailableJobsCount()
+ {
+ return 0;
+ }
+
+ public int getRunningJobsCount()
+ {
+ return 0;
+ }
+
+ public void workAccepted(WorkEvent we)
+ {
+ WorkItem workItem = we.getWorkItem();
+ if (log.isDebugEnabled()) log.debug("[CommonjWorkMonitorImpl] workAccepted: " + workItem);
+ }
+
+ public void workRejected(WorkEvent we)
+ {
+ WorkItem workItem = we.getWorkItem();
+ if (log.isDebugEnabled()) log.debug("[CommonjWorkMonitorImpl] workRejected: " + workItem);
+ removeMonitoredWorkItem(workItem);
+ }
+
+ public void workStarted(WorkEvent we)
+ {
+ WorkItem workItem = we.getWorkItem();
+ if (log.isDebugEnabled()) log.debug("[CommonjWorkMonitorImpl] workStarted: " + workItem);
+ }
+
+ public void workCompleted(WorkEvent we)
+ {
+ WorkItem workItem = we.getWorkItem();
+ if (log.isDebugEnabled()) log.debug("[CommonjWorkMonitorImpl] workCompleted: " + workItem);
+ removeMonitoredWorkItem(workItem);
+ }
+
+ protected boolean removeMonitoredWorkItem(WorkItem workItem)
+ {
+ return this.workItemsMonitored.remove(workItem);
+ }
+
+ class RenderingJobCommonjWork implements Work
+ {
+
+ protected RenderingJob job;
+
+ public RenderingJobCommonjWork()
+ {
+ }
+
+ public RenderingJobCommonjWork(RenderingJob job)
+ {
+ this.job = job;
+ }
+
+ public boolean isDaemon()
+ {
+ return false;
+ }
+
+ public void run()
+ {
+ this.job.run();
+ }
+
+ public void release()
+ {
+ }
+
+ public void setRenderingJob(RenderingJob job)
+ {
+ this.job = job;
+ }
+
+ public RenderingJob getRenderingJob()
+ {
+ return this.job;
+ }
+
+ }
+
+ class CommonjWorkerRenderingJobTimeoutMonitor extends Thread {
+
+ long interval = 1000;
+ boolean shouldRun = true;
+
+ CommonjWorkerRenderingJobTimeoutMonitor(long interval)
+ {
+ super("CommonjWorkerRenderingJobTimeoutMonitor");
+
+ if (interval > 0)
+ {
+ this.interval = interval;
+ }
+ }
+ /**
+ * Thread.stop() is deprecated.
+ * This method achieves the same by setting the run varaible "shouldRun" to false and interrupting the Thread,
+ * effectively causing the thread to shutdown correctly.
+ *
+ */
+ public void endThread()
+ {
+ shouldRun = false;
+ this.interrupt();
+ }
+
+ public void run() {
+ while (shouldRun) {
+ try
+ {
+ synchronized (workItemsMonitored)
+ {
+ for (Iterator it = workItemsMonitored.iterator(); it.hasNext(); )
+ {
+ WorkItem workItem = (WorkItem) it.next();
+ int status = workItem.getStatus();
+
+ if (status == WorkEvent.WORK_COMPLETED || status == WorkEvent.WORK_REJECTED)
+ {
+ it.remove();
+ }
+ else
+ {
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ log.error("Exception during job monitoring.", e);
+ }
+
+ try
+ {
+ synchronized (this)
+ {
+ wait(this.interval);
+ }
+ }
+ catch (InterruptedException e)
+ {
+ ;
+ }
+ }
+ }
+ }
+}
Modified: portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java?rev=587066&r1=587065&r2=587066&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java (original)
+++ portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/PortletRendererImpl.java Mon Oct 22 04:57:40 2007
@@ -511,7 +511,12 @@
statistics, expirationCache, contentIsCached );
}
- setTimeoutOnJob(timeoutMetadata, rJob);
+
+ if (isParallel)
+ {
+ setTimeoutOnJob(timeoutMetadata, rJob);
+ }
+
return rJob;
}
Modified: portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java?rev=587066&r1=587065&r2=587066&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java (original)
+++ portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/RenderingJobImpl.java Mon Oct 22 04:57:40 2007
@@ -36,7 +36,6 @@
import org.apache.jetspeed.aggregator.PortletRenderer;
import org.apache.jetspeed.aggregator.PortletTrackingManager;
import org.apache.jetspeed.aggregator.RenderingJob;
-import org.apache.jetspeed.aggregator.Worker;
import org.apache.jetspeed.components.portletentity.PortletEntityImpl;
import org.apache.jetspeed.om.common.portlet.MutablePortletEntity;
import org.apache.jetspeed.om.page.ContentFragment;
@@ -169,7 +168,9 @@
{
try
{
- if (this.timeout > 0) {
+ if (this.timeout > 0)
+ {
+ CurrentWorkerContext.setParallelRenderingMode(true);
this.startTimeMillis = System.currentTimeMillis();
}
@@ -179,7 +180,6 @@
}
finally
{
-
synchronized (portletContent)
{
log.debug("Notifying completion of rendering job for fragment " + fragment.getId());
@@ -207,7 +207,7 @@
// if the current thread is worker, then store attribues in that.
if (this.workerAttributes != null)
{
- isParallelMode = (Thread.currentThread() instanceof Worker || CurrentWorkerContext.getCurrentWorkerContextUsed());
+ isParallelMode = CurrentWorkerContext.getParallelRenderingMode();
if (isParallelMode)
{
Iterator itAttrNames = this.workerAttributes.keySet().iterator();
Modified: portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerImpl.java?rev=587066&r1=587065&r2=587066&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerImpl.java (original)
+++ portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerImpl.java Mon Oct 22 04:57:40 2007
@@ -200,7 +200,7 @@
this.jobCount++;
// release the worker
- monitor.release(this);
+ ((WorkerMonitorImpl) monitor).release(this);
}
}
Modified: portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerMonitorImpl.java
URL: http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerMonitorImpl.java?rev=587066&r1=587065&r2=587066&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerMonitorImpl.java (original)
+++ portals/jetspeed-2/trunk/components/jetspeed-portal/src/main/java/org/apache/jetspeed/aggregator/impl/WorkerMonitorImpl.java Mon Oct 22 04:57:40 2007
@@ -100,7 +100,7 @@
public void start()
{
addWorkers(this.minWorkers);
- setQueue(new FIFOQueue());
+ this.queue = new FIFOQueue();
jobMonitor = new RenderingJobTimeoutMonitor(1000);
jobMonitor.start();
@@ -113,11 +113,6 @@
jobMonitor = null;
}
-
- public void setQueue(Queue queue)
- {
- this.queue = queue;
- }
/**
* Create the request number of workers and add them to
@@ -152,7 +147,7 @@
*
* @return a Worker from the idle pool or null if non available
*/
- public Worker getWorker()
+ protected Worker getWorker()
{
synchronized(this.workers)
{
@@ -214,7 +209,7 @@
* Put back the worker in the idle queue unless there are pending jobs and
* worker can still be committed to a new job before being released.
*/
- public void release(Worker worker)
+ protected void release(Worker worker)
{
// if worker can still proces some jobs assign the first
// backlog job to this worker, else reset job count and put
@@ -238,7 +233,7 @@
if (job != null)
{
- AccessControlContext context = (AccessControlContext)job.getWorkerAttribute(ACCESS_CONTROL_CONTEXT_WORKER_ATTR);
+ AccessControlContext context = (AccessControlContext) job.getWorkerAttribute(ACCESS_CONTROL_CONTEXT_WORKER_ATTR);
worker.setJob(job, context);
runningJobs--;
return;
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org