moved GlobalSite up to the main "svc" package; added AcceptGlobalSite interface
and new background-task system to GlobalSiteImpl
This commit is contained in:
parent
e40c1e6a58
commit
c6add9371b
|
@ -26,7 +26,7 @@ import com.silverwrist.venice.db.*;
|
|||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.security.AuditRecord;
|
||||
import com.silverwrist.venice.security.Role;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
|
||||
class AdminOperationsImpl implements AdminOperations
|
||||
{
|
||||
|
|
|
@ -30,7 +30,6 @@ import com.silverwrist.venice.except.*;
|
|||
import com.silverwrist.venice.security.AuditRecord;
|
||||
import com.silverwrist.venice.security.SecurityMonitor;
|
||||
import com.silverwrist.venice.svc.*;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.util.PropertyProvider;
|
||||
|
||||
class CommunityCoreData implements CommunityData, PropertyProvider
|
||||
|
|
|
@ -27,7 +27,7 @@ import com.silverwrist.venice.core.internals.*;
|
|||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.security.AuditRecord;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
|
||||
class ConferenceCoreData implements ConferenceData
|
||||
{
|
||||
|
|
|
@ -19,7 +19,7 @@ package com.silverwrist.venice.core.impl;
|
|||
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
import com.silverwrist.venice.util.MailSend;
|
||||
import com.silverwrist.venice.util.PropertyProvider;
|
||||
|
||||
|
|
|
@ -27,8 +27,8 @@ import com.silverwrist.venice.core.internals.*;
|
|||
import com.silverwrist.venice.db.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.security.*;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
import com.silverwrist.venice.svc.ServiceControl;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.util.*;
|
||||
|
||||
class UserContextImpl implements UserContext, ServiceProvider, PropertyProvider
|
||||
|
|
|
@ -31,7 +31,6 @@ import com.silverwrist.venice.except.*;
|
|||
import com.silverwrist.venice.htmlcheck.*;
|
||||
import com.silverwrist.venice.security.*;
|
||||
import com.silverwrist.venice.svc.*;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.util.MailSend;
|
||||
import com.silverwrist.venice.util.ServiceProvider;
|
||||
import com.silverwrist.venice.util.XMLLoader;
|
||||
|
|
|
@ -22,7 +22,7 @@ import javax.mail.*;
|
|||
import javax.mail.internet.*;
|
||||
import com.silverwrist.util.*;
|
||||
import com.silverwrist.venice.except.*;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
import com.silverwrist.venice.util.MailSend;
|
||||
|
||||
class BaseMailSend implements MailSend
|
||||
|
|
|
@ -26,8 +26,8 @@ import com.silverwrist.venice.db.*;
|
|||
import com.silverwrist.venice.except.AccessError;
|
||||
import com.silverwrist.venice.htmlcheck.HTMLChecker;
|
||||
import com.silverwrist.venice.security.*;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
import com.silverwrist.venice.svc.ServiceControl;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.util.MailSend;
|
||||
|
||||
public class EnvEngine
|
||||
|
|
|
@ -30,13 +30,56 @@ import com.silverwrist.venice.htmlcheck.dict.*;
|
|||
import com.silverwrist.venice.htmlcheck.filters.*;
|
||||
import com.silverwrist.venice.security.*;
|
||||
import com.silverwrist.venice.svc.*;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.util.ServiceProvider;
|
||||
import com.silverwrist.venice.util.MailSend;
|
||||
import com.silverwrist.venice.util.XMLLoader;
|
||||
|
||||
public class GlobalSiteImpl implements GlobalSite
|
||||
{
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Internal background thread class
|
||||
*--------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
class BackgroundThread extends Thread
|
||||
{
|
||||
BackgroundThread(int index)
|
||||
{
|
||||
super("GlobalSide_bkgd_" + String.valueOf(index + 1));
|
||||
|
||||
} // end constructor
|
||||
|
||||
private void doRunLoop(boolean quitting)
|
||||
{
|
||||
Runnable task = getNextTaskToRun(quitting);
|
||||
while (task!=null)
|
||||
{ // null task indicates we are shutting down
|
||||
try
|
||||
{ // run the background task
|
||||
task.run();
|
||||
|
||||
} // end try
|
||||
catch (Exception e)
|
||||
{ // log the exception and continue
|
||||
logger.error("Background thread caught exception",e);
|
||||
|
||||
} // end catch
|
||||
|
||||
task = getNextTaskToRun(quitting);
|
||||
|
||||
} // end while
|
||||
|
||||
} // end doRunLoop
|
||||
|
||||
public void run()
|
||||
{
|
||||
doRunLoop(false);
|
||||
doRunLoop(true);
|
||||
|
||||
} // end run
|
||||
|
||||
} // end class BackgroundThread
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Static data members
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -44,6 +87,8 @@ public class GlobalSiteImpl implements GlobalSite
|
|||
|
||||
private static Category logger = Category.getInstance(GlobalSiteImpl.class);
|
||||
|
||||
private static final int NUM_TASK_THREADS = 4; // TODO: make this configurable
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Attributes
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -56,6 +101,10 @@ public class GlobalSiteImpl implements GlobalSite
|
|||
private StockMessages stock_messages = null; // stock messages holder
|
||||
private HashMap html_checkers = new HashMap(); // HTML checkers
|
||||
private SecurityMonitorEnvironment sm_env; // security monitor environment
|
||||
private volatile boolean task_running = true; // running tasks flag
|
||||
private Object task_semaphore = new Object(); // semaphore used for tasks
|
||||
private LinkedList[] task_queues; // the task queues
|
||||
private Thread[] task_threads; // the task threads
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Constructor
|
||||
|
@ -155,6 +204,20 @@ public class GlobalSiteImpl implements GlobalSite
|
|||
|
||||
} // end for
|
||||
|
||||
// Initialize the task queues.
|
||||
task_queues = new LinkedList[TASK_PRIO_MAX + 1];
|
||||
for (i=0; i<task_queues.length; i++)
|
||||
task_queues[i] = new LinkedList();
|
||||
|
||||
// Initialize the threads.
|
||||
task_threads = new Thread[NUM_TASK_THREADS];
|
||||
for (i=0; i<task_threads.length; i++)
|
||||
{ // create and kick off the background threads
|
||||
task_threads[i] = new BackgroundThread(i);
|
||||
task_threads[i].start();
|
||||
|
||||
} // end for
|
||||
|
||||
} // end class GlobalSiteImpl
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
|
@ -374,6 +437,48 @@ public class GlobalSiteImpl implements GlobalSite
|
|||
|
||||
} // end createHTMLChecker
|
||||
|
||||
private final Runnable getNextTaskToRun(boolean quitting)
|
||||
{
|
||||
int i;
|
||||
|
||||
synchronized (task_semaphore)
|
||||
{ // acquire the task semaphore
|
||||
if (quitting)
|
||||
{ // just scan the queues and return the first available task
|
||||
for (i=TASK_PRIO_MAX; i>=TASK_PRIO_MIN; i--)
|
||||
if (!(task_queues[i].isEmpty())) // select a task from highest possible priority queue
|
||||
return (Runnable)(task_queues[i].removeFirst());
|
||||
|
||||
} // end if
|
||||
else
|
||||
{ // work it normally
|
||||
while (task_running)
|
||||
{ // look for a task we can do
|
||||
for (i=TASK_PRIO_MAX; i>=TASK_PRIO_MIN; i--)
|
||||
if (!(task_queues[i].isEmpty())) // select a task from highest possible priority queue
|
||||
return (Runnable)(task_queues[i].removeFirst());
|
||||
|
||||
try
|
||||
{ // wait for something to happen
|
||||
task_semaphore.wait();
|
||||
|
||||
} // end try
|
||||
catch (InterruptedException e)
|
||||
{ // do nothing
|
||||
} // end catch
|
||||
|
||||
// then go back around and look for a task
|
||||
|
||||
} // end while
|
||||
|
||||
} // end else
|
||||
|
||||
} // end synchronized block
|
||||
|
||||
return null; // if get here, task_running is false and we are quitting
|
||||
|
||||
} // end getNextTaskToRun
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* Implementations from interface ServiceProvider
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -461,6 +566,35 @@ public class GlobalSiteImpl implements GlobalSite
|
|||
|
||||
} // end getStockMessage
|
||||
|
||||
public void queueTask(Runnable task, int priority)
|
||||
{
|
||||
if ((priority<TASK_PRIO_MIN) || (priority>TASK_PRIO_MAX))
|
||||
throw new IllegalArgumentException("task priority out of range");
|
||||
if (task==null)
|
||||
throw new NullPointerException("task null");
|
||||
if (task instanceof AcceptGlobalSite)
|
||||
((AcceptGlobalSite)task).setGlobalSite(this);
|
||||
|
||||
synchronized (task_semaphore)
|
||||
{ // make sure we are running
|
||||
// If the running flag is off, only the background tasks themselves may queue new tasks.
|
||||
if (task_running || Thread.currentThread().getName().startsWith("GlobalSite_bkgd"));
|
||||
{ // add the task to a queue and notify a thread to take it
|
||||
task_queues[priority].addLast(task);
|
||||
task_semaphore.notify();
|
||||
|
||||
} // end if
|
||||
|
||||
} // end synchronized block
|
||||
|
||||
} // end queueTask
|
||||
|
||||
public void queueTask(Runnable task)
|
||||
{
|
||||
this.queueTask(task,TASK_PRIO_NORMAL);
|
||||
|
||||
} // end queueTask
|
||||
|
||||
/*--------------------------------------------------------------------------------
|
||||
* External operations
|
||||
*--------------------------------------------------------------------------------
|
||||
|
@ -468,6 +602,28 @@ public class GlobalSiteImpl implements GlobalSite
|
|||
|
||||
public void shutdown()
|
||||
{
|
||||
synchronized (task_semaphore)
|
||||
{ // notify the task threads that we're quitting
|
||||
task_running = false;
|
||||
task_semaphore.notifyAll();
|
||||
|
||||
} // end synchronized block
|
||||
|
||||
int i = 0;
|
||||
while (i<task_threads.length)
|
||||
{ // wait for all background threads to finally die
|
||||
try
|
||||
{ // wait for a thread to die
|
||||
task_threads[i].join();
|
||||
i++;
|
||||
|
||||
} // end try
|
||||
catch (InterruptedException e)
|
||||
{ // do nothing, but try this join again
|
||||
} // end catch
|
||||
|
||||
} // end while
|
||||
|
||||
engine_svc = null;
|
||||
if (datapool!=null)
|
||||
datapool.closeAllConnections();
|
||||
|
|
|
@ -23,7 +23,7 @@ import com.silverwrist.venice.htmlcheck.Rewriter;
|
|||
import com.silverwrist.venice.htmlcheck.RewriterServices;
|
||||
import com.silverwrist.venice.htmlcheck.MarkupData;
|
||||
import com.silverwrist.venice.except.ValidationException;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
import com.silverwrist.venice.util.IDUtils;
|
||||
|
||||
public class PostLinkRewriter implements Rewriter
|
||||
|
|
|
@ -22,7 +22,7 @@ import com.silverwrist.util.StringUtil;
|
|||
import com.silverwrist.venice.htmlcheck.Rewriter;
|
||||
import com.silverwrist.venice.htmlcheck.RewriterServices;
|
||||
import com.silverwrist.venice.htmlcheck.MarkupData;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
import com.silverwrist.venice.util.IDUtils;
|
||||
|
||||
public class UserNameRewriter implements Rewriter
|
||||
|
|
|
@ -24,7 +24,7 @@ import com.silverwrist.venice.db.SQLUtil;
|
|||
import com.silverwrist.venice.core.AuditData;
|
||||
import com.silverwrist.venice.except.DataException;
|
||||
import com.silverwrist.venice.except.InternalStateError;
|
||||
import com.silverwrist.venice.svc.internal.GlobalSite;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
|
||||
public class AuditRecord implements AuditData
|
||||
{
|
||||
|
|
24
src/com/silverwrist/venice/svc/AcceptGlobalSite.java
Normal file
24
src/com/silverwrist/venice/svc/AcceptGlobalSite.java
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||
* (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.mozilla.org/MPL/>.
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||
* language governing rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is the Venice Web Communities System.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
|
||||
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||
* Copyright (C) 2002 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.svc;
|
||||
|
||||
public interface AcceptGlobalSite
|
||||
{
|
||||
public abstract void setGlobalSite(GlobalSite site);
|
||||
|
||||
} // end interface AcceptGlobalSite
|
|
@ -15,7 +15,7 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
package com.silverwrist.venice.svc.internal;
|
||||
package com.silverwrist.venice.svc;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
|
@ -23,8 +23,16 @@ import com.silverwrist.venice.util.ServiceProvider;
|
|||
|
||||
public interface GlobalSite extends ServiceProvider
|
||||
{
|
||||
public static final int TASK_PRIO_MIN = 0;
|
||||
public static final int TASK_PRIO_NORMAL = 3;
|
||||
public static final int TASK_PRIO_MAX = 7;
|
||||
|
||||
public abstract Connection getConnection(String db_selector) throws SQLException;
|
||||
|
||||
public abstract String getStockMessage(String key);
|
||||
|
||||
public abstract void queueTask(Runnable task, int priority);
|
||||
|
||||
public abstract void queueTask(Runnable task);
|
||||
|
||||
} // end interface GlobalSite
|
|
@ -21,6 +21,7 @@ import org.w3c.dom.Element;
|
|||
import com.silverwrist.venice.core.ServiceToken;
|
||||
import com.silverwrist.venice.except.ConfigException;
|
||||
import com.silverwrist.venice.security.SecurityMonitor;
|
||||
import com.silverwrist.venice.svc.GlobalSite;
|
||||
|
||||
public interface CommServiceInternal extends ServiceInternal
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue
Block a user