001
014
015 package com.liferay.portal.events;
016
017 import com.liferay.portal.fabric.server.FabricServerUtil;
018 import com.liferay.portal.jericho.CachedLoggerProvider;
019 import com.liferay.portal.kernel.cache.bootstrap.ClusterLinkBootstrapLoaderHelperUtil;
020 import com.liferay.portal.kernel.cluster.ClusterExecutor;
021 import com.liferay.portal.kernel.cluster.ClusterMasterExecutor;
022 import com.liferay.portal.kernel.events.ActionException;
023 import com.liferay.portal.kernel.events.SimpleAction;
024 import com.liferay.portal.kernel.executor.PortalExecutorManager;
025 import com.liferay.portal.kernel.log.Log;
026 import com.liferay.portal.kernel.log.LogFactoryUtil;
027 import com.liferay.portal.kernel.messaging.MessageBus;
028 import com.liferay.portal.kernel.nio.intraband.Intraband;
029 import com.liferay.portal.kernel.nio.intraband.SystemDataType;
030 import com.liferay.portal.kernel.nio.intraband.mailbox.MailboxDatagramReceiveHandler;
031 import com.liferay.portal.kernel.nio.intraband.messaging.MessageDatagramReceiveHandler;
032 import com.liferay.portal.kernel.nio.intraband.proxy.IntrabandProxyDatagramReceiveHandler;
033 import com.liferay.portal.kernel.nio.intraband.rpc.RPCDatagramReceiveHandler;
034 import com.liferay.portal.kernel.resiliency.mpi.MPIHelperUtil;
035 import com.liferay.portal.kernel.resiliency.spi.agent.annotation.Direction;
036 import com.liferay.portal.kernel.resiliency.spi.agent.annotation.DistributedRegistry;
037 import com.liferay.portal.kernel.resiliency.spi.agent.annotation.MatchType;
038 import com.liferay.portal.kernel.scheduler.SchedulerEngineHelper;
039 import com.liferay.portal.kernel.scheduler.SchedulerLifecycle;
040 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
041 import com.liferay.portal.kernel.util.PortalLifecycle;
042 import com.liferay.portal.kernel.util.ReleaseInfo;
043 import com.liferay.portal.plugin.PluginPackageIndexer;
044 import com.liferay.portal.service.BackgroundTaskLocalServiceUtil;
045 import com.liferay.portal.tools.DBUpgrader;
046 import com.liferay.portal.util.PropsValues;
047 import com.liferay.portal.util.WebKeys;
048 import com.liferay.portlet.messageboards.util.MBMessageIndexer;
049 import com.liferay.registry.Filter;
050 import com.liferay.registry.Registry;
051 import com.liferay.registry.RegistryUtil;
052 import com.liferay.registry.dependency.ServiceDependencyListener;
053 import com.liferay.registry.dependency.ServiceDependencyManager;
054 import com.liferay.taglib.servlet.JspFactorySwapper;
055
056 import javax.portlet.MimeResponse;
057 import javax.portlet.PortletRequest;
058
059 import org.apache.struts.taglib.tiles.ComponentConstants;
060
061
066 public class StartupAction extends SimpleAction {
067
068 @Override
069 public void run(String[] ids) throws ActionException {
070 try {
071 doRun(ids);
072 }
073 catch (RuntimeException re) {
074 throw re;
075 }
076 catch (Exception e) {
077 throw new ActionException(e);
078 }
079 }
080
081 protected void doRun(String[] ids) throws Exception {
082
083
084
085 System.out.println("Starting " + ReleaseInfo.getReleaseInfo());
086
087
088
089 ServiceDependencyManager portalResiliencyServiceDependencyManager =
090 new ServiceDependencyManager();
091
092 portalResiliencyServiceDependencyManager.registerDependencies(
093 MessageBus.class, PortalExecutorManager.class);
094
095 portalResiliencyServiceDependencyManager.addServiceDependencyListener(
096 new PortalResiliencyServiceDependencyLister());
097
098
099
100 if (_log.isDebugEnabled()) {
101 _log.debug("Add shutdown hook");
102 }
103
104 Runtime runtime = Runtime.getRuntime();
105
106 runtime.addShutdownHook(new Thread(new ShutdownHook()));
107
108
109
110 IndexerRegistryUtil.register(new MBMessageIndexer());
111 IndexerRegistryUtil.register(new PluginPackageIndexer());
112
113
114
115 if (_log.isDebugEnabled()) {
116 _log.debug("Upgrade database");
117 }
118
119 DBUpgrader.upgrade();
120
121
122
123 ClusterLinkBootstrapLoaderHelperUtil.start();
124
125
126
127 if (_log.isDebugEnabled()) {
128 _log.debug("Initialize scheduler engine lifecycle");
129 }
130
131 ServiceDependencyManager schedulerServiceDependencyManager =
132 new ServiceDependencyManager();
133
134 schedulerServiceDependencyManager.addServiceDependencyListener(
135 new ServiceDependencyListener() {
136
137 @Override
138 public void dependenciesFulfilled() {
139 SchedulerLifecycle schedulerLifecycle =
140 new SchedulerLifecycle();
141
142 schedulerLifecycle.registerPortalLifecycle(
143 PortalLifecycle.METHOD_INIT);
144 }
145
146 @Override
147 public void destroy() {
148 }
149
150 });
151
152 final Registry registry = RegistryUtil.getRegistry();
153
154 Filter filter = registry.getFilter(
155 "(objectClass=com.liferay.portal.scheduler.quartz.internal." +
156 "QuartzSchemaManager)");
157
158 schedulerServiceDependencyManager.registerDependencies(
159 new Class[] {SchedulerEngineHelper.class},
160 new Filter[] {filter});
161
162
163
164 if (_log.isDebugEnabled()) {
165 _log.debug("Verify database");
166 }
167
168 DBUpgrader.verify();
169
170
171
172 ServiceDependencyManager clusterMasterExecutorServiceDependencyManager =
173 new ServiceDependencyManager();
174
175 clusterMasterExecutorServiceDependencyManager.
176 addServiceDependencyListener(
177 new ServiceDependencyListener() {
178
179 @Override
180 public void dependenciesFulfilled() {
181 ClusterMasterExecutor clusterMasterExecutor =
182 registry.getService(ClusterMasterExecutor.class);
183
184 if (!clusterMasterExecutor.isEnabled()) {
185 BackgroundTaskLocalServiceUtil.
186 cleanUpBackgroundTasks();
187 }
188 else {
189 clusterMasterExecutor.
190 notifyMasterTokenTransitionListeners();
191 }
192 }
193
194 @Override
195 public void destroy() {
196 }
197
198 });
199
200 clusterMasterExecutorServiceDependencyManager.registerDependencies(
201 ClusterExecutor.class, ClusterMasterExecutor.class);
202
203
204
205 JspFactorySwapper.swap();
206
207
208
209 CachedLoggerProvider.install();
210 }
211
212 private static final Log _log = LogFactoryUtil.getLog(StartupAction.class);
213
214 private class PortalResiliencyServiceDependencyLister
215 implements ServiceDependencyListener {
216
217 @Override
218 public void dependenciesFulfilled() {
219 Registry registry = RegistryUtil.getRegistry();
220
221 MessageBus messageBus = registry.getService(MessageBus.class);
222
223 try {
224 DistributedRegistry.registerDistributed(
225 ComponentConstants.COMPONENT_CONTEXT, Direction.DUPLEX,
226 MatchType.POSTFIX);
227 DistributedRegistry.registerDistributed(
228 MimeResponse.MARKUP_HEAD_ELEMENT, Direction.DUPLEX,
229 MatchType.EXACT);
230 DistributedRegistry.registerDistributed(
231 PortletRequest.LIFECYCLE_PHASE, Direction.DUPLEX,
232 MatchType.EXACT);
233 DistributedRegistry.registerDistributed(WebKeys.class);
234
235 Intraband intraband = MPIHelperUtil.getIntraband();
236
237 intraband.registerDatagramReceiveHandler(
238 SystemDataType.MAILBOX.getValue(),
239 new MailboxDatagramReceiveHandler());
240
241 intraband.registerDatagramReceiveHandler(
242 SystemDataType.MESSAGE.getValue(),
243 new MessageDatagramReceiveHandler(messageBus));
244
245 intraband.registerDatagramReceiveHandler(
246 SystemDataType.PROXY.getValue(),
247 new IntrabandProxyDatagramReceiveHandler());
248
249 intraband.registerDatagramReceiveHandler(
250 SystemDataType.RPC.getValue(),
251 new RPCDatagramReceiveHandler());
252
253 if (PropsValues.PORTAL_FABRIC_ENABLED) {
254 FabricServerUtil.start();
255 }
256 }
257 catch (Exception e) {
258 throw new IllegalStateException(
259 "Unable to initialize portal resiliency", e);
260 }
261 }
262
263 @Override
264 public void destroy() {
265 }
266
267 }
268
269 }