・ DI zu enum ・ Speicherplatz sparen ・ Unterstützt hohe Last mit Cache-Funktion · Schreibgeschützt ・ Ich benutze es für Ranking etc. ・ Unterstützt sowohl Spring Framework als auch Spring Boot ・ Für Mapper lesen Sie bitte und stellen Sie sie entsprechend ein. -Initialisieren beim Aktualisieren des Kontexts
・ Spring Framework 4.2.9 ・ Spring Boot 2.2.1 · Java 1.8 ・ Windows 10 64bit
SampleRankingSingletonService · Singleton-Dienst (enum), der Daten erfasst und speichert ・ Ich möchte DI Mapper mit @Autowired erstellen, kann dies jedoch nicht. Erstellen Sie daher einen separaten Initialisierungsdienst. ・ Ich denke, es ist besser, ein Programm hinzuzufügen, um die Daten zu verarbeiten. (Die Ausgabe von SQL ist eine schwere Last)
public enum SampleRankingSingletonService {
INSTANCE;
//Zeitüberschreitungswerteinstellung lesen
public static final int TIMEOUT_SEC = 1800;
private static final Object lock = new Object();
private LocalDateTime queryDate;
//Neuestes Ranking
private List<Sample> latestRanking = new CopyOnWriteArrayList<>();
private SampleMapper sampleMapper;
private SampleRankingSingletonService () {
}
public static SampleRankingSingletonService getInstance() {
return INSTANCE;
}
private boolean isTimeout() {
LocalDateTime execDate = LocalDateTime.now();
if (queryDate == null) { return true; }
LocalDateTime expireDate = queryDate.plusSeconds(TIMEOUT_SEC);
if (expireDate.isBefore(execDate)) {
return true;
}
return false;
}
public synchronized void reload() {
queryDate = LocalDateTime.now();
latestRanking = sampleMapper.selectLatestRanking(); // <-Ranking-Erfassung SQL-Ausgabe
}
//Rufen Sie an, bevor Sie die Datenverarbeitung durchführen
public void initQuery() {
synchronized(lock) {
if (isTimeout() || latestRanking.size() <= 0) {
reload();
}
}
}
public Integer countLatestRanking() {
return latestRanking.size();
}
}
SampleRankingSingletonInitializerService ・ Wird automatisch von DI generiert
@Component
public class SampleRankingSingletonInitializerService {
@Autowired
private SampleMapper sampleMapper;
//Legen Sie den DI-Mapper im Singleton-Dienst fest, wenn Sie Beans generieren
@PostConstruct
public void init() {
SampleRankingSingletonService.INSTANCE.setSampleMapper(sampleMapper);
}
//Führen Sie die erste Abfrage aus, wenn Sie den Kontext aktualisieren(Spring Boot gibt beim Ausführen mit PostConstruct einen Fehler aus)
@EventListener
public void onContextRefreshedEvent(ContextRefreshedEvent evt) {
SampleRankingSingletonService.INSTANCE.initQuery();
}
public SampleMapper getSampleMapper() {
return sampleMapper;
}
public void setSampleMapper(SampleMapper sampleMapper) {
this.sampleMapper = sampleMapper;
}
}
<bean id="sample.sampleRankingSingletonInitializerService" class="org.sample.SampleRankingSingletonInitializerService">
<property name="sampleMapper" ref="sample.SampleMapper" />
</bean>
Es ist in Ordnung, wenn Sie einen Haltepunkt festlegen, nach dem Starten des Servers ordnungsgemäß anhalten und die Daten abrufen. Danke für deine harte Arbeit!
Recommended Posts