atg.commerce.order.scheduled
Class ScheduledOrderService

java.lang.Object
  extended by atg.nucleus.logging.VariableArgumentApplicationLoggingImpl
      extended by atg.nucleus.GenericService
          extended by atg.service.scheduler.SchedulableService
              extended by atg.service.scheduler.SingletonSchedulableService
                  extended by atg.commerce.order.scheduled.ScheduledOrderService
All Implemented Interfaces:
atg.naming.AbsoluteNameable, NameContextBindingListener, NameContextElement, atg.naming.NameContextParentable, NameResolver, AdminableService, atg.nucleus.Configured, ApplicationLogging, atg.nucleus.logging.ApplicationLoggingSender, atg.nucleus.logging.TraceApplicationLogging, VariableArgumentApplicationLogging, ComponentNameResolver, Service, ServiceListener, Schedulable, java.util.EventListener

public class ScheduledOrderService
extends SingletonSchedulableService

This class is the back-end service responsible for processsing scheduled orders, on periodic intervals defined by the property pollSchedule. The interval specified begins counting after Dynamo server starts. Therefore, if Dynamo server is rebooted every 11 hours, and pollSchedule is set to "every 12 hours", then no orders will ever be placed. A shorter interval might reduce performance, but it will never cause the situation that some schedule orders will miss being placed on time. The method doScheduledTask is a call-back method which is called whenever the schedule order is scheduled to be placed. It calls processDueScheduledOrders to process any due schedule orders. Other objects can also call this method to trigger a poll on demand. The method peformScheduledTask will poll the order repository defined by property orderReposiotry with the repository view of itemDescriptorName. The poll query is defined by the property pollQuery. All the scheduled orders returned are processed individually which is sent to the fullfiller for processing, and the nextScheduledRun property is updated to reflect the next time the order should be placed. If something wrong happens when proocessing an individual schedule order, an CommerceException will be thrown and the other schedule orders are processed without any impact. In an error condition, the state of the scheduled order is changed to PENDING_CUSTOMER_ACTION.


Field Summary
static java.lang.String CLASS_VERSION
          Class version string
protected static java.util.ResourceBundle sResourceBundle
          Resource Bundle
 
Fields inherited from class atg.service.scheduler.SchedulableService
mJobId
 
Fields inherited from class atg.nucleus.GenericService
SERVICE_INFO_KEY
 
Fields inherited from interface atg.nucleus.logging.TraceApplicationLogging
DEFAULT_LOG_TRACE_STATUS
 
Fields inherited from interface atg.nucleus.logging.ApplicationLogging
DEFAULT_LOG_DEBUG_STATUS, DEFAULT_LOG_ERROR_STATUS, DEFAULT_LOG_INFO_STATUS, DEFAULT_LOG_WARNING_STATUS
 
Constructor Summary
ScheduledOrderService()
          Constructs an empty ScheduledOrderService
 
Method Summary
protected  java.sql.Timestamp calculateNextScheduledRun(MutableRepositoryItem pScheduledOrderItem)
          Calculates the next scheduled run time for a scheduled order item
 void doScheduledTask(Scheduler pScheduler, ScheduledJob pScheudledJob)
          This method is a call-back method.
 atg.commerce.order.scheduled.ScheduledOrderThreadDispatcher getDispatcher()
          Returns a dispatcher for multi-threaded processing.
 java.lang.String getItemDescriptorName()
          Returns property ItemDescriptorName
 int getMaxThreads()
          Returns the maximum number of threads to use for processing orders.
protected  long getNextScheduledRun(MutableRepositoryItem pItem, long pLastRun)
          This method calculates the next schedule run time for the Scheduled Order.
 OrderManager getOrderManager()
          Returns property OrderManager
 MutableRepository getOrderRepository()
          Returns property OrderRepository
 RqlStatement getPollQuery()
          Returns property PollQuery.
 ScheduledOrderTools getScheduledOrderTools()
          Returns property ScheduledOrderTools
 javax.transaction.TransactionManager getTransactionManager()
          Returns property TransactionManager
protected  void placeScheduledOrder(MutableRepositoryItem pScheduledOrder)
          This method places the Scheduled Order by first retrieving the template order for this Scheduled Order, then cloning it and repricing the cloned order.
protected  RepositoryItem[] pollForNewOrders()
          This method polls the Schedule Order Repository based on the defined query and returns an array of found scheduled orders which should be run.
protected  void processDueScheduledOrder(RepositoryItem pItem)
          This method processes each individual Scheduled Order and if sucessfully processing it, set the next Schedule time for the Scheduled Order.
protected  void processDueScheduledOrders()
          This method finds the due Scheduled Orders and processes each one individually.
protected  void repriceScheduledOrder(Order pScheduledOrder, Order pTemplateOrder, RepositoryItem pProfile, java.util.Locale pLocale)
          This method reprices the Schedule Order
