DEV Community

Query Filter
Query Filter

Posted on

bridge

 def qffbridge_instances = [
    aus_qffbridge : [ asset:'cash', region:'APAC', country:'AUS', env:'dev', instance:'aus_qffbridge', appName:'dummy', temp:'aus_qffbridge', debugPort:8890 ],
    hnk_qffbridge : [ asset:'cash', region:'APAC', country:'HNK', env:'dev', instance:'hnk_qffbridge', appName:'dummy', temp:'hnk_qffbridge', debugPort:8890 ],
    idn_qffbridge : [ asset:'cash', region:'APAC', country:'IDN', env:'dev', instance:'idn_qffbridge', appName:'dummy', temp:'idn_qffbridge', debugPort:8890 ],
    ind_qffbridge : [ asset:'cash', region:'APAC', country:'IND', env:'dev', instance:'ind_qffbridge', appName:'dummy', temp:'ind_qffbridge', debugPort:8890 ],
    jpn_qffbridge : [ asset:'cash', region:'APAC', country:'JPN', env:'dev', instance:'jpn_qffbridge', appName:'dummy', temp:'jpn_qffbridge', debugPort:8890 ],
    mys_qffbridge : [ asset:'cash', region:'APAC', country:'MYS', env:'dev', instance:'mys_qffbridge', appName:'dummy', temp:'mys_qffbridge', debugPort:8890 ],
    sgp_qffbridge : [ asset:'cash', region:'APAC', country:'SGP', env:'dev', instance:'sgp_qffbridge', appName:'dummy', temp:'sgp_qffbridge', debugPort:8890 ],
    skr_qffbridge : [ asset:'cash', region:'APAC', country:'SKR', env:'dev', instance:'skr_qffbridge', appName:'dummy', temp:'skr_qffbridge', debugPort:8890 ],
    tha_qffbridge : [ asset:'cash', region:'APAC', country:'THA', env:'dev', instance:'tha_qffbridge', appName:'dummy', temp:'tha_qffbridge', debugPort:8890 ],
    twn_qffbridge : [ asset:'cash', region:'APAC', country:'TWN', env:'dev', instance:'twn_qffbridge', appName:'dummy', temp:'twn_qffbridge', debugPort:8890 ],
    QFF_Bridge1_dev : [ // Starts in local dev env
        asset:'cash', region:'US', env:'dev', instance:'QFF_Bridge1', appName:'dummy', temp:'QFF_Bridge1_dev', debugPort:8890 
    ],
    QFF_Bridge1     : [ // Starts in local qa env
        asset:'cash', region:'US', env:'qa', instance:'QFF_Bridge1', appName:'dummy', temp:'QFF_Bridge1', debugPort:8890 
    ]
]

// Configuration from your existing setup
def agentSrcDir = file("${buildDir}/generated-src/agent")
def attacherSrcDir = file("${buildDir}/generated-src/attacher")

def profilerConfig = [
    targetClassesFile: file("${projectDir}/profiler_targets.txt"),
    intervalSeconds: 60,
    agentJar: file("${buildDir}/libs/ProfilerAgent.jar"),
    outputDir: file("${buildDir}/profiler-results")
]

// Formatting helper for consistent arguments
def getAgentArgs = {
    def targetPath = profilerConfig.targetClassesFile.absolutePath.replace('\\', '\\\\')
    def outputPath = profilerConfig.outputDir.absolutePath.replace('\\', '\\\\')
    return "${targetPath}; ${profilerConfig.intervalSeconds}; ${outputPath}"
}

