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}"
}
}
}
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)