package com.its.wthr; import com.its.app.AppUtils; import com.its.app.utils.OS; import com.its.app.utils.SysUtils; import com.its.wthr.config.ServerConfig; import com.its.wthr.process.DbmsJobProcess; import com.its.wthr.service.AtmpService; import com.its.wthr.service.FrcsService; import com.its.wthr.service.UnitSystService; import com.its.wthr.ui.JTextAreaOutputStream; import com.its.wthr.ui.MainUI; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.Banner; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.ApplicationPidFileWriter; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextClosedEvent; import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.annotation.EnableAsync; import javax.swing.*; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.net.URL; import java.text.SimpleDateFormat; @Slf4j @EnableAsync @Configuration @SpringBootApplication @ComponentScan(basePackages = {"com.its.wthr.config", "com.its.wthr.mapper", "com.its"}) public class WthrCommServerApplication implements CommandLineRunner, ApplicationListener, InitializingBean, DisposableBean { //public class WthrCommServerApplication implements CommandLineRunner, ApplicationListener, InitializingBean, DisposableBean { private static final String applicationName = "wthr-comm-server"; public static void main(String[] args) { File file1 = new File("./conf/" + applicationName + ".pid"); if (file1.exists()) { System.out.println(System.getProperty("Program Already Running.....")); log.error("Program Already Running....."); } if (OS.isWindows()) { ApplicationContext context = new SpringApplicationBuilder(WthrCommServerApplication.class) //.web(WebApplicationType.NONE) .listeners(new ApplicationPidFileWriter("./conf/" + applicationName + ".pid")) .headless(false) .bannerMode(Banner.Mode.OFF) .run(args); } else { SpringApplication application = new SpringApplicationBuilder() .sources(WthrCommServerApplication.class) .listeners(new ApplicationPidFileWriter("./conf/" + applicationName + ".pid")) .build(); application.setBannerMode(Banner.Mode.OFF); application.run(args); } } @Override public void run(String... args) throws Exception { ServerConfig serverConfig = (ServerConfig) AppUtils.getBean(ServerConfig.class); log.info(""); log.info(""); log.info("************************************************************************************"); log.info("** **"); log.info("** Intelligent Traffic System **"); log.info("** Weather(Open API) Communication Server. **"); log.info("** **"); log.info("** [ver.1.0] **"); log.info("** {}", serverConfig.getProcessId()); log.info("** startup: {}", serverConfig.getBootingDateTime()); log.info("************************************************************************************"); // init application DbmsJobProcess dbmsJobProcess = (DbmsJobProcess)AppUtils.getBean(DbmsJobProcess.class); dbmsJobProcess.run(); UnitSystService unitSystService = (UnitSystService)AppUtils.getBean(UnitSystService.class); unitSystService.loadMaster(); unitSystService.updateUnitSyst(true); AtmpService atmpService = (AtmpService)AppUtils.getBean(AtmpService.class); atmpService.doJob(); FrcsService frcsService = (FrcsService)AppUtils.getBean(FrcsService.class); frcsService.doJob(); // schedule enable serverConfig.setStartSchedule(true); if (OS.isWindows()) { SwingUtilities.invokeLater(() -> { String sysTime = SysUtils.getSysTimeStr(); //JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("기상정보 연계 서버 - [" + sysTime + "]"); MainUI UI = new MainUI(frame); try { ClassPathResource file = new ClassPathResource("static/image/application.png"); URL imgURL = file.getURL(); frame.setIconImage(new ImageIcon(imgURL).getImage()); } catch (IOException e) { log.error("Not found application icon image"); } frame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE); frame.setContentPane(UI.getRootPanel()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { if (JOptionPane.showConfirmDialog(UI.getRootPanel(), "시스템을 종료 하시겠습니까?", "시스템 종료", 0) == 0) { System.exit(0); } else { frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); } } }); frame.pack(); frame.setBounds(100, 100, 900, 700); frame.setLocationRelativeTo(null); frame.setVisible(true); JTextArea logArea = UI.getTaLog(); logArea.setText(null); JTextAreaOutputStream out = new JTextAreaOutputStream(logArea); System.setOut(new PrintStream(out)); UI.LoadControllerInfo(); }); } } public void terminateApplication() { SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); UnitSystService unitSystService = (UnitSystService) AppUtils.getBean(UnitSystService.class); unitSystService.updateUnitSyst(false); } @Override public void onApplicationEvent(ContextClosedEvent event) { log.error("Application Terminated: {}", event.getTimestamp()); terminateApplication(); } @Override public void afterPropertiesSet() throws Exception { } @Override public void destroy() throws Exception { } }