Commit 82994579affdddc0321dec92b39c4dd7aa5ecd14

Authored by 함상기
1 parent 23379372

2024.04.26

... ... @@ -8,7 +8,7 @@
8 8 # "License"); you may not use this file except in compliance
9 9 # with the License. You may obtain a copy of the License at
10 10 #
11   -# https://www.apache.org/licenses/LICENSE-2.0
  11 +# http://www.apache.org/licenses/LICENSE-2.0
12 12 #
13 13 # Unless required by applicable law or agreed to in writing,
14 14 # software distributed under the License is distributed on an
... ... @@ -19,7 +19,7 @@
19 19 # ----------------------------------------------------------------------------
20 20  
21 21 # ----------------------------------------------------------------------------
22   -# Apache Maven Wrapper startup batch script, version 3.2.0
  22 +# Maven Start Up Batch script
23 23 #
24 24 # Required ENV vars:
25 25 # ------------------
... ... @@ -27,6 +27,7 @@
27 27 #
28 28 # Optional ENV vars
29 29 # -----------------
  30 +# M2_HOME - location of maven2's installed home dir
30 31 # MAVEN_OPTS - parameters passed to the Java VM when running Maven
31 32 # e.g. to debug Maven itself, use
32 33 # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
... ... @@ -35,10 +36,6 @@
35 36  
36 37 if [ -z "$MAVEN_SKIP_RC" ] ; then
37 38  
38   - if [ -f /usr/local/etc/mavenrc ] ; then
39   - . /usr/local/etc/mavenrc
40   - fi
41   -
42 39 if [ -f /etc/mavenrc ] ; then
43 40 . /etc/mavenrc
44 41 fi
... ... @@ -53,7 +50,7 @@ fi
53 50 cygwin=false;
54 51 darwin=false;
55 52 mingw=false
56   -case "$(uname)" in
  53 +case "`uname`" in
57 54 CYGWIN*) cygwin=true ;;
58 55 MINGW*) mingw=true;;
59 56 Darwin*) darwin=true
... ... @@ -61,9 +58,9 @@ case "$(uname)" in
61 58 # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
62 59 if [ -z "$JAVA_HOME" ]; then
63 60 if [ -x "/usr/libexec/java_home" ]; then
64   - JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
  61 + export JAVA_HOME="`/usr/libexec/java_home`"
65 62 else
66   - JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
  63 + export JAVA_HOME="/Library/Java/Home"
67 64 fi
68 65 fi
69 66 ;;
... ... @@ -71,38 +68,68 @@ esac
71 68  
72 69 if [ -z "$JAVA_HOME" ] ; then
73 70 if [ -r /etc/gentoo-release ] ; then
74   - JAVA_HOME=$(java-config --jre-home)
  71 + JAVA_HOME=`java-config --jre-home`
75 72 fi
76 73 fi
77 74  
  75 +if [ -z "$M2_HOME" ] ; then
  76 + ## resolve links - $0 may be a link to maven's home
  77 + PRG="$0"
  78 +
  79 + # need this for relative symlinks
  80 + while [ -h "$PRG" ] ; do
  81 + ls=`ls -ld "$PRG"`
  82 + link=`expr "$ls" : '.*-> \(.*\)$'`
  83 + if expr "$link" : '/.*' > /dev/null; then
  84 + PRG="$link"
  85 + else
  86 + PRG="`dirname "$PRG"`/$link"
  87 + fi
  88 + done
  89 +
  90 + saveddir=`pwd`
  91 +
  92 + M2_HOME=`dirname "$PRG"`/..
  93 +
  94 + # make it fully qualified
  95 + M2_HOME=`cd "$M2_HOME" && pwd`
  96 +
  97 + cd "$saveddir"
  98 + # echo Using m2 at $M2_HOME
  99 +fi
  100 +
78 101 # For Cygwin, ensure paths are in UNIX format before anything is touched
79 102 if $cygwin ; then
  103 + [ -n "$M2_HOME" ] &&
  104 + M2_HOME=`cygpath --unix "$M2_HOME"`
80 105 [ -n "$JAVA_HOME" ] &&
81   - JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
  106 + JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
82 107 [ -n "$CLASSPATH" ] &&
83   - CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
  108 + CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
84 109 fi
85 110  
86 111 # For Mingw, ensure paths are in UNIX format before anything is touched
87 112 if $mingw ; then
88   - [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
89   - JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
  113 + [ -n "$M2_HOME" ] &&
  114 + M2_HOME="`(cd "$M2_HOME"; pwd)`"
  115 + [ -n "$JAVA_HOME" ] &&
  116 + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
90 117 fi
91 118  
92 119 if [ -z "$JAVA_HOME" ]; then
93   - javaExecutable="$(which javac)"
94   - if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
  120 + javaExecutable="`which javac`"
  121 + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
95 122 # readlink(1) is not available as standard on Solaris 10.
96   - readLink=$(which readlink)
97   - if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
  123 + readLink=`which readlink`
  124 + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
98 125 if $darwin ; then
99   - javaHome="$(dirname "\"$javaExecutable\"")"
100   - javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
  126 + javaHome="`dirname \"$javaExecutable\"`"
  127 + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
101 128 else
102   - javaExecutable="$(readlink -f "\"$javaExecutable\"")"
  129 + javaExecutable="`readlink -f \"$javaExecutable\"`"