protected  void repriceScheduledOrder(Order pScheduledOrder, RepositoryItem pProfile, java.util.Locale pLocale)
          Deprecated.  
 void setItemDescriptorName(java.lang.String pItemDescriptorName)
          Sets property ItemDescriptorName
 void setMaxThreads(int pMaxThreads)
          Sets the maximum number of threads to use for processing orders.
 void setOrderManager(OrderManager pOrderManager)
          Sets property OrderManager
 void setOrderRepository(MutableRepository pOrderRepository)
          Sets property OrderRepository
 void setPollQuery(RqlStatement pPollQuery)
          Sets property PollQuery
 void setScheduledOrderTools(ScheduledOrderTools pScheduledOrderTools)
          Sets property ScheduledOrderTools
 
Methods inherited from class atg.service.scheduler.SingletonSchedulableService
acquireLock, getClientLockManager, getLockName, getLockTimeOut, performScheduledTask, releaseLock, setClientLockManager, setLockName, setLockTimeOut
 
Methods inherited from class atg.service.scheduler.SchedulableService
doStartService, doStopService, getJobDescription, getJobId, getJobName, getSchedule, getScheduler, getThreadMethod, getThreadMethodString, isTransactional, setJobDescription, setJobName, setSchedule, setScheduler, setThreadMethod, setThreadMethodString, setTransactional, startScheduledJob, stopScheduledJob
 
Methods inherited from class atg.nucleus.GenericService
addLogListener, createAdminServlet, getAbsoluteName, getAdminServlet, getAdminServletOutputStreamEncoding, getLoggingForVlogging, getLogListenerCount, getLogListeners, getName, getNameContext, getNucleus, getRoot, getServiceConfiguration, getServiceInfo, isAdminServletUseServletOutputStream, isLoggingDebug, isLoggingError, isLoggingInfo, isLoggingTrace, isLoggingWarning, isRunning, logDebug, logDebug, logDebug, logError, logError, logError, logInfo, logInfo, logInfo, logTrace, logTrace, logTrace, logWarning, logWarning, logWarning, nameContextElementBound, nameContextElementUnbound, removeLogListener, reResolveThis, resolveName, resolveName, resolveName, resolveName, sendLogEvent, setAdminServletOutputStreamEncoding, setAdminServletUseServletOutputStream, setLoggingDebug, setLoggingError, setLoggingInfo, setLoggingTrace, setLoggingWarning, setNucleus, setServiceInfo, startService, stopService
 
Methods inherited from class atg.nucleus.logging.VariableArgumentApplicationLoggingImpl
vlogDebug, vlogDebug, vlogDebug, vlogDebug, vlogDebugTrace, vlogError, vlogError, vlogError, vlogError, vlogInfo, vlogInfo, vlogInfo, vlogInfo, vlogTrace, vlogTrace, vlogTrace, vlogTrace, vlogWarning, vlogWarning, vlogWarning, vlogWarning
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

CLASS_VERSION

public static java.lang.String CLASS_VERSION
Class version string


sResourceBundle

protected static java.util.ResourceBundle sResourceBundle
Resource Bundle

Constructor Detail

ScheduledOrderService

public ScheduledOrderService()
Constructs an empty ScheduledOrderService

Method Detail

getItemDescriptorName

public java.lang.String getItemDescriptorName()
Returns property ItemDescriptorName

Returns:
returns property ItemDescriptorName

setItemDescriptorName

public void setItemDescriptorName(java.lang.String pItemDescriptorName)
Sets property ItemDescriptorName

Parameters:
pItemDescriptorName - the value to set for property ItemDescriptorName

getOrderRepository

public MutableRepository getOrderRepository()
Returns property OrderRepository

Returns:
returns property OrderRepository

setOrderRepository

public void setOrderRepository(MutableRepository pOrderRepository)
Sets property OrderRepository

Parameters:
pOrderRepository - the value to set for property OrderRepository

setOrderManager

public void setOrderManager(OrderManager pOrderManager)
Sets property OrderManager

Parameters:
pOrderManager - the value to set for property OrderManager

getOrderManager

public OrderManager getOrderManager()
Returns property OrderManager

Returns:
returns property OrderManager

setScheduledOrderTools

public void setScheduledOrderTools(ScheduledOrderTools pScheduledOrderTools)
Sets property ScheduledOrderTools

Parameters:
pScheduledOrderTools - the value to set for property ScheduledOrderTools

getScheduledOrderTools

public ScheduledOrderTools getScheduledOrderTools()
Returns property ScheduledOrderTools

Returns:
returns property ScheduledOrderTools

getPollQuery

public RqlStatement getPollQuery()
Returns property PollQuery. The query is parameterized by a singe paramter, the current time. Example : nextScheduledRun < ?0 and state="active" and startDate < ?0 and endDate > ?0

Returns:
returns property PollQuery

setPollQuery

public void setPollQuery(RqlStatement pPollQuery)
Sets property PollQuery

