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