|
@@ -31,22 +31,21 @@ import com.icontrols.bridge.dto.ServiceDetail;
|
|
|
|
|
|
public class MsgServerHandler extends Thread {
|
|
public class MsgServerHandler extends Thread {
|
|
private final Logger logger = LoggerFactory.getLogger(MsgServerHandler.class);
|
|
private final Logger logger = LoggerFactory.getLogger(MsgServerHandler.class);
|
|
-
|
|
|
|
|
|
+
|
|
private Socket clientSocket;
|
|
private Socket clientSocket;
|
|
- private String rcvMsgStr; // 입력 받은 XML String
|
|
|
|
-
|
|
|
|
-
|
|
|
|
|
|
+ private String rcvMsgStr; // 입력 받은 XML String
|
|
|
|
+
|
|
private long lSocketConnectionPeriod = 0;
|
|
private long lSocketConnectionPeriod = 0;
|
|
private int TIMEOUT_iMAP_WAIT = 3000; // iMAP 타임아웃
|
|
private int TIMEOUT_iMAP_WAIT = 3000; // iMAP 타임아웃
|
|
private int SOCKET_BUFFER_SIZE_READ = 50;
|
|
private int SOCKET_BUFFER_SIZE_READ = 50;
|
|
-
|
|
|
|
- private final int SOCKET_WAIT_TIME = 3000; // 전송할 때
|
|
|
|
|
|
+
|
|
|
|
+ private final int SOCKET_WAIT_TIME = 3000; // 전송할 때
|
|
private final int SOCKET_BUFFER_SIZE = 100; // 전송할 때
|
|
private final int SOCKET_BUFFER_SIZE = 100; // 전송할 때
|
|
-
|
|
|
|
- public MsgServerHandler (Socket clientSocket) {
|
|
|
|
|
|
+
|
|
|
|
+ public MsgServerHandler(Socket clientSocket) {
|
|
this.clientSocket = clientSocket;
|
|
this.clientSocket = clientSocket;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
public void run() {
|
|
public void run() {
|
|
InputStream is = null;
|
|
InputStream is = null;
|
|
InputStreamReader isr = null;
|
|
InputStreamReader isr = null;
|
|
@@ -54,163 +53,192 @@ public class MsgServerHandler extends Thread {
|
|
try {
|
|
try {
|
|
is = clientSocket.getInputStream();
|
|
is = clientSocket.getInputStream();
|
|
isr = new InputStreamReader(is, "euc-kr");
|
|
isr = new InputStreamReader(is, "euc-kr");
|
|
-
|
|
|
|
|
|
+
|
|
clientSocket.setSoLinger(true, 3000);
|
|
clientSocket.setSoLinger(true, 3000);
|
|
-
|
|
|
|
|
|
+
|
|
br = new BufferedReader(isr);
|
|
br = new BufferedReader(isr);
|
|
rcvMsgStr = "";
|
|
rcvMsgStr = "";
|
|
-
|
|
|
|
|
|
+
|
|
StringBuffer sbRcvMSG = new StringBuffer();
|
|
StringBuffer sbRcvMSG = new StringBuffer();
|
|
StringBuffer sbInBuffer = null;
|
|
StringBuffer sbInBuffer = null;
|
|
-
|
|
|
|
|
|
+
|
|
boolean rcvOK = false;
|
|
boolean rcvOK = false;
|
|
lSocketConnectionPeriod = System.currentTimeMillis() + TIMEOUT_iMAP_WAIT;
|
|
lSocketConnectionPeriod = System.currentTimeMillis() + TIMEOUT_iMAP_WAIT;
|
|
-
|
|
|
|
- while(System.currentTimeMillis() < lSocketConnectionPeriod) {
|
|
|
|
|
|
+
|
|
|
|
+ while (System.currentTimeMillis() < lSocketConnectionPeriod) {
|
|
try {
|
|
try {
|
|
- if(br.ready()) {
|
|
|
|
|
|
+ if (br.ready()) {
|
|
try {
|
|
try {
|
|
char[] readData = new char[SOCKET_BUFFER_SIZE_READ * 1024];
|
|
char[] readData = new char[SOCKET_BUFFER_SIZE_READ * 1024];
|
|
sbInBuffer = new StringBuffer();
|
|
sbInBuffer = new StringBuffer();
|
|
-
|
|
|
|
- while(br.ready()) {
|
|
|
|
|
|
+
|
|
|
|
+ while (br.ready()) {
|
|
long charCnt = br.read(readData);
|
|
long charCnt = br.read(readData);
|
|
- sbInBuffer.append(new String(readData, 0, (int)charCnt));
|
|
|
|
|
|
+ sbInBuffer.append(new String(readData, 0, (int) charCnt));
|
|
}
|
|
}
|
|
-
|
|
|
|
- if(sbInBuffer != null || sbInBuffer.toString().trim().length() > 0)
|
|
|
|
|
|
+
|
|
|
|
+ if (sbInBuffer != null || sbInBuffer.toString().trim().length() > 0)
|
|
sbRcvMSG.append(sbInBuffer.toString());
|
|
sbRcvMSG.append(sbInBuffer.toString());
|
|
-
|
|
|
|
- if(0 < sbInBuffer.toString().indexOf("</imap>")) {
|
|
|
|
|
|
+
|
|
|
|
+ if (0 < sbInBuffer.toString().indexOf("</imap>")) {
|
|
rcvOK = true;
|
|
rcvOK = true;
|
|
logger.info("Client Message Receive DONE!!!");
|
|
logger.info("Client Message Receive DONE!!!");
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- }catch(Exception e) {
|
|
|
|
|
|
+ } catch (Exception e) {
|
|
logger.error("Message Read ERROR --> " + e.getMessage());
|
|
logger.error("Message Read ERROR --> " + e.getMessage());
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- }else {
|
|
|
|
|
|
+ } else {
|
|
Thread.sleep(100);
|
|
Thread.sleep(100);
|
|
- }
|
|
|
|
- }catch(Exception e) {
|
|
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
logger.error("Message Read Error 2 ... --> " + e.getMessage());
|
|
logger.error("Message Read Error 2 ... --> " + e.getMessage());
|
|
clientSocket.close();
|
|
clientSocket.close();
|
|
return;
|
|
return;
|
|
- }finally {
|
|
|
|
|
|
+ } finally {
|
|
rcvMsgStr = sbRcvMSG.toString();
|
|
rcvMsgStr = sbRcvMSG.toString();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
- if(!rcvOK) {
|
|
|
|
|
|
+
|
|
|
|
+ if (!rcvOK) {
|
|
logger.error("FAIL... iMap message is unacceptable!! : \n\r " + rcvMsgStr);
|
|
logger.error("FAIL... iMap message is unacceptable!! : \n\r " + rcvMsgStr);
|
|
clientSocket.close();
|
|
clientSocket.close();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
logger.info(" :: >> " + rcvMsgStr);
|
|
logger.info(" :: >> " + rcvMsgStr);
|
|
- }catch(Exception e) {
|
|
|
|
-
|
|
|
|
- }finally {
|
|
|
|
- try { if(!clientSocket.isClosed()) clientSocket.close(); }catch(Exception e) { }
|
|
|
|
- try { br.close(); } catch(Exception e) { }
|
|
|
|
- try { isr.close(); } catch(Exception e) { }
|
|
|
|
- try { is.close(); } catch(Exception e) { }
|
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+
|
|
|
|
+ } finally {
|
|
|
|
+ try {
|
|
|
|
+ if (!clientSocket.isClosed())
|
|
|
|
+ clientSocket.close();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ br.close();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ isr.close();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ is.close();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
try {
|
|
try {
|
|
- rcvMsgStr = rcvMsgStr.substring(rcvMsgStr.indexOf("<")); // 이 부분에 대한 예시 데이터가 있으면 이해하기 좋을거 같다. 테스트 하면서 뽑아내고 주석으로 잘아보자.
|
|
|
|
- // 내가 생각하기엔 앞에 공백이 있을 경우? 혹은 다른 문자가 있을경우를 대비하기 위함이지 않을까 생각한다.
|
|
|
|
|
|
+ rcvMsgStr = rcvMsgStr.substring(rcvMsgStr.indexOf("<")); // 이 부분에 대한 예시 데이터가 있으면 이해하기 좋을거 같다. 테스트 하면서 뽑아내고
|
|
|
|
+ // 주석으로 잘아보자.
|
|
|
|
+ // 내가 생각하기엔 앞에 공백이 있을 경우? 혹은 다른 문자가 있을경우를 대비하기
|
|
|
|
+ // 위함이지 않을까 생각한다.
|
|
// 이벤트명 가져오기
|
|
// 이벤트명 가져오기
|
|
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // XML 문서를 읽기 위한 Factory 객체 생성
|
|
|
|
- DocumentBuilder builder = factory.newDocumentBuilder(); // Builder 객체 생성
|
|
|
|
|
|
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // XML 문서를 읽기 위한 Factory 객체 생성
|
|
|
|
+ DocumentBuilder builder = factory.newDocumentBuilder(); // Builder 객체 생성
|
|
InputStream istream = new ByteArrayInputStream(rcvMsgStr.getBytes("UTF-8"));
|
|
InputStream istream = new ByteArrayInputStream(rcvMsgStr.getBytes("UTF-8"));
|
|
Document doc = builder.parse(istream);
|
|
Document doc = builder.parse(istream);
|
|
-
|
|
|
|
|
|
+
|
|
XPath xpath = XPathFactory.newInstance().newXPath();
|
|
XPath xpath = XPathFactory.newInstance().newXPath();
|
|
- Node iMap = (Node)xpath.evaluate("//imap/service", doc, XPathConstants.NODE);
|
|
|
|
-
|
|
|
|
|
|
+ Node iMap = (Node) xpath.evaluate("//imap/service", doc, XPathConstants.NODE);
|
|
|
|
+
|
|
final String eventName = iMap.getAttributes().getNamedItem("name").getTextContent();
|
|
final String eventName = iMap.getAttributes().getNamedItem("name").getTextContent();
|
|
-
|
|
|
|
|
|
+
|
|
// 이벤트 명이 null 이거나 공란이면 종료.
|
|
// 이벤트 명이 null 이거나 공란이면 종료.
|
|
- if(eventName == null || eventName.trim().length() == 0) return;
|
|
|
|
|
|
+ if (eventName == null || eventName.trim().length() == 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ final boolean isContainCompany = rcvMsgStr.contains("<req_company>") ? true : false; // <req_company>UPLUS</req_company>
|
|
|
|
+ // Element가 있는지
|
|
|
|
+ // 확인한다.
|
|
|
|
+ // 없으면 설정파일에 등록된 모든
|
|
|
|
+ // 서비스에 이벤트를 전송하고
|
|
|
|
+ // 있으면 해당 Element에
|
|
|
|
+ // 정의된 서비스에만 전송한다.
|
|
|
|
|
|
- final boolean isContainCompany = rcvMsgStr.contains("<req_company>")?true:false; // <req_company>UPLUS</req_company> Element가 있는지 확인한다.
|
|
|
|
- // 없으면 설정파일에 등록된 모든 서비스에 이벤트를 전송하고 있으면 해당 Element에 정의된 서비스에만 전송한다.
|
|
|
|
-
|
|
|
|
- final String midStr = isContainCompany?rcvMsgStr.substring(rcvMsgStr.indexOf("<req_company>"), rcvMsgStr.indexOf("</req_company>")):"";
|
|
|
|
|
|
+ final String midStr = isContainCompany
|
|
|
|
+ ? rcvMsgStr.substring(rcvMsgStr.indexOf("<req_company>"), rcvMsgStr.indexOf("</req_company>"))
|
|
|
|
+ : "";
|
|
|
|
+
|
|
|
|
+ final String reqStr = isContainCompany ? midStr.substring(midStr.indexOf(">") + 1) : "";
|
|
|
|
+ final String topStr = isContainCompany ? rcvMsgStr.substring(0, rcvMsgStr.indexOf(reqStr)) : "";
|
|
|
|
+ final String bottomStr = isContainCompany ? rcvMsgStr.substring(rcvMsgStr.indexOf("</req_company>")) : "";
|
|
|
|
+
|
|
|
|
+ String[] companies = reqStr.split("/");
|
|
|
|
|
|
- final String reqStr = isContainCompany?midStr.substring(midStr.indexOf(">")+1):"";
|
|
|
|
- final String topStr = isContainCompany?rcvMsgStr.substring(0, rcvMsgStr.indexOf(reqStr)):"";
|
|
|
|
- final String bottomStr = isContainCompany?rcvMsgStr.substring(rcvMsgStr.indexOf("</req_company>")):"";
|
|
|
|
-
|
|
|
|
// 서비스 목록 가져오기
|
|
// 서비스 목록 가져오기
|
|
- for(ServiceDetail service : COMMON_INFO.serviceDtailList) {
|
|
|
|
|
|
+ for (String companyName : companies) {
|
|
// for(JsonElement jsonObj : COMMON_INFO.propList) {
|
|
// for(JsonElement jsonObj : COMMON_INFO.propList) {
|
|
// ServiceDetail service = new Gson().fromJson(jsonObj.toString(), ServiceDetail.class);
|
|
// ServiceDetail service = new Gson().fromJson(jsonObj.toString(), ServiceDetail.class);
|
|
-
|
|
|
|
- if(!Arrays.asList(service.getEvents()).contains(eventName)) continue;
|
|
|
|
-
|
|
|
|
- StringBuffer sb = new StringBuffer();
|
|
|
|
-
|
|
|
|
- if(isContainCompany) rcvMsgStr = sb.append(topStr).append(service.getName()).append(bottomStr).toString();
|
|
|
|
-
|
|
|
|
- logger.debug("최종 - \r\n" + rcvMsgStr);
|
|
|
|
-
|
|
|
|
- Runnable task = () -> {
|
|
|
|
- Socket danziSocket = null;
|
|
|
|
- DataOutputStream outStream = null;
|
|
|
|
- try {
|
|
|
|
- danziSocket = new Socket();
|
|
|
|
- danziSocket.setSoLinger(true, 3000);
|
|
|
|
- danziSocket.setSendBufferSize(SOCKET_BUFFER_SIZE * 1024);
|
|
|
|
- danziSocket.setSoTimeout(SOCKET_WAIT_TIME);
|
|
|
|
-
|
|
|
|
- InetSocketAddress iSocAddr = new InetSocketAddress(service.getAddress(), service.getPort());
|
|
|
|
- danziSocket.connect(iSocAddr, SOCKET_WAIT_TIME);
|
|
|
|
-
|
|
|
|
- outStream = new DataOutputStream(danziSocket.getOutputStream());
|
|
|
|
- String sendMsg = rcvMsgStr + "\r\n";
|
|
|
|
- byte[] outBF = sendMsg.getBytes("euc-kr");
|
|
|
|
-
|
|
|
|
- outStream.write(outBF);
|
|
|
|
- outStream.flush();
|
|
|
|
-
|
|
|
|
- StringBuffer logSB = new StringBuffer();
|
|
|
|
-
|
|
|
|
- logSB.append(" S E N D T O " + service.getPort() + " C O M P L I T E ! ! ! ! \n");
|
|
|
|
-
|
|
|
|
- logger.info(logSB.toString());
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- // TODO Auto-generated catch block
|
|
|
|
-
|
|
|
|
- StringBuffer errSB = new StringBuffer();
|
|
|
|
-
|
|
|
|
- errSB.append("\n***************************************************\n")
|
|
|
|
- .append(" F A I L T O "+ service.getPort() + " S E N D E V E N T ! ! ! ! \n")
|
|
|
|
- .append(" ERROR MESSAGE = " + e.getMessage() + " \n")
|
|
|
|
- .append("***************************************************");
|
|
|
|
-
|
|
|
|
- logger.error(errSB.toString());
|
|
|
|
-
|
|
|
|
- e.printStackTrace();
|
|
|
|
- } finally {
|
|
|
|
- try {
|
|
|
|
- Thread.sleep(100);
|
|
|
|
- outStream.close();
|
|
|
|
- danziSocket.close();
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- e.printStackTrace();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
- new Thread(task).start();
|
|
|
|
- }
|
|
|
|
|
|
+ ServiceDetail service = COMMON_INFO.serviceDtailList.get(companyName);
|
|
|
|
+
|
|
|
|
+ if (!Arrays.asList(service.getEvents()).contains(eventName))
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
|
+
|
|
|
|
+ if (isContainCompany)
|
|
|
|
+ rcvMsgStr = sb.append(topStr).append(service.getName()).append(bottomStr).toString();
|
|
|
|
+
|
|
|
|
+ logger.debug("최종 - \r\n" + rcvMsgStr);
|
|
|
|
+
|
|
|
|
+ Runnable task = () -> {
|
|
|
|
+ Socket danziSocket = null;
|
|
|
|
+ DataOutputStream outStream = null;
|
|
|
|
+ try {
|
|
|
|
+ danziSocket = new Socket();
|
|
|
|
+ danziSocket.setSoLinger(true, 3000);
|
|
|
|
+ danziSocket.setSendBufferSize(SOCKET_BUFFER_SIZE * 1024);
|
|
|
|
+ danziSocket.setSoTimeout(SOCKET_WAIT_TIME);
|
|
|
|
+
|
|
|
|
+ InetSocketAddress iSocAddr = new InetSocketAddress(service.getAddress(), service.getPort());
|
|
|
|
+ danziSocket.connect(iSocAddr, SOCKET_WAIT_TIME);
|
|
|
|
+
|
|
|
|
+ outStream = new DataOutputStream(danziSocket.getOutputStream());
|
|
|
|
+ String sendMsg = rcvMsgStr + "\r\n";
|
|
|
|
+ byte[] outBF = sendMsg.getBytes("euc-kr");
|
|
|
|
+
|
|
|
|
+ outStream.write(outBF);
|
|
|
|
+ outStream.flush();
|
|
|
|
+
|
|
|
|
+ StringBuffer logSB = new StringBuffer();
|
|
|
|
+
|
|
|
|
+ logSB.append(" S E N D T O " + service.getPort() + " C O M P L I T E ! ! ! ! \n");
|
|
|
|
+
|
|
|
|
+ logger.info(logSB.toString());
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ // TODO Auto-generated catch block
|
|
|
|
+
|
|
|
|
+ StringBuffer errSB = new StringBuffer();
|
|
|
|
+
|
|
|
|
+ errSB.append("\n***************************************************\n")
|
|
|
|
+ .append(" F A I L T O " + service.getPort()
|
|
|
|
+ + " S E N D E V E N T ! ! ! ! \n")
|
|
|
|
+ .append(" ERROR MESSAGE = " + e.getMessage() + " \n")
|
|
|
|
+ .append("***************************************************");
|
|
|
|
+
|
|
|
|
+ logger.error(errSB.toString());
|
|
|
|
+
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } finally {
|
|
|
|
+ try {
|
|
|
|
+ Thread.sleep(100);
|
|
|
|
+ outStream.close();
|
|
|
|
+ danziSocket.close();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ };
|
|
|
|
+ new Thread(task).start();
|
|
|
|
+ }
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
// TODO Auto-generated catch block
|
|
// TODO Auto-generated catch block
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
logger.error("[ERROR] IOEXCEPTION-" + e.getMessage());
|
|
logger.error("[ERROR] IOEXCEPTION-" + e.getMessage());
|
|
- } catch(Exception e) {
|
|
|
|
|
|
+ } catch (Exception e) {
|
|
logger.error("[ERROR] EXCEPTION - " + e.getMessage());
|
|
logger.error("[ERROR] EXCEPTION - " + e.getMessage());
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|