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.backgroundtask.BackgroundTaskManager;
020 import com.liferay.portal.kernel.backgroundtask.BackgroundTaskManagerUtil;
021 import com.liferay.portal.kernel.cluster.ClusterExecutor;
022 import com.liferay.portal.kernel.cluster.ClusterMasterExecutor;
023 import com.liferay.portal.kernel.dao.db.DB;
024 import com.liferay.portal.kernel.dao.db.DBFactoryUtil;
025 import com.liferay.portal.kernel.events.ActionException;
026 import com.liferay.portal.kernel.events.SimpleAction;
027 import com.liferay.portal.kernel.executor.PortalExecutorManager;
028 import com.liferay.portal.kernel.log.Log;
029 import com.liferay.portal.kernel.log.LogFactoryUtil;
030 import com.liferay.portal.kernel.messaging.MessageBus;
031 import com.liferay.portal.kernel.nio.intraband.Intraband;
032 import com.liferay.portal.kernel.nio.intraband.SystemDataType;
033 import com.liferay.portal.kernel.nio.intraband.mailbox.MailboxDatagramReceiveHandler;
034 import com.liferay.portal.kernel.nio.intraband.messaging.MessageDatagramReceiveHandler;
035 import com.liferay.portal.kernel.nio.intraband.proxy.IntrabandProxyDatagramReceiveHandler;
036 import com.liferay.portal.kernel.nio.intraband.rpc.RPCDatagramReceiveHandler;
037 import com.liferay.portal.kernel.patcher.PatcherUtil;
038 import com.liferay.portal.kernel.resiliency.mpi.MPIHelperUtil;
039 import com.liferay.portal.kernel.resiliency.spi.agent.annotation.Direction;
040 import com.liferay.portal.kernel.resiliency.spi.agent.annotation.DistributedRegistry;
041 import com.liferay.portal.kernel.resiliency.spi.agent.annotation.MatchType;
042 import com.liferay.portal.kernel.scheduler.SchedulerEngineHelper;
043 import com.liferay.portal.kernel.scheduler.SchedulerLifecycle;
044 import com.liferay.portal.kernel.search.IndexerRegistry;
045 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
046 import com.liferay.portal.kernel.util.GetterUtil;
047 import com.liferay.portal.kernel.util.PortalLifecycle;
048 import com.liferay.portal.kernel.util.ReleaseInfo;
049 import com.liferay.portal.kernel.util.StringPool;
050 import com.liferay.portal.kernel.util.StringUtil;
051 import com.liferay.portal.kernel.util.Validator;
052 import com.liferay.portal.plugin.PluginPackageIndexer;
053 import com.liferay.portal.tools.DBUpgrader;
054 import com.liferay.portal.util.PropsValues;
055 import com.liferay.portal.util.WebKeys;
056 import com.liferay.portlet.messageboards.util.MBMessageIndexer;
057 import com.liferay.registry.Filter;
058 import com.liferay.registry.Registry;
059 import com.liferay.registry.RegistryUtil;
060 import com.liferay.registry.dependency.ServiceDependencyListener;
061 import com.liferay.registry.dependency.ServiceDependencyManager;
062 import com.liferay.taglib.servlet.JspFactorySwapper;
063
064 import javax.portlet.MimeResponse;
065 import javax.portlet.PortletRequest;
066
067 import org.apache.struts.tiles.taglib.ComponentConstants;
068
069
074 public class StartupAction extends SimpleAction {
075
076 @Override
077 public void run(String[] ids) throws ActionException {
078 try {
079 doRun(ids);
080 }
081 catch (RuntimeException re) {
082 throw re;
083 }
084 catch (Exception e) {
085 throw new ActionException(e);
086 }
087 }
088
089 protected void doRun(String[] ids) throws Exception {
090
091
092
093 System.out.println("Starting " + ReleaseInfo.getReleaseInfo());
094
095
096
097 if (_log.isInfoEnabled() && !PatcherUtil.hasInconsistentPatchLevels()) {
098 String installedPatches = StringUtil.merge(
099 PatcherUtil.getInstalledPatches(), StringPool.COMMA_AND_SPACE);
100
101 if (Validator.isNull(installedPatches)) {
102 _log.info("There are no patches installed");
103 }
104 else {
105 _log.info(
106 "The following patches are installed: " + installedPatches);
107 }
108 }
109
110
111
112 ServiceDependencyManager portalResiliencyServiceDependencyManager =
113 new ServiceDependencyManager();
114
115 portalResiliencyServiceDependencyManager.registerDependencies(
116 MessageBus.class, PortalExecutorManager.class);
117
118 portalResiliencyServiceDependencyManager.addServiceDependencyListener(
119 new PortalResiliencyServiceDependencyLister());
120
121
122
123 if (_log.isDebugEnabled()) {
124 _log.debug("Add shutdown hook");
125 }
126
127 Runtime runtime = Runtime.getRuntime();
128
129 runtime.addShutdownHook(new Thread(new ShutdownHook()));
130
131
132
133 ServiceDependencyManager indexerRegistryServiceDependencyManager =
134 new ServiceDependencyManager();
135
136 indexerRegistryServiceDependencyManager.registerDependencies(
137 IndexerRegistry.class);
138
139 indexerRegistryServiceDependencyManager.addServiceDependencyListener(
140 new ServiceDependencyListener() {
141
142 @Override
143 public void dependenciesFulfilled() {
144 IndexerRegistryUtil.register(new MBMessageIndexer());
145 IndexerRegistryUtil.register(new PluginPackageIndexer());
146 }
147
148 @Override
149 public void destroy() {
150 }
151
152 });
153
154
155
156 DB db = DBFactoryUtil.getDB();
157
158 String dbType = db.getType();
159
160 if (dbType.equals(DB.TYPE_MYSQL) &&
161 GetterUtil.getFloat(db.getVersionString()) < 5.6F) {
162
163 if (_log.isWarnEnabled()) {
164 _log.warn(
165 "Please upgrade to at least MySQL 5.6.4. The portal will " +
166 "soon drop support for older versions of MySQL.");
167 }
168 }
169
170
171
172 if (_log.isDebugEnabled()) {
173 _log.debug("Upgrade database");
174 }
175
176 DBUpgrader.upgrade();
177
178
179
180 if (_log.isDebugEnabled()) {
181 _log.debug("Initialize scheduler engine lifecycle");
182 }
183
184 ServiceDependencyManager schedulerServiceDependencyManager =
185 new ServiceDependencyManager();
186
187 schedulerServiceDependencyManager.addServiceDependencyListener(
188 new ServiceDependencyListener() {
189
190 @Override
191 public void dependenciesFulfilled() {
192 SchedulerLifecycle schedulerLifecycle =
193 new SchedulerLifecycle();
194
195 schedulerLifecycle.registerPortalLifecycle(
196 PortalLifecycle.METHOD_INIT);
197 }
198
199 @Override
200 public void destroy() {
201 }
202
203 });
204
205 final Registry registry = RegistryUtil.getRegistry();
206
207 Filter filter = registry.getFilter(
208 "(objectClass=com.liferay.portal.scheduler.quartz.internal." +
209 "QuartzSchemaManager)");
210
211 schedulerServiceDependencyManager.registerDependencies(
212 new Class[] {SchedulerEngineHelper.class},
213 new Filter[] {filter});
214
215
216
217 if (_log.isDebugEnabled()) {
218 _log.debug("Verify database");
219 }
220
221 DBUpgrader.verify();
222
223
224
225 ServiceDependencyManager clusterMasterExecutorServiceDependencyManager =
226 new ServiceDependencyManager();
227
228 clusterMasterExecutorServiceDependencyManager.
229 addServiceDependencyListener(
230 new ServiceDependencyListener() {
231
232 @Override
233 public void dependenciesFulfilled() {
234 ClusterMasterExecutor clusterMasterExecutor =
235 registry.getService(ClusterMasterExecutor.class);
236
237 if (!clusterMasterExecutor.isEnabled()) {
238 BackgroundTaskManagerUtil.cleanUpBackgroundTasks();
239 }
240 else {
241 clusterMasterExecutor.
242 notifyMasterTokenTransitionListeners();
243 }
244 }
245
246 @Override
247 public void destroy() {
248 }
249
250 });
251
252 clusterMasterExecutorServiceDependencyManager.registerDependencies(
253 BackgroundTaskManager.class, ClusterExecutor.class,
254 ClusterMasterExecutor.class);
255
256
257
258 JspFactorySwapper.swap();
259
260
261
262 CachedLoggerProvider.install();
263 }
264
265 private static final Log _log = LogFactoryUtil.getLog(StartupAction.class);
266
267 private class PortalResiliencyServiceDependencyLister
268 implements ServiceDependencyListener {
269
270 @Override
271 public void dependenciesFulfilled() {
272 Registry registry = RegistryUtil.getRegistry();
273
274 MessageBus messageBus = registry.getService(MessageBus.class);
275
276 try {
277 DistributedRegistry.registerDistributed(
278 ComponentConstants.COMPONENT_CONTEXT, Direction.DUPLEX,
279 MatchType.POSTFIX);
280 DistributedRegistry.registerDistributed(
281 MimeResponse.MARKUP_HEAD_ELEMENT, Direction.DUPLEX,
282 MatchType.EXACT);
283 DistributedRegistry.registerDistributed(
284 PortletRequest.LIFECYCLE_PHASE, Direction.DUPLEX,
285 MatchType.EXACT);
286 DistributedRegistry.registerDistributed(WebKeys.class);
287
288 Intraband intraband = MPIHelperUtil.getIntraband();
289
290 intraband.registerDatagramReceiveHandler(
291 SystemDataType.MAILBOX.getValue(),
292 new MailboxDatagramReceiveHandler());
293
294 intraband.registerDatagramReceiveHandler(
295 SystemDataType.MESSAGE.getValue(),
296 new MessageDatagramReceiveHandler(messageBus));
297
298 intraband.registerDatagramReceiveHandler(
299 SystemDataType.PROXY.getValue(),
300 new IntrabandProxyDatagramReceiveHandler());
301
302 intraband.registerDatagramReceiveHandler(
303 SystemDataType.RPC.getValue(),
304 new RPCDatagramReceiveHandler());
305
306 if (PropsValues.PORTAL_FABRIC_ENABLED) {
307 FabricServerUtil.start();
308 }
309 }
310 catch (Exception e) {
311 throw new IllegalStateException(
312 "Unable to initialize portal resiliency", e);
313 }
314 }
315
316 @Override
317 public void destroy() {
318 }
319
320 }
321
322 }