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