[Contrib: Evaluation System] AARON: Advice about dao.obtainLock()
Jim Eng
jimeng at umich.edu
Fri Dec 9 06:35:30 PST 2011
Thanks, Aaron. I agree about not fitting into any of the existing interfaces. I went through each of them and didn't find a good home for these methods. You are correct that they are just a copy of the dao methods, and the impls simply call the dao methods. I thought about the possibility of throwing an exception in case of a null return value at the logic layer, but that didn't seem necessary.
Again, thanks for taking a look at this.
Jim
On Dec 9, 2011, at 9:29 AM, Aaron Zeckoski wrote:
> That should work. Looks like this signature is basically just a copy
> of the DAO methods but this should avoid a dependency loop as long as
> it is not used from anything which does not have access to the DAO
> currently.
> This could probably go in one of the existing interfaces though it
> doesn't really fit in one of them all that well.
> -AZ
>
>
> On Thu, Dec 8, 2011 at 10:43 AM, Jim Eng <jimeng at umich.edu> wrote:
>> I'd like to propose a "LockManager" interface as shown below. The impl
>> would be a class that just calls the corresponding dao methods. Would this
>> make sense?
>>
>> Jim
>>
>> package org.sakaiproject.evaluation.logic;
>>
>> /**
>> *
>> *
>> */
>> public interface EvalLockManager {
>>
>> /**
>> * Allows a lock to be obtained that is system wide,
>> * this is primarily for ensuring something runs on a single server only
>> in a cluster<br/>
>> * <b>NOTE:</b> This intentionally returns a null on failure rather than
>> an exception since exceptions will
>> * cause a rollback which makes the current session effectively dead,
>> this also makes it impossible to
>> * control the failure so instead we return null as a marker
>> *
>> * @param lockId the name of the lock which we are seeking
>> * @param holderId a unique id for the holder of this lock (normally a
>> server id)
>> * @param timePeriod the length of time (in milliseconds) that the lock
>> should be valid for,
>> * set this very low for non-repeating processes (the length of time the
>> process should take to run)
>> * and the length of the repeat period plus the time to run the process
>> for repeating jobs
>> * @return true if a lock was obtained, false if not, null if failure
>> */
>> public Boolean obtainLock(String lockId, String executerId, long
>> timePeriod);
>>
>> /**
>> * Releases a lock that was being held,
>> * this is useful if you know a server is shutting down and you want to
>> release your locks early<br/>
>> * <b>NOTE:</b> This intentionally returns a null on failure rather than
>> an exception since exceptions will
>> * cause a rollback which makes the current session effectively dead,
>> this also makes it impossible to
>> * control the failure so instead we return null as a marker
>> *
>> * @param lockId the name of the lock which we are seeking
>> * @param holderId a unique id for the holder of this lock (normally a
>> server id)
>> * @return true if a lock was released, false if not, null if failure
>> */
>> public Boolean releaseLock(String lockId, String executerId);
>>
>> }
>>
>>
>>
>> On Dec 8, 2011, at 10:27 AM, Jim Eng wrote:
>>
>> Hi Aaron,
>>
>> The eval dao has methods to obtain and release a lock, with the primary
>> intention being that a server obtains a lock on a process so it is done by
>> one and only one server in the cluster. This seems perfect for what I want
>> to do in
>> org.sakaiproject.evaluation.logic.scheduling.ConsolidatedNotificationsJobImpl,
>> but it doesn't seem like it's available there. The classes in that package
>> use the logic-layer rather than the dao. Other than a few test classes, the
>> only places I see the dao.obtainLock() method called is within two methods
>> in the authoring service and the eval setup service. I would like to call
>> dao.obtainLock() at the beginning of the execute() method in
>> ConsolidatedNotificationsJobImpl and then release the lock at the end of
>> that method.
>>
>> Would it make sense to add methods similar to dao.obtainLock() and
>> dao.releaseLock() to one of the logic interfaces so they could be used in
>> places where the dao should not be accessed?
>>
>> I'd appreciate any advice you can give.
>>
>> Thanks.
>>
>> Jim
>>
>>
>
>
>
> --
> Aaron Zeckoski - Software Architect - http://tinyurl.com/azprofile
>
>
More information about the evaluation
mailing list