7e772f75fc834abf48cede187170808b1f9934ed
[mediacube.git] /
1 package hu.user.mediacube.indexer.service;\r
2 \r
3 import static java.util.concurrent.TimeUnit.SECONDS;\r
4 \r
5 import java.io.IOException;\r
6 import java.util.List;\r
7 import java.util.concurrent.Executors;\r
8 import java.util.concurrent.ScheduledExecutorService;\r
9 import java.util.concurrent.ScheduledFuture;\r
10 \r
11 import javax.annotation.PreDestroy;\r
12 \r
13 import org.apache.ibatis.logging.LogFactory;\r
14 import org.slf4j.Logger;\r
15 import org.slf4j.LoggerFactory;\r
16 import org.springframework.beans.factory.annotation.Autowired;\r
17 import org.springframework.stereotype.Component;\r
18 \r
19 import hu.user.mediacube.indexer.JsonProperties;\r
20 import hu.user.mediacube.indexer.db.IndexerDescription;\r
21 import hu.user.mediacube.indexer.db.IndexerViewMapper;\r
22 import hu.user.mediacube.indexer.db.MediadescriptionMapper;\r
23 import hu.user.mediacube.indexer.lucene.LuceneIndexer;\r
24 \r
25 //@Service\r
26 @Component\r
27 public class IndexerService implements Runnable {\r
28         private static Logger logger = LoggerFactory.getLogger(IndexerService.class);\r
29         private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);\r
30         private ScheduledFuture<?> beeperHandle;\r
31 \r
32         @Autowired\r
33         private IndexerViewMapper mapper;\r
34         @Autowired\r
35         private MediadescriptionMapper mmapper;\r
36         @Autowired\r
37         private LuceneIndexer indexer;\r
38         @Autowired\r
39         private JsonProperties config;\r
40 \r
41         @Override\r
42         // periodic task\r
43         public void run() {\r
44                 logger.info("Reading index");\r
45                 List<IndexerDescription> indexerDescriptions = mapper.selectAll();\r
46                 int i = 0;\r
47                 LogFactory.useLog4J2Logging();\r
48 \r
49                 int logStep = indexerDescriptions.size() / 10;\r
50 \r
51                 for (IndexerDescription indexerDescription : indexerDescriptions) {\r
52 \r
53                         String description = mapper.selectDescription(indexerDescription);\r
54                         indexerDescription.setDescription(description);\r
55                         // logger.info("{}", indexerDescription);\r
56                         boolean putLog = ++i % logStep == 0;\r
57                         boolean lastRow = i == indexerDescriptions.size();\r
58                         try {\r
59                                 indexer.index(indexerDescription);\r
60 \r
61                                 if (putLog || lastRow)\r
62                                         logger.info("Processed {} / {}", i, indexerDescriptions.size());\r
63 \r
64                                 if (lastRow) {\r
65                                         indexer.commit();\r
66                                         logger.error("Index committed");\r
67                                 }\r
68                         } catch (IOException e) {\r
69                                 logger.error("Can not create index, caused by {} : {}", e.getClass().getSimpleName(), e.getMessage(),\r
70                                                 e);\r
71                                 break;\r
72                         }\r
73 \r
74                 }\r
75         }\r
76 \r
77         public void schedule() {\r
78                 // beeperHandle = scheduler.scheduleAtFixedRate(this, 0, 5, SECONDS);\r
79                 beeperHandle = scheduler.schedule(this, 0, SECONDS);\r
80 \r
81                 // scheduler.schedule(new Runnable() {\r
82                 // @Override\r
83                 // public void run() {\r
84                 // beeperHandle.cancel(true);\r
85                 // }\r
86                 // }, 60 * 60, SECONDS);\r
87         }\r
88 \r
89         // @PostConstruct\r
90         public void start() {\r
91                 logger.info("start");\r
92                 // schedule();\r
93                 if (config.isResetIndex())\r
94                         run();\r
95         }\r
96 \r
97         @PreDestroy\r
98         public void stop() {\r
99                 if (beeperHandle != null)\r
100                         beeperHandle.cancel(true);\r
101                 // try {\r
102                 // scheduler.awaitTermination(2, TimeUnit.SECONDS);\r
103                 // } catch (InterruptedException e) {\r
104                 // logger.error("Scheduler termination error", e);\r
105                 // }\r
106                 logger.info("stop");\r
107         }\r
108 }\r