// THE FIXED LOOP STRUCTURE
qffbridge_instances.each { task_name, instance_options ->
    println ""
    println " [ ${task_name}: ${instance_options.collect { k, v -> "${k}=${v}" }.join(', ')} ]"

    // Strict duplication scopes to prevent forward leakage across loop evaluation blocks
    final String asset = String.valueOf(instance_options.asset)
    final String region = String.valueOf(instance_options.region)
    final String country = String.valueOf(instance_options.country ?: '')
    final String env = String.valueOf(instance_options.env)
    final String instanceName = String.valueOf(instance_options.instance)
    final String appName = String.valueOf(instance_options.appName)
    final String tempDirName = String.valueOf(instance_options.temp)
    final def debugPort = instance_options.debugPort

    def tempDir = '/tmp'
    if (System.getProperty("os.name").toLowerCase().contains("windows")) {
        tempDir = 'C:/temp'
    } else if (org.gradle.internal.os.OperatingSystem.current().isLinux()) {
        tempDir = '/opt/loghome'
    }

    tempDir = "${tempDir}/${tempDirName}"

    // Evaluate File configurations safely outside the task configuration block
    def instanceClasspath = [
        file("src/main/config/${region}/${country ? '/' + country : ''}/${env}/${instanceName}"),
        file("src/main/config/${region}/${country ? '/' + country : ''}/${env}"),
        file("src/main/config/${region}/${country ? '/' + country : ''}"),
        file("src/main/config/${region}"),
        file("src/main/config"),
        toolsJarFile
    ]

    FileCollection productApiConfigFiles = files("src/main/config/${region}${country ? '/' + country : ''}/ProductAPIConfig.xml", "src/main/config/${region}/${env}/ProductAPIConfig.xml")
    def productApiConfig = productApiConfigFiles.find { File file -> file.exists() }

    FileCollection refdataApiconfigFiles = files("src/main/config/${region}${country ? '/' + country : ''}/RefDataAPIConfig.xml", "src/main/config/${region}/${env}/RefDataAPIConfig.xml")
    def refdataApiconfig = refdataApiconfigFiles.find { File file -> file.exists() }

    // MODERN TASK REGISTRATION PIPELINE
    tasks.register(task_name, JavaExec) {
        dependsOn = [init, compileJava, buildAgent, validateProfilerConfig]

        main = 'com.citigroup.qffcometbridge.server.QffBridgeServer'
        workingDir file("src/main/config")
        classpath = files(instanceClasspath) + sourceSets.main.runtimeClasspath

        // RESTORED: Links the system console input directly to the running Java process
        standardInput = System.in

        def configPath = file("src/main/config/${region}/${country ? '/' + country : ''}/${env}").toURI().toString()
        args configPath, instanceName, appName

        jvmArgs '-Xms2G', 
        '-Xmx4G', 
        '-Xss256k', 
        "-Djavax.net.ssl.keyStore=${{ def f = file("src/main/config/${region}/${env}/comet.${env}.keystore"); f.exists() ? f.absolutePath : { println "Warning! Task: ${task_name} ${env} keystore ${f} not found, using QA!"; file("src/main/config/${region}/qa/comet.qa.keystore").absolutePath }() }()}",
        "-Djavax.net.ssl.keyStorePassword=cometprod1", 
        "-DenableRestrictiveQtyCheck=false",
        "-Djava.io.tmpdir=${tempDir}/log",
        "-Dconfig_file=" + file("src/main/config/${region}/${country ? '/' + country : ''}/${env}/qffbridge.xml"),
        "-Dcom.citigroup.get.prodapi.config.filename=${productApiConfig}",
        "-Dcom.citigroup.get.accountapi.config.filename=${refdataApiconfig}",
        "-Dcom.citigroup.get.refdata.config.filename=${refdataApiconfig}",
        "-Dapplication=QFFBridgeRouter",
        "-Dinstance=${instanceName}",
        "-Dcom.citigroup.qffbridge.cache.persistentCache=${tempDir}/store",
        "-Djava.util.logging.config.file=" + file("src/main/config/logger.properties"),
        "-Dcom.citigroup.qffbridge.idcache.storeName=${tempDir}/store",
        "-Dregion=${region}/${country ? '/' + country : ''}",
        "-Dcom.citigroup.get.prodapi.dbconn.max.number=60",
        "-Dcom.citigroup.get.refdata.dbconn.max.number=60",
        "-Dcom.citigroup.get.citijdbc.dbconn.max.number=60",
        "-DJDBCURL",
        "-Dpropertiess_file=" + file("src/main/config/${region}/${env}/rejecthandler.properties")

        Boolean isHeapDump = false
        if (isHeapDump) {
            jvmArgs '-XX:+UseG1GC', '-XX:+PrintGCDetails', '-XX:+PrintGCTimeTimestamps', '-XX:+PrintGCDateTimestamps',
            '-XX:+PrintTenuringDistribution', "-Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFFF",
            "-Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFFF", "-Xnoagent",
            "-XX:HeapDumpPath=${tempDir}/OutOfHeapMemory.${task_name}.dmp", "-XX:+HeapDumpOnOutOfMemoryError"
        } else {
            jvmArgs '-XX:+UseG1GC',
            '-XX:+PrintGCDetails', 
            '-XX:+PrintGCTimeTimestamps', 
            '-XX:+PrintGCDateTimestamps',
            '-XX:+PrintTenuringDistribution', 
            "-Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFFF",
            "-Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFFF", 
            "-Xnoagent",
            "-XX:HeapDumpPath=${tempDir}/OutOfHeapMemory.${task_name}.dmp"
        }

        Boolean isPackage = false
        if (isPackage) {
            jvmArgs "-Dpackage.version=9.1.89n_b15"
        }

        println "Working Directory: ${workingDir}"
        println "========== Final JVM Args =========="
        println jvmArgs.join('\n')
        println "========== FULL COMMAND =========="
        println "Main: ${main}"
        println "Args: ${args}"
        println ""

        doFirst {
            file("${tempDir}/store").mkdirs()
            file("${tempDir}/log").mkdirs()

            Boolean isProfilerAgent = false
            if (isProfilerAgent) {
                jvmArgs("-javaagent:${profilerConfig.agentJar.get().asFile}=${getAgentArgs()}")
            }
            if (!profilerConfig.outputDir.exists()) {
                profilerConfig.outputDir.mkdirs()
            }
            println "[PROFILER]: Results will be saved to: ${profilerConfig.outputDir.absolutePath}"
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)