103 130 fi
104   - javaHome="$(dirname "\"$javaExecutable\"")"
105   - javaHome=$(expr "$javaHome" : '\(.*\)/bin')
  131 + javaHome="`dirname \"$javaExecutable\"`"
  132 + javaHome=`expr "$javaHome" : '\(.*\)/bin'`
106 133 JAVA_HOME="$javaHome"
107 134 export JAVA_HOME
108 135 fi
... ... @@ -118,7 +145,7 @@ if [ -z "$JAVACMD" ] ; then
118 145 JAVACMD="$JAVA_HOME/bin/java"
119 146 fi
120 147 else
121   - JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
  148 + JAVACMD="`which java`"
122 149 fi
123 150 fi
124 151  
... ... @@ -132,9 +159,12 @@ if [ -z "$JAVA_HOME" ] ; then
132 159 echo "Warning: JAVA_HOME environment variable is not set."
133 160 fi
134 161  
  162 +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
  163 +
135 164 # traverses directory structure from process work directory to filesystem root
136 165 # first directory with .mvn subdirectory is considered project base directory
137 166 find_maven_basedir() {
  167 +
138 168 if [ -z "$1" ]
139 169 then
140 170 echo "Path not specified to find_maven_basedir"
... ... @@ -150,99 +180,96 @@ find_maven_basedir() {
150 180 fi
151 181 # workaround for JBEAP-8937 (on Solaris 10/Sparc)
152 182 if [ -d "${wdir}" ]; then
153   - wdir=$(cd "$wdir/.." || exit 1; pwd)
  183 + wdir=`cd "$wdir/.."; pwd`
154 184 fi
155 185 # end of workaround
156 186 done
157   - printf '%s' "$(cd "$basedir" || exit 1; pwd)"
  187 + echo "${basedir}"
158 188 }
159 189  
160 190 # concatenates all lines of a file
161 191 concat_lines() {
162 192 if [ -f "$1" ]; then
163   - # Remove \r in case we run on Windows within Git Bash
164   - # and check out the repository with auto CRLF management
165   - # enabled. Otherwise, we may read lines that are delimited with
166   - # \r\n and produce $'-Xarg\r' rather than -Xarg due to word
167   - # splitting rules.
168   - tr -s '\r\n' ' ' < "$1"
169   - fi
170   -}
171   -
172   -log() {
173   - if [ "$MVNW_VERBOSE" = true ]; then
174   - printf '%s\n' "$1"
  193 + echo "$(tr -s '\n' ' ' < "$1")"
175 194 fi
176 195 }
177 196  
178   -BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
  197 +BASE_DIR=`find_maven_basedir "$(pwd)"`
179 198 if [ -z "$BASE_DIR" ]; then
180 199 exit 1;
181 200 fi
182 201  
183   -MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
184   -log "$MAVEN_PROJECTBASEDIR"
185   -
186 202 ##########################################################################################
187 203 # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
188 204 # This allows using the maven wrapper in projects that prohibit checking in binary data.
189 205 ##########################################################################################
190   -wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
191   -if [ -r "$wrapperJarPath" ]; then
192   - log "Found $wrapperJarPath"
  206 +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
  207 + if [ "$MVNW_VERBOSE" = true ]; then
  208 + echo "Found .mvn/wrapper/maven-wrapper.jar"
  209 + fi
193 210 else
194   - log "Couldn't find $wrapperJarPath, downloading it ..."
195   -
  211 + if [ "$MVNW_VERBOSE" = true ]; then
  212 + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
  213 + fi
196 214 if [ -n "$MVNW_REPOURL" ]; then
197   - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
  215 + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
198 216 else
199   - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
  217 + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
200 218 fi
201   - while IFS="=" read -r key value; do
202   - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
203   - safeValue=$(echo "$value" | tr -d '\r')
204   - case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
  219 + while IFS="=" read key value; do
  220 + case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
205 221 esac
206   - done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
207   - log "Downloading from: $wrapperUrl"
208   -
  222 + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
  223 + if [ "$MVNW_VERBOSE" = true ]; then
  224 + echo "Downloading from: $jarUrl"
  225 + fi
  226 + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
209 227 if $cygwin; then
210   - wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
  228 + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
211 229 fi
212 230  
213 231 if command -v wget > /dev/null; then
214   - log "Found wget ... using wget"
215   - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
  232 + if [ "$MVNW_VERBOSE" = true ]; then
  233 + echo "Found wget ... using wget"
  234 + fi
216 235 if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
217   - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
  236 + wget "$jarUrl" -O "$wrapperJarPath"
218 237 else
219   - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
  238 + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
220 239 fi
221 240 elif command -v curl > /dev/null; then
222   - log "Found curl ... using curl"
223   - [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
  241 + if [ "$MVNW_VERBOSE" = true ]; then
  242 + echo "Found curl ... using curl"
  243 + fi
224 244 if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
225   - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
  245 + curl -o "$wrapperJarPath" "$jarUrl" -f
226 246 else
227   - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
  247 + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
228 248 fi
  249 +
229 250 else
230   - log "Falling back to using Java to download"
231   - javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
232   - javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
  251 + if [ "$MVNW_VERBOSE" = true ]; then
  252 + echo "Falling back to using Java to download"
  253 + fi
  254 + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
233 255 # For Cygwin, switch paths to Windows format before running javac
234 256 if $cygwin; then
235   - javaSource=$(cygpath --path --windows "$javaSource")
236   - javaClass=$(cygpath --path --windows "$javaClass")
  257 + javaClass=`cygpath --path --windows "$javaClass"`
237 258 fi
238   - if [ -e "$javaSource" ]; then
239   - if [ ! -e "$javaClass" ]; then
240   - log " - Compiling MavenWrapperDownloader.java ..."
241   - ("$JAVA_HOME/bin/javac" "$javaSource")
  259 + if [ -e "$javaClass" ]; then
  260 + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  261 + if [ "$MVNW_VERBOSE" = true ]; then
  262 + echo " - Compiling MavenWrapperDownloader.java ..."
  263 + fi
  264 + # Compiling the Java class
  265 + ("$JAVA_HOME/bin/javac" "$javaClass")
242 266 fi
243   - if [ -e "$javaClass" ]; then
244   - log " - Running MavenWrapperDownloader.java ..."
245   - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
  267 + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
  268 + # Running the downloader
  269 + if [ "$MVNW_VERBOSE" = true ]; then
  270 + echo " - Running MavenWrapperDownloader.java ..."
  271 + fi
  272 + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
246 273 fi
247 274 fi
248 275 fi
... ... @@ -251,58 +278,33 @@ fi
251 278 # End of extension
252 279 ##########################################################################################
253 280  
254   -# If specified, validate the SHA-256 sum of the Maven wrapper jar file
255   -wrapperSha256Sum=""
256   -while IFS="=" read -r key value; do
257   - case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
258   - esac
259   -done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
260   -if [ -n "$wrapperSha256Sum" ]; then
261   - wrapperSha256Result=false
262   - if command -v sha256sum > /dev/null; then
263   - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
264   - wrapperSha256Result=true
265   - fi
266   - elif command -v shasum > /dev/null; then
267   - if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
268   - wrapperSha256Result=true
269   - fi
270   - else
271   - echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
272   - echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
273   - exit 1
274   - fi
275   - if [ $wrapperSha256Result = false ]; then
276   - echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
277   - echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
278   - echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
279   - exit 1
280   - fi
  281 +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
  282 +if [ "$MVNW_VERBOSE" = true ]; then
  283 + echo $MAVEN_PROJECTBASEDIR
281 284 fi
282   -
283 285 MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
284 286  
285 287 # For Cygwin, switch paths to Windows format before running java
286 288 if $cygwin; then
  289 + [ -n "$M2_HOME" ] &&
  290 + M2_HOME=`cygpath --path --windows "$M2_HOME"`
287 291 [ -n "$JAVA_HOME" ] &&
288   - JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
  292 + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
289 293 [ -n "$CLASSPATH" ] &&
290   - CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
  294 + CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
291 295 [ -n "$MAVEN_PROJECTBASEDIR" ] &&
292   - MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
  296 + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
293 297 fi
294 298  
295 299 # Provide a "standardized" way to retrieve the CLI args that will
296 300 # work with both Windows and non-Windows executions.
297   -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
  301 +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
298 302 export MAVEN_CMD_LINE_ARGS
299 303  
300 304 WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
301 305  
302   -# shellcheck disable=SC2086 # safe args
303 306 exec "$JAVACMD" \
304 307 $MAVEN_OPTS \
305   - $MAVEN_DEBUG_OPTS \
306 308 -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
307   - "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  309 + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
308 310 ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
... ...
src/main/java/com/batch/config/MatchingExtraProcessorAuto.java
... ... @@ -42,12 +42,14 @@ public class MatchingExtraProcessorAuto {
42 42 String sAccnutYm = (String) paramRec.get("accnut_ym");
43 43 String sCprCode = (String) paramRec.get("cpr_code");
44 44 String sPartCpr = (String) paramRec.get("partn_cpr");
  45 + String sDelngCrncy = (String) paramRec.get("delng_crncy");
45 46 String sConds = (String) paramRec.get("conds");
46 47  
47 48 //작업시작
48 49 Map<String, Object> mParam = new HashMap<String, Object>();
49 50 mParam.put("sysSe", sSysSe);
50 51 mParam.put("accnutYm", sAccnutYm);
  52 + mParam.put("delngCurncy", sDelngCrncy);
51 53 mParam.put("conds", sConds);
52 54  
53 55 //----------------------------------------------------------------------------
... ...
src/main/java/com/batch/controller/JobController.java
... ... @@ -8,6 +8,7 @@ import java.util.Map;
8 8 import java.util.UUID;
9 9  
10 10 import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.beans.factory.annotation.Value;
11 12 import org.springframework.web.bind.annotation.GetMapping;
12 13 import org.springframework.web.bind.annotation.PathVariable;
13 14 import org.springframework.web.bind.annotation.PostMapping;
... ... @@ -20,6 +21,7 @@ import com.batch.config.MatchingSetup.Matching;
20 21 import com.batch.mapper.primary.MatchingInnerDelingMapper;
21 22 import com.batch.service.JobService;
22 23 import com.batch.util.FileUtil;
  24 +import com.batch.util.JsonUtil;
23 25 import com.google.gson.JsonObject;
24 26  
25 27 import lombok.extern.slf4j.Slf4j;
... ... @@ -33,6 +35,12 @@ public class JobController {
33 35 private JobService jobService;
34 36 @Autowired
35 37 private MatchingInnerDelingMapper matchingInnerDelingMapper;
  38 + @Value("${thread.ai.count.rowmax}")
  39 + BigDecimal bdAiAsyncMaxRowCount;
  40 + @Value("${thread.ai.processing.wait}")
  41 + BigDecimal bdAiAsyncWaitTime;
  42 + @Value("${thread.ai.processing.wait.total}")
  43 + BigDecimal bdAiAsyncTotalWaitTime;
36 44  
37 45  
38 46  
... ... @@ -67,9 +75,9 @@ public class JobController {
67 75 UUID uuid = UUID.randomUUID();
68 76 String sJobGroup = uuid.toString();
69 77  
70   - log.debug("Start Create Job");
  78 + log.info("Start Create Job");
71 79 jobService.createData(sJobGroup, params);
72   - log.debug("End Create Job");
  80 + log.info("End Create Job");
73 81  
74 82 Map<String, String> rtnMap = new HashMap<String, String>();
75 83 rtnMap.put("jobGroupId", sJobGroup);
... ... @@ -94,9 +102,9 @@ public class JobController {
94 102 UUID uuid = UUID.randomUUID();
95 103 String sJobGroup = uuid.toString();
96 104  
97   - log.debug("Start Matching Job");
  105 + log.info("Start Matching Job");
98 106 jobService.matchingJob(sJobGroup, params);
99   - log.debug("End Matching Job");
  107 + log.info("End Matching Job");
100 108  
101 109 Map<String, String> rtnMap = new HashMap<String, String>();
102 110 rtnMap.put("jobGroupId", sJobGroup);
... ... @@ -122,7 +130,8 @@ public class JobController {
122 130 UUID uuid = UUID.randomUUID();
123 131 String sJobGroup = uuid.toString();
124 132  
125   - log.debug("Start Extra Matching Job");
  133 + log.info("Start Extra Matching Job");
  134 + params.put("asCurrency", "Y");
126 135 List<Map> retData = matchingInnerDelingMapper.getCustomItemReadData(params);
127 136  
128 137 // 수익/비용
... ... @@ -140,7 +149,7 @@ public class JobController {
140 149 jobService.extraJobSub(sJobGroup, cParams);
141 150 }
142 151  
143   - log.debug("End Extra Matching Job");
  152 + log.info("End Extra Matching Job");
144 153  
145 154 Map<String, String> rtnMap = new HashMap<String, String>();
146 155 rtnMap.put("jobGroupId", sJobGroup);
... ... @@ -166,7 +175,7 @@ public class JobController {
166 175 UUID uuid = UUID.randomUUID();
167 176 String sJobGroup = uuid.toString();
168 177  
169   - log.debug("Start AI Sub Matching Job");
  178 + log.info("Start AI Sub Matching Job");
170 179 List<Map> retData = matchingInnerDelingMapper.getAiSubReadData(params);
171 180  
172 181 //AI의 경우 수익비용만 매칭하고 있음
... ... @@ -178,7 +187,7 @@ public class JobController {
178 187 jobService.aiSubJobSub(sJobGroup, cParams);
179 188 }
180 189  
181   - log.debug("End Extra Matching Job");
  190 + log.info("End Extra Matching Job");
182 191  
183 192 Map<String, String> rtnMap = new HashMap<String, String>();
184 193 rtnMap.put("jobGroupId", sJobGroup);
... ... @@ -200,19 +209,49 @@ public class JobController {
200 209 * "error_range": "0"
201 210 * }
202 211 */
203   - //Job Create Log
  212 + //Job Create LogmatchingInnerDelingMapper
204 213 UUID uuid = UUID.randomUUID();
205 214 String sJobGroup = uuid.toString();
206 215  
207   - log.debug("Start AI Matching Job");
  216 + log.info("Start AI Matching Job");
208 217 List<Map> retData = matchingInnerDelingMapper.getAiReadData(params);
  218 + BigDecimal bdCurrentRowCount = BigDecimal.ZERO;
209 219 for(Map curMap : retData) {
210 220 Map<String, Object> curMParams = new HashMap<String, Object>();
211 221 curMParams.putAll(curMap);
212 222 curMParams.put("error_range", params.get("error_range"));
  223 +
  224 + BigDecimal bdCntAll = new BigDecimal(String.valueOf(curMap.get("cnt_all")));
  225 + bdCurrentRowCount = bdCurrentRowCount.add(bdCntAll);
  226 + log.info("Call Matching Job (" + JsonUtil.objectToString(curMap) + ")");
213 227 jobService.aiJobSub(sJobGroup, curMParams);
  228 +
  229 + //전체카운트가 처리가능카운트를 넘어설때
  230 + if (bdCurrentRowCount.compareTo(bdAiAsyncMaxRowCount) > -1) {
  231 + bdCurrentRowCount = BigDecimal.ZERO;
  232 +
  233 + //현재 작업그룹이 종료가 되었는지 체크해서 종료시 카운트 초기화 하고 다음작업을 한다.
  234 + boolean blnStatus = true;
  235 + Integer iTotalWait = 0;
  236 + Integer iWaitTime = bdAiAsyncWaitTime.intValue() * 1000; //밀리초
  237 + do {
  238 + Map<String, Object> mParam = new HashMap<String, Object>();
  239 + mParam.put("userJobGroup", sJobGroup);
  240 + List<Map> lmJob = matchingInnerDelingMapper.getUserJobStatus(mParam);
  241 + for (Map curJob : lmJob) {
  242 + String ScurStatus = (String) curJob.get("status");
  243 + if (!"Finished".equalsIgnoreCase(ScurStatus)) {
  244 + blnStatus = false;
  245 + Thread.sleep(iWaitTime);
  246 + iTotalWait = iTotalWait + iWaitTime;
  247 + break;
  248 + }
  249 + }
  250 + } while (!blnStatus && iTotalWait < bdAiAsyncTotalWaitTime.intValue()); //전체 기다리는 시간까지 체크
  251 + log.info("Next Thread Group Processing");
  252 + }
214 253 }
215   - log.debug("End AI Matching Job");
  254 + log.info("End AI Matching Job");
216 255  
217 256 Map<String, String> rtnMap = new HashMap<String, String>();
218 257 rtnMap.put("jobGroupId", sJobGroup);
... ... @@ -233,9 +272,9 @@ public class JobController {
233 272 UUID uuid = UUID.randomUUID();
234 273 String sJobGroup = uuid.toString();
235 274  
236   - log.debug("Start Return Job");
  275 + log.info("Start Return Job");
237 276 jobService.returnRwsultData(sJobGroup, params);
238   - log.debug("End Return Job");
  277 + log.info("End Return Job");
239 278  
240 279 Map<String, String> rtnMap = new HashMap<String, String>();
241 280 rtnMap.put("jobGroupId", sJobGroup);
... ... @@ -311,6 +350,34 @@ public class JobController {
311 350  
312 351 return rtnVal;
313 352 }
  353 +
  354 +
  355 + @PostMapping("/callAsyncJob")
  356 + public Map<String, String> callAsyncJob( @RequestBody Map<String, String> params) throws Exception {
  357 +
  358 + /*
  359 + * {
  360 + * "PrgName": "cmd",
  361 + * "PrgParams": "/C dir /w",
  362 + * }
  363 + */
  364 + //Job Create Log
  365 + UUID uuid = UUID.randomUUID();
  366 + String sJobGroup = uuid.toString();
  367 +
  368 + log.info("Start AI Sub Matching Job");
  369 +
  370 + //OS Command Line 수행
  371 + jobService.callAsyncJobSub(sJobGroup, params);
  372 +
  373 + log.info("End Extra Matching Job");
  374 +
  375 + Map<String, String> rtnMap = new HashMap<String, String>();
  376 + rtnMap.put("jobGroupId", sJobGroup);
  377 + rtnMap.put("jobMessage", "OS Command 작업을 시작합니다. 작업이 끝난후 작업결과는 별도로 확인 바랍니다.");
  378 +
  379 + return rtnMap;
  380 + }
314 381  
315 382  
316 383 }
... ...
src/main/java/com/batch/service/JobService.java
... ... @@ -36,7 +36,7 @@ import com.batch.config.MatchingSetup.Matching;
36 36 import com.batch.mapper.primary.MatchingInnerDelingMapper;
37 37 import com.batch.mapper.secondary.OracleMapper;
38 38 import com.batch.util.FileUtil;
39   -
  39 +import com.batch.util.StringUtil;
40 40 import com.batch.service.JobService;
41 41 import lombok.extern.slf4j.Slf4j;
42 42  
... ... @@ -49,6 +49,9 @@ public class JobService {
49 49  
50 50 @Value("${python.ai.target}")
51 51 String sPythonAiTarget;
  52 +
  53 + @Value("${matching.auto.exceptListByComma}")
  54 + String sExceptMatchType;
52 55  
53 56 @Autowired
54 57 private JobLauncher jobLauncher;
... ... @@ -102,8 +105,18 @@ public class JobService {
102 105 }
103 106 }
104 107  
105   -
106 108 for (String sJobType : lJobType) {
  109 + if (!matchingSetup.getMatching(sJobType).getActive()) {
  110 + log.info("[" + sThreadName + "]JobType(" + sJobType + " is Disabled");
  111 + continue;
  112 + };
  113 +
  114 + List<String> lExceptMatchType = StringUtil.StringToArrayList(sExceptMatchType);
  115 + if (lExceptMatchType.indexOf(sJobType) > -1) {
  116 + log.info("[" + sThreadName + "]JobType(" + sJobType + " is Excepted");
  117 + continue;
  118 + };
  119 +
107 120 log.info("[" + sThreadName + "]Current running job type: " + sJobType);
108 121 JobExecution jobExe = invokeJob("matchingInnerDelng", sJobType, params);
109 122 if (!jobExe.getStatus().equals(BatchStatus.COMPLETED)) {
... ... @@ -143,7 +156,7 @@ public class JobService {
143 156 String sThreadName = Thread.currentThread().getName();
144 157 long startTime = System.currentTimeMillis();
145 158 log.info("extra [" + sThreadName + "]Job Started : " + startTime);
146   - log.debug("extra [" + sThreadName + "]params=" + paramRec.toString());
  159 + log.info("extra [" + sThreadName + "]params=" + paramRec.toString());
147 160  
148 161 MatchingExtraProcessorAuto matchingExtraProcessorAuto = new MatchingExtraProcessorAuto(matchingInnerDelingMapper);
149 162  
... ... @@ -468,5 +481,60 @@ public class JobService {
468 481 paramLog.put("exit_message", "");
469 482 matchingInnerDelingMapper.finishUserJob(paramLog);
470 483  
471   - }
  484 + }
  485 +
  486 +
  487 + @SuppressWarnings("rawtypes")
  488 + @Async("commAsync")
  489 + public void callAsyncJobSub(String jobGroupId, Map paramRec) throws Exception {
  490 +
  491 +
  492 + //Job Create Log
  493 + UUID uuid = UUID.randomUUID();
  494 + HashMap<String, String> mt = new HashMap<String, String>();
  495 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss");
  496 + String sDate = dateFormat.format(new Date()) + ":" + uuid.toString();
  497 +
  498 + Map<String, Object> paramLog = new HashMap<String, Object>();
  499 + paramLog.put("user_job_group", jobGroupId);
  500 + paramLog.put("user_job_id", sDate);
  501 + paramLog.put("user_job_name", "OS Command Run(" + paramRec.toString() + ")");
  502 + matchingInnerDelingMapper.createUserJob(paramLog);
  503 +
  504 +
  505 + long startTime = System.currentTimeMillis();
  506 + log.info("OS Command Run Started : " + startTime);
  507 + log.info("OS Command Run params=" + paramRec.toString());
  508 +
  509 + String sPrgName = (String) paramRec.get("PrgName");
  510 + String sPrgParam = (String) paramRec.get("PrgParams");
  511 + List<String> lParams = StringUtil.StringToArrayList(sPrgParam, " ");
  512 +
  513 + ArrayList<String> lcmd = new ArrayList<String>();
  514 + lcmd.add(sPrgName);
  515 + lcmd.addAll(lParams);
  516 + lcmd.add(jobGroupId);
  517 +
  518 + new ProcessExecutor()
  519 + .command(lcmd)
  520 + .redirectOutput(new LogOutputStream() {
  521 + @Override
  522 + protected void processLine(String line) {
  523 + log.info(line);
  524 + }
  525 + })
  526 + .execute();
  527 +
  528 + long endTime = System.currentTimeMillis();
  529 + log.info("OS Command Run Ended: " + endTime);
  530 + log.info("OS Command Running Time : " + (endTime - startTime) + "ms");
  531 +
  532 +
  533 +// //작업종료에 대한 로그 업데이트
  534 +// paramLog.put("exit_code", "0");
  535 +// paramLog.put("exit_message", "");
  536 +// matchingInnerDelingMapper.finishUserJob(paramLog);
  537 +
  538 + }
  539 +
472 540 }
... ...
src/main/resources/application.properties
... ... @@ -18,14 +18,14 @@ spring.datasource.hikari.primary.username=account
18 18 spring.datasource.hikari.primary.password=daeucna10!
19 19  
20 20 # secondary
21   -#spring.datasource.hikari.secondary.driver-class-name=oracle.jdbc.driver.OracleDriver
22   -#spring.datasource.hikari.secondary.jdbc-url=jdbc:oracle:thin:@vanguardlab.kr:63522/CONFINAS19C
23   -#spring.datasource.hikari.secondary.username=ai
24   -#spring.datasource.hikari.secondary.password=ai
25 21 spring.datasource.hikari.secondary.driver-class-name=oracle.jdbc.driver.OracleDriver
26   -spring.datasource.hikari.secondary.jdbc-url=jdbc:oracle:thin:@daeuserver2.iptime.org:1521/orcl
27   -spring.datasource.hikari.secondary.username=CONFINAS3
28   -spring.datasource.hikari.secondary.password=CONFINAS3
  22 +spring.datasource.hikari.secondary.jdbc-url=jdbc:oracle:thin:@vanguardlab.kr:63522/CONFINAS19C
  23 +spring.datasource.hikari.secondary.username=ai
  24 +spring.datasource.hikari.secondary.password=ai
  25 +#spring.datasource.hikari.secondary.driver-class-name=oracle.jdbc.driver.OracleDriver
  26 +#spring.datasource.hikari.secondary.jdbc-url=jdbc:oracle:thin:@daeuserver2.iptime.org:1521/orcl
  27 +#spring.datasource.hikari.secondary.username=CONFINAS3
  28 +#spring.datasource.hikari.secondary.password=CONFINAS3
29 29  
30 30  
31 31  
... ... @@ -52,7 +52,13 @@ logging.level.p6spy=off
52 52 thread.comm.count=10
53 53 thread.ext.count=50
54 54 thread.ai.count=50
  55 +thread.ai.count.rowmax=500
  56 +thread.ai.processing.wait=15
  57 +thread.ai.processing.wait.total=3600
55 58  
56 59 #Python 프로퍼티 설정
57 60 pytyon.path=D:\\Programs\\devp\\python-3.12.2\\python.exe
58   -python.ai.target=D:\\Working\\Python\\Test1.py
59 61 \ No newline at end of file
  62 +python.ai.target=D:\\Working\\Python\\Test1.py
  63 +
  64 +#Auto Matching 제외
  65 +matching.auto.exceptListByComma=C-A-ROUND(-2)
60 66 \ No newline at end of file
... ...
src/main/resources/matchingSetup.json
... ... @@ -289,6 +289,54 @@
289 289 },
290 290  
291 291  
  292 +
  293 + {
  294 + "active": true,
  295 + "type": "C-A-ROUND(-2)",
  296 + "typeName": "자기수익(전표번호,거래통화),상대비용(전표번호,거래통화),비교(년월,거래통화,거래금액)",
  297 +
  298 + "condOne": {
  299 + "cond": [
  300 + "dta_ty in ('11','21','41')",
  301 + "mtch_ty is null",
  302 + "chit_no is not null",
  303 + "chit_no != ''"
  304 + ],
  305 + "makeCompareKey": [
  306 + "chit_no",
  307 + "delng_crncy"
  308 + ]
  309 + },
  310 + "condTwo": {
  311 + "cond": [
  312 + "dta_ty in ('12','22','42')",
  313 + "mtch_ty is null",
  314 + "chit_no is not null",
  315 + "chit_no != ''"
  316 + ],
  317 + "makeCompareKey": [
  318 + "chit_no",
  319 + "delng_crncy"
  320 + ]
  321 + },
  322 + "uniqueKey": [
  323 + "sys_se",
  324 + "accnut_ym",
  325 + "sn"
  326 + ],
  327 + "compareKey": "compare_ky",
  328 + "currencyField": "delng_crncy",
  329 + "amtField": "round(sum(delng_amt), -2) as delng_amt",
  330 + "compareField": [
  331 + "accnut_ym",
  332 + "delng_crncy",
  333 + "delng_amt"
  334 + ],
  335 + "matchingType": "mtch_ty",
  336 + "matchingTypeName": "mtch_ty_nm",
  337 + "matchingNumber": "mtch_ky"
  338 + },
  339 +
292 340  
293 341  
294 342  
... ...
src/main/resources/mybatis/primaryMapper/MatchingInnerDelingMapper.xml
... ... @@ -9,6 +9,9 @@
9 9 , accnut_ym
10 10 , cpr_code
11 11 , partn_cpr
  12 + <if test='asCurrency eq "Y".toString()'>
  13 + , delng_crncy
  14 + </if>
12 15 FROM
13 16 (
14 17 SELECT
... ... @@ -16,6 +19,9 @@
16 19 , accnut_ym
17 20 , cpr_code
18 21 , partn_cpr
  22 + <if test='asCurrency eq "Y".toString()'>
  23 + , delng_crncy
  24 + </if>
19 25 , case when count(*) > 0 then 1 else 0 end as cnt
20 26 FROM
21 27 public.batch_tbcr_inner_delng
... ... @@ -35,12 +41,18 @@
35 41 , accnut_ym
36 42 , cpr_code
37 43 , partn_cpr
  44 + <if test='asCurrency eq "Y".toString()'>
  45 + , delng_crncy
  46 + </if>
38 47 union all
39 48 SELECT
40 49 sys_se
41 50 , accnut_ym
42 51 , partn_cpr as cpr_code
43 52 , cpr_code as partn_cpr
  53 + <if test='asCurrency eq "Y".toString()'>
  54 + , delng_crncy
  55 + </if>
44 56 , case when count(*) > 0 then 1 else 0 end as cnt
45 57 FROM
46 58 public.batch_tbcr_inner_delng
... ... @@ -60,12 +72,18 @@
60 72 , accnut_ym
61 73 , cpr_code
62 74 , partn_cpr
  75 + <if test='asCurrency eq "Y".toString()'>
  76 + , delng_crncy
  77 + </if>
63 78 ) m
64 79 GROUP BY
65 80 sys_se
66 81 , accnut_ym
67 82 , cpr_code
68 83 , partn_cpr
  84 + <if test='asCurrency eq "Y".toString()'>
  85 + , delng_crncy
  86 + </if>
69 87 HAVING sum(cnt) > 1
70 88 </select>
71 89  
... ... @@ -457,6 +475,7 @@
457 475 and accnut_ym = #{accnutYm}
458 476 and cpr_code = #{cprCode}
459 477 and partn_cpr = #{partnCpr}
  478 + and delng_crncy = #{delngCurncy}
460 479 and mtch_ky is null
461 480 <if test='conds eq "T".toString()'>
462 481 and dta_ty in ('11','21','41')
... ... @@ -485,6 +504,7 @@
485 504 and accnut_ym = #{accnutYm}
486 505 and cpr_code = #{cprCode}
487 506 and partn_cpr = #{partnCpr}
  507 + and delng_crncy = #{delngCurncy}
488 508 and mtch_ky is null
489 509 <if test='conds eq "T".toString()'>
490 510 and dta_ty in ('12','22','42')
... ... @@ -548,6 +568,8 @@
548 568 , partn_cpr
549 569 , tb_ty
550 570 , delng_crncy
  571 + , sum(cnt) as cnt
  572 + , max(cnt_all) as cnt_all
551 573 FROM
552 574 (
553 575 SELECT
... ... @@ -558,6 +580,7 @@
558 580 , delng_crncy
559 581 , case when dta_ty in ('11','21','41') then 'T' else 'B' end tb_ty
560 582 , case when count(*) > 0 then 1 else 0 end as cnt
  583 + , count(*) as cnt_all
561 584 FROM
562 585 public.batch_tbcr_inner_delng
563 586 WHERE
... ... @@ -587,6 +610,7 @@
587 610 , delng_crncy
588 611 , case when dta_ty in ('12','22','42') then 'T' else 'B' end as tb_ty
589 612 , case when count(*) > 0 then 1 else 0 end as cnt
  613 + , count(*) as cnt_all
590 614 FROM
591 615 public.batch_tbcr_inner_delng
592 616 WHERE
... ... @@ -616,6 +640,7 @@
616 640 , delng_crncy
617 641 , tb_ty
618 642 HAVING sum(cnt) > 1
  643 + ORDER BY cnt_all
619 644 </select>
620 645  
621 646 <!-- User Job Status -->
... ...
src/main/resources/mybatis/secondaryMapper/OracleMapper.xml
... ... @@ -7,10 +7,19 @@
7 7 WITH COMP_INFO AS (
8 8 SELECT DISTINCT
9 9 COMP_CODE AS COMP_CODE
10   - , COMP_KR_NAME AS COMP_NAME
  10 + , (
  11 + SELECT
  12 + COMP_NAME_0
  13 + FROM TBBC_COMPANY_CODE_NLS
  14 + WHERE
  15 + SESSION_ID = A.SESSION_ID
  16 + AND COMP_CODE = A.COMP_CODE
  17 + AND #{accnutYm} BETWEEN START_YYMM AND END_YYMM
  18 + AND ROWNUM = 1
  19 + ) AS COMP_NAME
11 20 , BOOK_CURRENCY AS COMP_CURRENCY
12 21 , COMP_COA AS COMP_COA
13   - FROM TBBC_COMPANY_CODE
  22 + FROM TBBC_COMPANY_CODE A
14 23 WHERE
15 24 #{accnutYm} BETWEEN START_YYMM AND END_YYMM
16 25 )
... ... @@ -28,7 +37,7 @@
28 37 A.COMP_ACCT_CODE,
29 38 (
30 39 SELECT DISTINCT
31   - COMP_ACCT_NAME
  40 + COMP_ACCT_CODE
32 41 FROM TBBC_COMP_ACCT_CODE
33 42 WHERE
34 43 FS_TYPE = '1'
... ... @@ -36,7 +45,7 @@
36 45 AND COMP_ACCT_CODE = A.COMP_ACCT_CODE
37 46 AND #{accnutYm} BETWEEN START_YYMM AND END_YYMM
38 47 AND ROWNUM = 1
39   - ) AS COMP_ACCT_NAME,
  48 + ) AS COMP_ACCT_NAME,
40 49 A.COMP_PROD_CODE,
41 50 A.RECON_KEY,
42 51 A.TRAN_DATE,
... ... @@ -50,13 +59,13 @@
50 59 A.CONS_ACCT_CODE,
51 60 (
52 61 SELECT
53   - CONS_ACCT_KR_NAME
54   - FROM TBBC_ACCT_CODE
  62 + CONS_ACCT_NAME_0
  63 + FROM TBBC_ACCT_CODE_NLS
55 64 WHERE
56 65 CONS_ACCT_CODE = A.CONS_ACCT_CODE
57   - AND CONS_COA = 'GOV_I_COA'
  66 + AND CONS_COA = 'LS_COA'
58 67 AND FS_TYPE = '1'
59   - AND TO_CHAR(SYSDATE, 'YYYYMM') BETWEEN START_YYMM AND END_YYMM
  68 + AND #{accnutYm} BETWEEN START_YYMM AND END_YYMM
60 69 AND ROWNUM = 1
61 70 ) AS CONS_ACCT_NAME,
62 71 A.PROD_CODE,
... ... @@ -75,8 +84,8 @@
75 84 A.OWN_BIZ_NO,
76 85 A.PARTNER_BIZ_NO,
77 86 A.ACCT_DATE,
78   - NULL AS CREATION_DIV_CODE,
79   - NULL AS COST_MAT_KEY
  87 + A.CREATION_DIV_CODE,
  88 + A.COST_MAT_KEY
80 89 FROM
81 90 TBCR_TRANSACTION_HISTORY A
82 91 INNER JOIN COMP_INFO B
... ... @@ -98,7 +107,10 @@
98 107 FROM TBCR_MATCHING A,
99 108 TBCR_MATCHING_DETAIL B
100 109 WHERE
101   - A.MATCH_KEY = B.MATCH_KEY
  110 + A.SESSION_ID = B.SESSION_ID
  111 + AND A.CONS_GROUP = B.CONS_GROUP
  112 + AND A.LEDGER = B.LEDGER
  113 + AND A.MATCH_KEY = B.MATCH_KEY
102 114 AND A.ACCOUNT_PERIOD = B.ACCOUNT_PERIOD
103 115 AND A.CONS_GROUP = #{sysSe}
104 116 AND A.ACCOUNT_PERIOD = #{accnutYm}
... ...
src/main/resources/schema.sql
... ... @@ -33,11 +33,11 @@ CREATE TABLE IF NOT EXISTS batch_tbcr_inner_delng
33 33 sumry character varying(500),
34 34 org_mtch_ty character varying(10),
35 35 org_mtch_ky numeric(10,0),
36   - new_mtch_ty character varying(10),
  36 + new_mtch_ty character varying(50),
37 37 new_mtch_ky numeric(10,0),
38 38 compare_ky character varying(100),
39 39 mtch_sys character varying(10),
40   - mtch_ty character varying(10),
  40 + mtch_ty character varying(50),
41 41 mtch_ty_nm character varying(100),
42 42 mtch_ky bigint DEFAULT 0,
43 43 creation_div_code character varying(3),
... ...
사용법.md
... ... @@ -90,3 +90,11 @@ http://localhost:8080/api/job/return
90 90  
91 91 #작업진행결과
92 92 http://localhost:8080/api/job/userJobInfo/JOB그룹id
  93 +
  94 +#Async Job 호출
  95 +http://localhost:8080/api/job/callAsyncJob
  96 +{
  97 + "PrgName": "cmd",
  98 + "PrgParams": "/C dir /w"
  99 +}
  100 +
... ...