아키텍처와 함께

블로그 이미지
by gregorio
  • Total hit
  • Today hit
  • Yesterday hit

'Java'에 해당되는 글 8건

  1. 2018.07.26
    Java Convert Map to XML 예제
  2. 2018.07.05
    Java에서 Shell호출 방법
  3. 2018.06.07
    JVM GC 설정
  4. 2018.04.12
    Java Reflection 사용법
  5. 2018.02.22
    JSP의 img, script에 jsessionid가 추가되는 경우

Java 프로젝트를 진행하면서 Map을 Json으로 변경하는 Library는 많이 제공하고 있다.

Map을 XML로 변환이 필요한 경우 다음 Util을 이용하여 변환이 가능하다.


■ XML To Map Convert


import java.util.Map;


import org.json.JSONObject;

import org.json.XML;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


public class XmlUtil {


public static final Logger LOGGER = LoggerFactory.getLogger(XmlUtil.class);


public static Map<String, Object> xml2Map(String xml) throws Exception {


JSONObject xmlJSONObj = XML.toJSONObject(xml);

Map<String, Object> result = JsonUtil.json2Map(xmlJSONObj.toString());


return result;

}

public static <K, V> String  map2Xml(Map<K, V> map) throws Exception {

String jsonData = JsonUtil.map2Json(map);

String xml = XML.toString(new JSONObject(jsonData));

return xml;

}

public static String json2Xml(String json) throws Exception {

JSONObject jsonData = new JSONObject(json);

String xml = XML.toString(jsonData);

return xml;

}

public static void main(String args[]) throws Exception {

String jsonStr = "{\"name\":\"포도\", \"code\":\"1000\"}";


String xml = json2Xml(jsonStr);

Map<String, Object> map = xml2Map(xml);

String xml1 = map2Xml(map);

System.out.println("XML =" + xml);

System.out.println("map = " + map);

System.out.println("XML1 = " + xml1);

}

}



JsonObject를 이용하여 XML을 Json으로 변환한 후 변환된 Json을 Map으로 변환하여 XML을 Map으로 변환이 가능하다.




'Java' 카테고리의 다른 글

Java에서 Shell호출 방법  (0) 2018.07.05
JVM GC 설정  (0) 2018.06.07
Java Reflection 사용법  (0) 2018.04.12
JSP의 img, script에 jsessionid가 추가되는 경우  (0) 2018.02.22
Html a tag function call  (0) 2018.02.20
AND

Java에서 Shell 호출 시 apache commons-exec를 사용하면 쉽게 shell을 호출하고 shell에 파라미터 전달도 가능하다.


■ 소스

import java.io.ByteArrayOutputStream;

import java.util.HashMap;

import java.util.Map;


import org.apache.commons.exec.CommandLine;

import org.apache.commons.exec.DefaultExecuteResultHandler;

import org.apache.commons.exec.DefaultExecutor;

import org.apache.commons.exec.ExecuteStreamHandler;

import org.apache.commons.exec.ExecuteWatchdog;

import org.apache.commons.exec.PumpStreamHandler;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.servlet.ModelAndView;


import ncd.spring.common.util.PropertyUtil;


@Controller

