|
@@ -25,6 +25,7 @@ import java.io.Serializable
|
|
|
import java.time.LocalDateTime
|
|
|
import java.time.format.DateTimeFormatter
|
|
|
import java.util.*
|
|
|
+import kotlin.system.exitProcess
|
|
|
import kotlin.system.measureTimeMillis
|
|
|
|
|
|
|
|
@@ -35,50 +36,22 @@ class IpPhoneBridgeApplication
|
|
|
fun main(args: Array<String>) {
|
|
|
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Jakarta"))
|
|
|
val properties = Properties()
|
|
|
- val ini = Wini(File("conf/general.ini"))
|
|
|
- properties["server.port"] = ini.get("server", "port")
|
|
|
+ val confFile = File("conf/general.ini")
|
|
|
+ if (confFile.exists()) {
|
|
|
+ val ini = Wini(File("conf/general.ini"))
|
|
|
+ properties["server.port"] = ini.get("server", "port")
|
|
|
+ } else {
|
|
|
+ properties["server.port"] = System.getenv("PORT")
|
|
|
+ }
|
|
|
+ if (properties["server.port"] == null) {
|
|
|
+ println("undefined port")
|
|
|
+ exitProcess(1)
|
|
|
+ }
|
|
|
+
|
|
|
val sApp = SpringApplication(IpPhoneBridgeApplication::class.java)
|
|
|
|
|
|
sApp.setDefaultProperties(properties)
|
|
|
sApp.run(*args)
|
|
|
-
|
|
|
- val builder = ConfigurationBuilderFactory.newConfigurationBuilder()
|
|
|
- val console = builder.newAppender("stdout", "Console")
|
|
|
-
|
|
|
- val appLog = builder.newAppender("appLog", "RollingFile")
|
|
|
- appLog.addAttribute("fileName", "log/app/app.log")
|
|
|
- appLog.addAttribute("filePattern", "log/app/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.log.zip")
|
|
|
-
|
|
|
- val flow: FilterComponentBuilder = builder.newFilter(
|
|
|
- "MarkerFilter",
|
|
|
- Filter.Result.ACCEPT,
|
|
|
- Filter.Result.DENY)
|
|
|
- flow.addAttribute("marker", "FLOW")
|
|
|
-
|
|
|
- console.add(flow)
|
|
|
-
|
|
|
- val standard = builder.newLayout("PatternLayout")
|
|
|
- standard.addAttribute("pattern", "%d %p [%c{1}] %m%n")
|
|
|
-
|
|
|
- val policies = builder.newLayout("Policies")
|
|
|
- val timeBasedTriggeringPolicy = builder.newLayout("TimeBasedTriggeringPolicy")
|
|
|
- val sizeBasedTriggeringPolicy = builder.newLayout("SizeBasedTriggeringPolicy")
|
|
|
- sizeBasedTriggeringPolicy.addAttribute("size", "10 MB")
|
|
|
- policies.addComponent(timeBasedTriggeringPolicy)
|
|
|
- policies.addComponent(sizeBasedTriggeringPolicy)
|
|
|
- appLog.addComponent(policies)
|
|
|
- console.add(standard)
|
|
|
- appLog.add(standard)
|
|
|
- builder.add(console)
|
|
|
- builder.add(appLog)
|
|
|
- val rootLogger: RootLoggerComponentBuilder = builder.newRootLogger(Level.INFO)
|
|
|
- rootLogger.add(builder.newAppenderRef("stdout"))
|
|
|
- builder.add(rootLogger)
|
|
|
- val logger: LoggerComponentBuilder = builder.newLogger("co.id.datacomsolusindo.ipphonebridge", Level.DEBUG)
|
|
|
- logger.add(builder.newAppenderRef("appLog"))
|
|
|
- logger.addAttribute("additivity", false)
|
|
|
- builder.add(logger)
|
|
|
- Configurator.reconfigure(builder.build())
|
|
|
LogManager.getLogger("co.id.datacomsolusindo.ipphonebridge.IpPhoneBridgeApplication").info("Bridge Start")
|
|
|
}
|
|
|
|
|
@@ -98,9 +71,9 @@ object ClientHolder {
|
|
|
private suspend fun massiveRun(action: suspend () -> Unit) {
|
|
|
measureTimeMillis {
|
|
|
coroutineScope { // sc
|
|
|
- launch {
|
|
|
- action()
|
|
|
- }
|
|
|
+ launch {
|
|
|
+ action()
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -148,13 +121,71 @@ object ClientHolder {
|
|
|
|
|
|
@Component
|
|
|
class WebSocketEventListener {
|
|
|
+ fun logBuilder(clNum: String) {
|
|
|
+ val builder = ConfigurationBuilderFactory.newConfigurationBuilder()
|
|
|
+ val console = builder.newAppender("stdout", "Console")
|
|
|
+
|
|
|
+ val appLog = builder.newAppender("appLog", "RollingFile")
|
|
|
+ appLog.addAttribute("fileName", "log/app/app.log")
|
|
|
+ appLog.addAttribute("filePattern", "log/app/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.log.zip")
|
|
|
+
|
|
|
+ val flow: FilterComponentBuilder = builder.newFilter(
|
|
|
+ "MarkerFilter",
|
|
|
+ Filter.Result.ACCEPT,
|
|
|
+ Filter.Result.DENY)
|
|
|
+ flow.addAttribute("marker", "FLOW")
|
|
|
+ console.add(flow)
|
|
|
+ val standard = builder.newLayout("PatternLayout")
|
|
|
+ standard.addAttribute("pattern", "%d %p [%c{1}] %m%n")
|
|
|
+ val policies = builder.newLayout("Policies")
|
|
|
+ val timeBasedTriggeringPolicy = builder.newLayout("TimeBasedTriggeringPolicy")
|
|
|
+ val sizeBasedTriggeringPolicy = builder.newLayout("SizeBasedTriggeringPolicy")
|
|
|
+
|
|
|
+ sizeBasedTriggeringPolicy.addAttribute("size", "10 MB")
|
|
|
+ policies.addComponent(timeBasedTriggeringPolicy)
|
|
|
+ policies.addComponent(sizeBasedTriggeringPolicy)
|
|
|
+ console.add(standard)
|
|
|
+ builder.add(console)
|
|
|
+
|
|
|
+ appLog.add(standard)
|
|
|
+ appLog.addComponent(policies)
|
|
|
+ builder.add(appLog)
|
|
|
+
|
|
|
+ val rootLogger: RootLoggerComponentBuilder = builder.newRootLogger(Level.INFO)
|
|
|
+ rootLogger.add(builder.newAppenderRef("stdout"))
|
|
|
+ builder.add(rootLogger)
|
|
|
+
|
|
|
+ val logger: LoggerComponentBuilder = builder.newLogger("co.id.datacomsolusindo.ipphonebridge", Level.DEBUG)
|
|
|
+ logger.add(builder.newAppenderRef("appLog"))
|
|
|
+ logger.addAttribute("additivity", false)
|
|
|
+ builder.add(logger)
|
|
|
+ rootLogger.add(builder.newAppenderRef("appLog"))
|
|
|
+
|
|
|
+ ClientHolder.get().entries.forEach {
|
|
|
+ val clientLog = builder.newAppender("client-${it.key}", "RollingFile")
|
|
|
+ clientLog.addAttribute("fileName", "log/${it.key}/client-${it.key}.log")
|
|
|
+ clientLog.addAttribute("filePattern", "log/${it.key}/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.client-${it.key}.zip")
|
|
|
+ clientLog.add(standard)
|
|
|
+ clientLog.addComponent(policies)
|
|
|
+ builder.add(clientLog)
|
|
|
+
|
|
|
+ val loggerClient: LoggerComponentBuilder = builder.newLogger("client.${it.key}", Level.DEBUG)
|
|
|
+ loggerClient.add(builder.newAppenderRef("client-${it.key}"))
|
|
|
+ loggerClient.addAttribute("additivity", false)
|
|
|
+ builder.add(loggerClient)
|
|
|
+ rootLogger.add(builder.newAppenderRef("client-${it.key}"))
|
|
|
+ }
|
|
|
+
|
|
|
+ Configurator.reconfigure(builder.build())
|
|
|
+ }
|
|
|
+
|
|
|
@EventListener(SessionSubscribeEvent::class)
|
|
|
fun handleSessionSubscribeEvent(event: SessionSubscribeEvent) {
|
|
|
val message = event.message as GenericMessage<*>
|
|
|
val simDestination = message.headers["simpDestination"] as String?
|
|
|
- if (!simDestination!!.startsWith("/topic/healthCheck")) {
|
|
|
+ if (!(simDestination!!.startsWith("/topic/healthCheck") || simDestination.startsWith("/topic/notification"))) {
|
|
|
// do stuff
|
|
|
- val clNum = simDestination.split("/")[2]
|
|
|
+ val clNum = simDestination.split("/")[3]
|
|
|
ClientHolder.put(clNum, Client(
|
|
|
clNum,
|
|
|
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")),
|
|
@@ -162,62 +193,7 @@ class WebSocketEventListener {
|
|
|
))
|
|
|
|
|
|
LogManager.getLogger(this.javaClass).info("clientConnected $simDestination")
|
|
|
-
|
|
|
- val builder = ConfigurationBuilderFactory.newConfigurationBuilder()
|
|
|
- val console = builder.newAppender("stdout", "Console")
|
|
|
-
|
|
|
- val appLog = builder.newAppender("appLog", "RollingFile")
|
|
|
- appLog.addAttribute("fileName", "log/app/app.log")
|
|
|
- appLog.addAttribute("filePattern", "log/app/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.log.zip")
|
|
|
-
|
|
|
- val flow: FilterComponentBuilder = builder.newFilter(
|
|
|
- "MarkerFilter",
|
|
|
- Filter.Result.ACCEPT,
|
|
|
- Filter.Result.DENY)
|
|
|
- flow.addAttribute("marker", "FLOW")
|
|
|
- console.add(flow)
|
|
|
- val standard = builder.newLayout("PatternLayout")
|
|
|
- standard.addAttribute("pattern", "%d %p [%c{1}] %m%n")
|
|
|
- val policies = builder.newLayout("Policies")
|
|
|
- val timeBasedTriggeringPolicy = builder.newLayout("TimeBasedTriggeringPolicy")
|
|
|
- val sizeBasedTriggeringPolicy = builder.newLayout("SizeBasedTriggeringPolicy")
|
|
|
-
|
|
|
- sizeBasedTriggeringPolicy.addAttribute("size", "10 MB")
|
|
|
- policies.addComponent(timeBasedTriggeringPolicy)
|
|
|
- policies.addComponent(sizeBasedTriggeringPolicy)
|
|
|
- console.add(standard)
|
|
|
- builder.add(console)
|
|
|
-
|
|
|
- appLog.add(standard)
|
|
|
- appLog.addComponent(policies)
|
|
|
- builder.add(appLog)
|
|
|
-
|
|
|
- val rootLogger: RootLoggerComponentBuilder = builder.newRootLogger(Level.INFO)
|
|
|
- rootLogger.add(builder.newAppenderRef("stdout"))
|
|
|
-
|
|
|
-
|
|
|
-// val logger: LoggerComponentBuilder = builder.newLogger("co.id.datacomsolusindo.ipphonebridge", Level.DEBUG)
|
|
|
-// logger.add(builder.newAppenderRef("appLog"))
|
|
|
-// logger.addAttribute("additivity", false)
|
|
|
-// builder.add(logger)
|
|
|
-
|
|
|
- ClientHolder.get().entries.forEach {
|
|
|
- val clientLog = builder.newAppender("client-${it.key}", "RollingFile")
|
|
|
- clientLog.addAttribute("fileName", "log/${it.key}/client-${it.key}.log")
|
|
|
- clientLog.addAttribute("filePattern", "log/${it.key}/\$\${date:yyyy - MM}/app-%d{yyyy-MM-dd}-%i.client-${it.key}.zip")
|
|
|
- clientLog.add(standard)
|
|
|
- clientLog.addComponent(policies)
|
|
|
- builder.add(clientLog)
|
|
|
-
|
|
|
- val loggerClient: LoggerComponentBuilder = builder.newLogger("client.${it.key}", Level.DEBUG)
|
|
|
- loggerClient.add(builder.newAppenderRef("client-${it.key}"))
|
|
|
- loggerClient.addAttribute("additivity", false)
|
|
|
- builder.add(loggerClient)
|
|
|
- rootLogger.add(builder.newAppenderRef("client-${it.key}"))
|
|
|
- }
|
|
|
- builder.add(rootLogger)
|
|
|
-
|
|
|
- Configurator.reconfigure(builder.build())
|
|
|
+ logBuilder(clNum)
|
|
|
LogManager.getLogger("client.$clNum").info("Client $clNum Connected")
|
|
|
}
|
|
|
}
|