Parameters:
pPollQuery - the value to set for property PollQuery

getMaxThreads

public int getMaxThreads()
Returns the maximum number of threads to use for processing orders.

Returns:
the maximum number of threads

setMaxThreads

public void setMaxThreads(int pMaxThreads)
Sets the maximum number of threads to use for processing orders.

Parameters:
pMaxThreads - the maximum number of threads to use for processing orders. A value of 2 or more enables multi-threading.

getDispatcher

public atg.commerce.order.scheduled.ScheduledOrderThreadDispatcher getDispatcher()
Returns a dispatcher for multi-threaded processing. Instantiates a dispatcher if one doesn't exist.

Returns:
returns a thread dispatcher

getTransactionManager

public javax.transaction.TransactionManager getTransactionManager()
Returns property TransactionManager

Returns:
returns property TransactionManager

doScheduledTask

public void doScheduledTask(Scheduler pScheduler,
                            ScheduledJob pScheudledJob)
This method is a call-back method. It will be called when the Schduler finds that the ScheduledJob is scheduled to run.

Specified by:
doScheduledTask in class SingletonSchedulableService
Parameters:
pScheduler - the Scheduler which manages all the Scheduled jobs
pScheduledJob - the job which will be run

pollForNewOrders

protected RepositoryItem[] pollForNewOrders()
                                     throws RepositoryException
This method polls the Schedule Order Repository based on the defined query and returns an array of found scheduled orders which should be run.

Returns:
an array of RepositoryItems which correponds to the due Schedule Orders
Throws:
RepositoryException - if an error occurs accessing the repository

processDueScheduledOrders

protected void processDueScheduledOrders()
This method finds the due Scheduled Orders and processes each one individually. If multi-threading is configured, processing is delegated to a pool of threads.


repriceScheduledOrder

protected void repriceScheduledOrder(Order pScheduledOrder,
                                     RepositoryItem pProfile,
                                     java.util.Locale pLocale)
                              throws CommerceException
Deprecated. 

This method reprices the Schedule Order

Parameters:
pScheduledOrder - the Scheduled Order to be repriced
pProfile - the Profile of the current user
pLocale - the locale of the current user
Throws:
CommerceException - thrown if any of the Commerce related error occurs
RepositoryException - if an error is found when accessing the repository

repriceScheduledOrder

protected void repriceScheduledOrder(Order pScheduledOrder,
                                     Order pTemplateOrder,
                                     RepositoryItem pProfile,
                                     java.util.Locale pLocale)
                              throws CommerceException
This method reprices the Schedule Order

Parameters:
pScheduledOrder - the Scheduled Order to be repriced
pTemplateOrder - the Template Order from which the scheduled order was created.
pProfile - the Profile of the current user
pLocale - the locale of the current user
Throws:
CommerceException - thrown if any of the Commerce related error occurs
RepositoryException - if an error is found when accessing the repository

processDueScheduledOrder

protected void processDueScheduledOrder(RepositoryItem pItem)
This method processes each individual Scheduled Order and if sucessfully processing it, set the next Schedule time for the Scheduled Order. If fails, rollback to the original state

Parameters:
pItem - the RepositoryItem that identifies the Schedule Order

calculateNextScheduledRun

protected java.sql.Timestamp calculateNextScheduledRun(MutableRepositoryItem pScheduledOrderItem)
                                                throws CommerceException
Calculates the next scheduled run time for a scheduled order item

For CalendarSchedules the current time is given to the schedule object as the basis for determining the next run time.

For PeriodicSchedules, the current value of the scheduled order item's nextRunTime, which is effectively the last run time, is provided as the basis for determining the next run time.

Parameters:
pScheduledOrderItem -
Returns:
next run time.
Throws:
CommerceException
See Also:
CalendarSchedule.getNextJobTime(long), PeriodicSchedule.getNextJobTime(long)

placeScheduledOrder

protected void placeScheduledOrder(MutableRepositoryItem pScheduledOrder)
                            throws CommerceException,
                                   RepositoryException,
                                   SiteContextException
This method places the Scheduled Order by first retrieving the template order for this Scheduled Order, then cloning it and repricing the cloned order. After sucessfully repricing it, it sends it to the Fullfiller to further process it.

Parameters:
pScheduledOrder - the Scheduled Order to be placed
Throws:
CommerceException - thrown if any of the Commerce related error occurs
RepositoryException - if an error is found when accessing the repository
SiteContextException
See Also:
ScheduledOrderTools

getNextScheduledRun

protected long getNextScheduledRun(MutableRepositoryItem pItem,
                                   long pLastRun)
                            throws CommerceException
This method calculates the next schedule run time for the Scheduled Order.

Parameters:
pItem - the Scheduled Order
pLastRun - the last running time
Returns:
the next Schedule run time
Throws:
CommerceException - thrown if any of the Commerce related error occurs