1
22
23 package com.liferay.portal.servlet;
24
25 import com.liferay.portal.kernel.job.JobSchedulerUtil;
26 import com.liferay.portal.kernel.log.Log;
27 import com.liferay.portal.kernel.log.LogFactoryUtil;
28 import com.liferay.portal.kernel.util.GetterUtil;
29 import com.liferay.portal.kernel.util.ObjectValuePair;
30 import com.liferay.portal.kernel.util.PropsKeys;
31 import com.liferay.portal.search.lucene.CleanUpJob;
32 import com.liferay.portal.search.lucene.LuceneIndexer;
33 import com.liferay.portal.util.PortalInstances;
34 import com.liferay.portal.util.PropsUtil;
35 import com.liferay.portal.util.PropsValues;
36
37 import java.util.ArrayList;
38 import java.util.List;
39
40 import javax.servlet.ServletConfig;
41 import javax.servlet.ServletException;
42 import javax.servlet.http.HttpServlet;
43
44
50 public class LuceneServlet extends HttpServlet {
51
52 public void init(ServletConfig servletConfig) throws ServletException {
53 super.init(servletConfig);
54
55 long[] companyIds = PortalInstances.getCompanyIds();
56
57 for (int i = 0; i < companyIds.length; i++) {
58 long companyId = companyIds[i];
59
60 if (GetterUtil.getBoolean(
61 PropsUtil.get(PropsKeys.INDEX_ON_STARTUP))) {
62
63 if (_log.isInfoEnabled()) {
64 _log.info("Indexing Lucene on startup");
65 }
66
67 LuceneIndexer indexer = new LuceneIndexer(companyId);
68 Thread indexerThread = null;
69
70 if (GetterUtil.getBoolean(
71 PropsUtil.get(PropsKeys.INDEX_WITH_THREAD))) {
72
73 indexerThread = new Thread(
74 indexer, THREAD_NAME + "." + companyId);
75
76 indexerThread.setPriority(THREAD_PRIORITY);
77
78 indexerThread.start();
79 }
80 else {
81 indexer.reIndex();
82 }
83
84 _indexers.add(
85 new ObjectValuePair<LuceneIndexer, Thread>(
86 indexer, indexerThread));
87 }
88
89 if (PropsValues.LUCENE_STORE_JDBC_AUTO_CLEAN_UP) {
90 JobSchedulerUtil.schedule(new CleanUpJob());
91 }
92 }
93 }
94
95 public void destroy() {
96
97
99 for (int i = 0; i < _indexers.size(); i++) {
100 ObjectValuePair<LuceneIndexer, Thread> ovp = _indexers.get(i);
101
102 LuceneIndexer indexer = ovp.getKey();
103 Thread indexerThread = ovp.getValue();
104
105 if ((indexer != null) && (!indexer.isFinished()) &&
106 (indexerThread != null)) {
107
108 if (_log.isWarnEnabled()) {
109 _log.warn("Waiting for Lucene indexer to shutdown");
110 }
111
112 indexer.halt();
113
114 try {
115 indexerThread.join(THREAD_TIMEOUT);
116 }
117 catch (InterruptedException e) {
118 _log.error("Lucene indexer shutdown interrupted", e);
119 }
120 }
121 }
122
123
125 super.destroy();
126 }
127
128 private static final String THREAD_NAME = LuceneIndexer.class.getName();
129
130 private static final int THREAD_PRIORITY = Thread.MIN_PRIORITY;
131
132 private static final int THREAD_TIMEOUT = 60000;
133
134 private static Log _log = LogFactoryUtil.getLog(LuceneServlet.class);
135
136 private List<ObjectValuePair<LuceneIndexer, Thread>> _indexers =
137 new ArrayList<ObjectValuePair<LuceneIndexer, Thread>>();
138
139 }