public class DeployController {


private static final Logger LOGGER = LoggerFactory.getLogger(DeployController.class);

@RequestMapping(value = "/admin/deploy.do")

public ModelAndView sourceDeploy(@RequestParam("type") String type) throws Exception {

LOGGER.info("Start Source Deploy....");

final Map<String, Object> resultMap = new HashMap<String, Object>();


String scriptFile  = PropertyUtil.getString("deploy.script.file");

String confFile = null;

if ("oz".equals(type)) {

confFile = PropertyUtil.getString("oz.deploy.config.file");

}

else {

confFile = PropertyUtil.getString("was.deploy.config.file");

}

if (scriptFile == null || confFile == null) {

resultMap.put("error", "script file or config file is null");

return new ModelAndView("ajaxMultiDataView", resultMap);

}

LOGGER.info("{},{}", scriptFile, confFile);

/** Initiate Executor **/

DefaultExecutor executor = new DefaultExecutor();

ExecuteWatchdog watchDog = new ExecuteWatchdog(60*1000);

executor.setWatchdog(watchDog);

DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ExecuteStreamHandler stream = new PumpStreamHandler(bos, bos, null);

executor.setStreamHandler(stream);

/** Initiate Command Line **/

CommandLine cmdLine = new CommandLine(PropertyUtil.getString("deploy.script.command"));

/** Set parameter to command line **/

cmdLine.addArgument(scriptFile);

cmdLine.addArgument(confFile);

cmdLine.addArgument(type);

LOGGER.info("Execute Command :: ", cmdLine.toString());

/** Execute shell **/

try {

executor.execute(cmdLine, resultHandler);

resultHandler.waitFor();

int exitCode = resultHandler.getExitValue();

String result = bos.toString();

LOGGER.info("Result :: ", result);

resultMap.put("result", result);

resultMap.put("exitCode", exitCode);

}

catch(Exception ex) {

LOGGER.error(ex.getMessage());

}

finally {

bos.close();

}

ModelAndView mav = new ModelAndView("ajaxMultiDataView", resultMap);

return mav;

}



Shell의 수행결과를 받기 위해서는 PumpStreamHandeler를 생성하고, executer에 StreamHanlder에 Set한다.



'Java' 카테고리의 다른 글

Java Convert Map to XML 예제  (0) 2018.07.26
JVM GC 설정  (0) 2018.06.07
Java Reflection 사용법  (0) 2018.04.12
JSP의 img, script에 jsessionid가 추가되는 경우  (0) 2018.02.22
Html a tag function call  (0) 2018.02.20
AND

Tomcat을 사용하는 경우 ../bin/setenv.sh에 다음과 같이 추가한다.


Garbage Collection 방식은 Parallel GC를 적용하고 있으며, New 영역에 256m를 할당하였다.


■Parallel GC 설정

#!/bin/sh


export JAVA_HOME=/engn001/jdk1.7.0_80

# Configuration Tomcat log file

CATALINA_OUT="/logs001/apache-tomcat-7.0.76/catalina.out"

#Configuration JVM Heap Size

JAVA_OPTS=" ${JAVA_OPTS} -Xms1280m -Xmx1280m -XX:MaxPermSize=256m -XX:NewSize=256m –XX:MaxNewSize=256m -XX:SurvivorRatio=16"

#Start Configuration GC

JAVA_OPTS=" ${JAVA_OPTS} -verbose:gc -XX:+DisableExplicitGC -Xloggc:/logs001/apache-tomcat-7.0.76/gc_`date +"%Y%m%d"`.log"

JAVA_OPTS=" ${JAVA_OPTS} -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC"

#Apply Parallel GC

JAVA_OPTS=" ${JAVA_OPTS} -XX:+UseParallelGC  -XX:ParallelGCThreads=6 -XX:+UseParallelOldGC"

#End Configuration GC

JAVA_OPTS=" ${JAVA_OPTS} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs001/heap/portal.hprof"

#Start Configuration SCOUT

JAVA_OPTS=" ${JAVA_OPTS} -javaagent:${SCOUTER_AGENT_DIR}/scouter.agent.jar"

JAVA_OPTS=" ${JAVA_OPTS} -Dscouter.config=${SCOUTER_AGENT_DIR}/conf/scouter.conf"

JAVA_OPTS=" ${JAVA_OPTS} -Dobj_name=SEHATI-PORTAL"

#End Configuration SCOUT



■ CMS GC 설정

# Base settings and GC logging

-server -XX:+AlwaysPreTouch  # First should be default, but we make it explicit, second pre-zeroes memory mapped pages on JVM startup -- improves runtime performance

# -Xloggc:gc-%t.log  # CUSTOMIZE LOCATION HERE - $path/gc-%t.log -- the %t in the gc log file path is so we get a new file with each JVM restart

-XX:NumberOfGCLogFiles=5 -XX:+UseGCLogFileRotation -XX:GCLogFileSize=20m # Limits the number of files, logs to folder 

-XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCCause

-XX:+PrintTenuringDistribution -XX:+PrintReferenceGC -XX:+PrintAdaptiveSizePolicy # gather info on object age & reference GC time for further tuning if needed.


# G1 specific settings -- probably should be default for multi-core systems with >2 GB of heap (below that, default is probably fine)

-XX:+UseG1GC

-XX:+UseStringDeduplication

-XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20  # Prevents G1 undersizing young gen, which otherwise causes a cascade of issues

-XX:+ParallelRefProcEnabled # parallelize reference processing, reducing young and old GC times. We use a LOT of weak references, so should have big impact.

-XX:+ExplicitGCInvokesConcurrent  # Avoid explicit System.gc() call triggering full GC, instead trigger G1

-XX:+UnlockDiagnosticVMOptions -XX:G1SummarizeRSetStatsPeriod=1 # Additional logging for G1 status

-XX:MaxMetaspaceExpansion=64M  # Avoids triggering full GC when we just allocate a bit more metaspace, and metaspace automatically gets cleaned anyway


# Tuned CMS GC - probably not worth using though (prefer G1 or default parallel GC if heap is <2 GB or so)

-XX:+UseConcMarkSweepGC

-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses # fixes issues with superlong explicit GC cycles (switches to concurrent GC, but also enables class unloading so we don't get memory leaks).

-XX:+CMSParallelRemarkEnabled -XX:+ParallelRefProcEnabled # parallelize re-marking and reference processing. The first will reduce full GC time, the latter should reduce both GC times -- we use a LOT of weak references, so should have big impact.

-XX:+CMSClassUnloadingEnabled # allows GC of classloaders & classes (important because we do some dynamic loading and because of groovy).

-XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark # will force young gen GC before full GC (reduces full GC duration)

# Based on GC logs but may need refining, somewhere from 1:1 to 1:3 ratio is best because Jenkins makes mostly young garbage, cap at 3 G to limit minor GC pause duration

-XX:NewSize=512m -XX:MaxNewSize=3g -XX:NewRatio=2  


# Options NOT to use so far:

# * -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=<percent> - Generally suggested, but we don't have good benchmarks to collect these. So far we haven't done it


# Settings we *may* want to add for CMS but need more data for

#-Xms4g # because realistically allocating anything under 4 GB just increases startup time. We need that much RAM. Optional.

#-XX:NewSize=512m -XX:MaxNewSize=3g -XX:NewRatio=2 # start young gen somewhere reasonable and let it grow, but not too big (3 GB is a compromise b/w young GC pause time and the full GC pause time, the latter of which we know to be quite good even with a 10+ GB old gen heap)


# LOW-MEMORY use Jenkins, I.E. Jenkins on OpenShift, I have been using this for a long time to run Jenkins on an AWS t2.micro

# Will run A-OK with -Xmx384m if you limit load & workers

-XX:+UseSerialGC -XX:MinHeapFreeRatio=15 -XX:MaxHeapFreeRatio=30  -XX:MinMetaspaceFreeRatio=10 -XX:MaxMetaspaceFreeRatio=20 

# -XX:MaxMetaspaceSize=128m  -XX:CompressedClassSpaceSize=128m # Tweak to your needs.  This will run a decent-sized Jenkins however.  Too low == crashes

# Make sure to limit metaspace too, i.e. -XX:MaxMetaspaceSize=128m because it allocates a lot of RAM for that 


The over parameters are referred at https://gist.github.com/svanoort/66a766ea68781140b108f465be45ff00


'Java' 카테고리의 다른 글

Java Convert Map to XML 예제  (0) 2018.07.26
Java에서 Shell호출 방법  (0) 2018.07.05
Java Reflection 사용법  (0) 2018.04.12
JSP의 img, script에 jsessionid가 추가되는 경우  (0) 2018.02.22
Html a tag function call  (0) 2018.02.20
AND

Java 프로그램 개발 시 Reflection을 이용하여 Field의 값을 Map 등 다른 Object에 생성하고자 하는 경우 Java에서 제공하는 Reflection API, Apache commons-lang3 FieldUtils 사용, Spring Framework에서 제공하는 ReflectionUtils을 사용할 수 있다.


먼저 Apache commons-lang3에서  제공하는 FiledUtils 예제는 다음과 같다.


■ TestVo.java


public class TestVo {

private String name;

private int age;

private String password;


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public int getAge() {

return age;

}


public void setAge(int age) {

this.age = age;

}


public String getPassword() {

return password;

}


public void setPassword(String password) {

this.password = password;

}


}

 



■ FieldUtils 예제


import org.apache.commons.lang3.reflect.FieldUtils;


public static void main(String[] args) {


    TestVo vo = new TestVo();

    vo.setAge(10);

    vo.setName("kkimdoy");

   vo.setPassword("aaaaa");


   /** age를 20으로 변경 **/

   FieldUtils.writeField(vo, "age", 20, true);

   Field[] fields = FieldUtils.getAllFields(vo.getClass());

   for (Field field : fields) {

  String name =field.getName();

Object object = FieldUtils.readField(vo, name, true);

LOGGER.debug("{} :: {}", name, object);

   }

}  

먼저 TestVo에 값을 Set한 후 FieldUtils.getAlFiled() 메소드를 이용하여 객체의 모든 Filed를 조회한다.


getAllField의 Parameter는 Class이므로 vo 객체를 class로 변환하여 파라미터로 사용한다.


FiledUtils.readField 메소를 이용하여 Field의 값을 추출할 수 있다. 파라미터 중 마지막 파라미터는 private 필드를 Access할 때 true 값을 파라미터로 전달한다.




■ ReflectionUtils 예제

import org.springframework.util.ReflectionUtils;

import org.springframework.util.ReflectionUtils.FieldCallback;


public static void main(String[] args) {

final TestVo vo = new TestVo();

vo.setAge(10);

vo.setName("kkimdoy");

vo.setPassword("aaaaa");


       /** Age를 30으로 변경 **/

        Field field = ReflectionUtils.findField(vo.getClass(), "age");

ReflectionUtil.makeAccessible(field);

ReflectionUtils.setField(field, vo, 30);


ReflectionUtils.doWithFields(vo.getClass(), new FieldCallback() {


@Override

public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {

ReflectionUtil.makeAccessible(field);

Object value = ReflectionUtils.getField(field, vo);

LOGGER.debug("{} :: {}", field.getName(), value);

}

});

}

 


Spring framework에서 제공하는 ReflectionUtils를 사용하는 경우에는 doWithFields 메소드의 FileldCallback 함수를 재정의하여 사용한다.


private 필드에 대해 access를 허용하기 위해서 makeAccessilbe 메소드에 Filed를 파라미터로 전달한다.


Field의 값을 읽어오기 위해 getFiled 함수를 사용하며, 첫번째 파라미터는 Filed, 두번째 파라미터에 Value Object 객체를 넘겨준다.


'Java' 카테고리의 다른 글

Java에서 Shell호출 방법  (0) 2018.07.05
JVM GC 설정  (0) 2018.06.07
JSP의 img, script에 jsessionid가 추가되는 경우  (0) 2018.02.22
Html a tag function call  (0) 2018.02.20
CDI를 이용한 Java 개발  (0) 2018.02.13
AND

JSP에서 taglib c를 사용하여 img, script. css tag src를 지정하는 경우 resource에 jsessionid가 붙어 페이지를 처음 로딩할 때 jsessionid가 붙어 화면이 제대로 로딩되지 않는 경우가 발생한다.


화면을 다시 로딩하면 정상적으로 script, imgae, css가 적용된다.



■ 사용 예제

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


<link rel="stylesheet" type="text/css" href="<c:url value='/rui/plugins/ui/form/LFileBox.css'/>"/> 


■ 오류 결과

<link type="text/css" rel="stylesheet" href="/resource/css/import.css;jsessionid=589184C928C5896286836A1EF0DE6880" />

<link rel="alternate stylesheet" title="bh_style1" type="text/css" href=";jsessionid=589184C928C5896286836A1EF0DE6880resource/css/global_style_Rtl.css" id="bhStyle1"></link>
<link rel="stylesheet" title="en_style1" type="text/css" href=";jsessionid=589184C928C5896286836A1EF0DE6880resource/css/global_style.css" id="enStyle1"></link>
<script type="text/javascript" src="/resource/js/dui_prototype.js;jsessionid=589184C928C5896286836A1EF0DE6880"></script>
<script type="text/javascript" src="/resource/js/dui_hhmenu.js;jsessionid=589184C928C5896286836A1EF0DE6880"></script>
<script type="text/javascript" src="/resource/js/foriegnCheck.js;jsessionid=589184C928C5896286836A1EF0DE6880"></script>


브라우저에서 소스보기를 선택하여 소스를 확인하면 모든 script, css에 jessionid가 붙어 있어 404 오류가 발생한다.


이를 해결하기 위해 여러가지 방법이 있지만, 소스를 수정하지 않고 해결하는 방법은 web.xml에 sessoin-config에 tracking-mod를 추가하면 해결된다.


tracking-mods는 web-app_3.0이상에서만 지원하기 때문에 web.xml namespace를 변경해야한다.


■해결방법

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">


  <session-config>

  <session-timeout>30</session-timeout>

<tracking-mode>COOKIE</tracking-mode>

  </session-config>

 


'Java' 카테고리의 다른 글

JVM GC 설정  (0) 2018.06.07
Java Reflection 사용법  (0) 2018.04.12
Html a tag function call  (0) 2018.02.20
CDI를 이용한 Java 개발  (0) 2018.02.13
Java Class Instance화  (0) 2018.02.12
AND

ARTICLE CATEGORY

분류 전체보기 (56)
Spring Framrwork (33)
Linux (1)
APM (1)
Java (8)
python (0)
ant (1)
chart (1)
OS (1)
tomcat (1)
apache (1)
database (0)

RECENT ARTICLE

RECENT COMMENT

CALENDAR

«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

ARCHIVE

LINK