001
014
015 package com.liferay.portal.backgroundtask;
016
017 import com.liferay.portal.kernel.backgroundtask.BackgroundTaskStatus;
018 import com.liferay.portal.kernel.backgroundtask.BackgroundTaskStatusRegistry;
019 import com.liferay.portal.kernel.backgroundtask.BackgroundTaskStatusRegistryUtil;
020 import com.liferay.portal.kernel.cluster.ClusterMasterExecutorUtil;
021 import com.liferay.portal.kernel.log.Log;
022 import com.liferay.portal.kernel.log.LogFactoryUtil;
023 import com.liferay.portal.kernel.util.MethodHandler;
024
025 import java.util.HashMap;
026 import java.util.Map;
027 import java.util.concurrent.Future;
028 import java.util.concurrent.locks.Lock;
029 import java.util.concurrent.locks.ReadWriteLock;
030 import java.util.concurrent.locks.ReentrantReadWriteLock;
031
032
035 public class BackgroundTaskStatusRegistryImpl
036 implements BackgroundTaskStatusRegistry {
037
038 @Override
039 public BackgroundTaskStatus getBackgroundTaskStatus(long backgroundTaskId) {
040 if (!ClusterMasterExecutorUtil.isMaster()) {
041 return getMasterBackgroundTaskStatus(backgroundTaskId);
042 }
043
044 Lock lock = _readWriteLock.readLock();
045
046 lock.lock();
047
048 try {
049 return _backgroundTaskStatuses.get(backgroundTaskId);
050 }
051 finally {
052 lock.unlock();
053 }
054 }
055
056 @Override
057 public BackgroundTaskStatus registerBackgroundTaskStatus(
058 long backgroundTaskId) {
059
060 Lock lock = _readWriteLock.writeLock();
061
062 lock.lock();
063
064 try {
065 BackgroundTaskStatus backgroundTaskStatus =
066 _backgroundTaskStatuses.get(backgroundTaskId);
067
068 if (backgroundTaskStatus == null) {
069 backgroundTaskStatus = new BackgroundTaskStatus();
070
071 _backgroundTaskStatuses.put(
072 backgroundTaskId, backgroundTaskStatus);
073 }
074
075 return backgroundTaskStatus;
076 }
077 finally {
078 lock.unlock();
079 }
080 }
081
082 @Override
083 public BackgroundTaskStatus unregisterBackgroundTaskStatus(
084 long backgroundTaskId) {
085
086 Lock lock = _readWriteLock.writeLock();
087
088 lock.lock();
089
090 try {
091 BackgroundTaskStatus backgroundTaskStatus =
092 _backgroundTaskStatuses.remove(backgroundTaskId);
093
094 return backgroundTaskStatus;
095 }
096 finally {
097 lock.unlock();
098 }
099 }
100
101 protected BackgroundTaskStatus getMasterBackgroundTaskStatus(
102 long backgroundTaskId) {
103
104 try {
105 MethodHandler methodHandler = new MethodHandler(
106 BackgroundTaskStatusRegistryUtil.class.getDeclaredMethod(
107 "getBackgroundTaskStatus", long.class),
108 backgroundTaskId);
109
110 Future<BackgroundTaskStatus> future =
111 ClusterMasterExecutorUtil.executeOnMaster(methodHandler);
112
113 return future.get();
114 }
115 catch (Exception e) {
116 _log.error("Unable to retrieve status from master node", e);
117 }
118
119 return null;
120 }
121
122 private static final Log _log = LogFactoryUtil.getLog(
123 BackgroundTaskStatusRegistryImpl.class);
124
125 private final Map<Long, BackgroundTaskStatus> _backgroundTaskStatuses =
126 new HashMap<>();
127 private final ReadWriteLock _readWriteLock = new ReentrantReadWriteLock();
128
129 }