public class GCTest {
     private final static int ALLOC_SIZE = (int)(Runtime.getRuntime().maxMemory() * 0.50);

     public static void main(String[] args) throws InterruptedException {
          System.out.println("Before first allocation");
          byte[] b = new byte[ALLOC_SIZE];
          b = null; //객체 레퍼런스 주소를 반환 처리함으로써 GC대상에 포함되게 됨(null 처리 안하면 full gc 발생하면서 프로그램 종료됨)
          System.out.println("After first allocation");
          //        Thread.sleep(5000);
          System.out.println("Before second allocation");
          byte[] b2 = new byte[ALLOC_SIZE];
          System.out.println("After second allocation");
     }
}
Posted by 고잉고
TAG Java, JAVA GC

IOS푸시 발송시 ssl관련 에러

-Djavax.net.debug=all
 매개 변수로 디버거를 연결하면 ssl핸드쉐이크 에러 확인 되고..

https://ko.1answer.info/737461636b6f766572666c6f772e636f6d-7a3435353631353535

http://cbsm.tistory.com/10

* 결론: 인증서를 커맨드로 다시 만들어보자

'JAVA' 카테고리의 다른 글

javapns 처리 예외 : javax.net.ssl.SSLException 관련  (0) 2018.03.30
Posted by 고잉고
171009 기준 1.7.0 스냅샷버전

유저홈/apps 디렉토리를 기준으로 설치 함

#디렉토리 생성
mkdir ~/apps && cd ~apps

#master(최신) 버전 다운로드 후 압축 해제
wget 'https://github.com/naver/pinpoint/archive/master.zip' && unzip master.zip && rm master.zip

# 심볼링 링크 처리
ln -s pinpoint-master pinpoint

#인스톨(JAVA 6,7,8 필요)
cd ~/apps/pinpoint && ./mvnw install -Dmaven.test.skip=true

#JAVA설치
#jdk 8설치

#jdk 7설치

#jdk6설치
cd ~/apps
chmod 755 jdk-6u45-linux-x64.bin && ./jdk-6u45-linux-x64.bin && rm jdk-6u45-linux-x64.bin

#환경변수 등록
vi ~/.bashrc 후에

export JAVA_HOME=~/apps/jdk
export JAVA_8_HOME=~/apps/jdk_8
export JAVA_6_HOME=~/apps/jdk_6
export JAVA_7_HOME=~/apps/jdk_7
export PATH=$JAVA_HOME/bin:$PATH


#참고 : JAVA DNS TTL Modify
echo 'networkaddress.cache.ttl=60' >> ~/apps/jdk/jre/lib/security/java.security



#참고 : OS 디스크외 AWS EBS를 추가로 마운트해서 데이터를 저장한다면 pinpoint data디렉토리 변경(/data에 EBS 마운트)
cd ~/apps/pinpoint/quickstart && ln -s /data/pinpoint data
sudo su
mkdir /data/pinpoint && chown 유저계정:유저계정 /data/pinpoint



Hbase 설치 및 시작
-- HBase 저장기간을 줄임(1일=86400초로 줄이는데 상황에 따라서 적당한 수치로 조정)
 vi ./quickstart/conf/hbase/init-hbase.txt 후 아래 입력
 :%s/5184000/86400/g

-- Hbase 다운로드 및 시작
quickstart/bin/start-hbase.sh

-- Hbase 테이블 초기화
quickstart/bin/init-hbase.sh



Pinpoint 데몬들 설정 후 시작

-- 컬렉터로그 레벨을 조정해서 적게 남기도록 함
vi ./quickstart/collector/src/main/resources/log4j.xml
:%s/DEBUG/INFO/g
:%s/TRACE/INFO/g

-- pinpoint 웹의 로그레벨 조정
vi ./quickstart/web/src/main/resources/log4j.xml
:%s/DEBUG/INFO/g

-- 컬렉터(데이터 수집 프로세스)  시작
quickstart/bin/start-collector.sh

-- 웹 UI 시작
quickstart/bin/start-web.sh


agent 수정(해당 agent가 실제 어플리케이션 시작시 사용됨)

agent 홈 경로 : ~/apps/pinpoint/agent/target/pinpoint-agent-버전

cd ~/apps/pinpoint/agent/target/pinpoint-agent-버전

-- agent 로그 조정( 미 조정시 DEBUG레벨로 로그가 남아서 대상 프로그램의 성능 하향이 발생)
vi lib/log4j.xml 후 아래 명령 수행(로그레벨 DEBUG를 INFO로 조정)
:%s/DEBUG/INFO/g

아래내용은 삭제
<appender-ref ref="console" />

-- Collector server의 IP 및 포트 수정


vi ./quickstart/agent/src/main/resources/pinpoint.config
cd ~/apps/pinpoint/agent/target/pinpoint-agent-1.7.0-SNAPSHOT && vi pinpoint.config

-- 어플리케이션 서버로 복사를 위해서 압축해둠
ex) tar -czf pinpoint-agent-1.7.0-SNAPSHOT_171023.tar.gz pinpoint-agent-1.7.0-SNAPSHOT




이후 APM으로 모니터링하고 싶은 서버에 Agent 복사 후 프로세스 실행시 agent 사용하도록 셋팅
 - 방법은 정리 예정이며 필요시 구글 검색하세요




Posted by 고잉고
import java.io.File;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.FileUtils;

/**
 * 특정 디렉토리 하위의, 특정 확장자 파일에 대한 처리
 *   - 2번째 줄에 trimDirectiveWhitespaces 처리를 위한 내용 추가
 * 
 * @author 엄승하
 */
public class JspAddTrimWhitespaceTag {
     public static void main(String[] args) throws Exception {
          //jsp파일을 찾기 시작할 디렉토리
          String startDirPath = "파일을 찾기 시작할 디렉토리 경로";
          //파일 확장자 지정
          String[] ext = {"jsp"};
          //해당 파일들을 찾아서 컬렉션에 담음(recursive)
          Collection<File> jspFileList = FileUtils.listFiles(new File(startDirPath), ext, true);
          System.out.println(String.format("총 %s개", jspFileList.size()));
          String addStr = "<%@ page trimDirectiveWhitespaces=\"true\" %>"; //파일에 추가할 내용 : JSTL의 html변경 후 남은 whitespace를 없애는 처리
          for (File jspFile : jspFileList) {
               //System.out.println(file.getAbsolutePath());
              List<String> fileContents = FileUtils.readLines(jspFile, "UTF-8");
              fileContents.add(1, addStr); //2번째줄에 추가할 문자를 컨텐츠 내용에 추가
              FileUtils.writeLines(jspFile, fileContents); //해당 파일에 쓰기
              fileContents = null; //빠른 GC처리
          }
          System.out.println("====  끝  ====");
     }
}
Posted by 고잉고
  1. STS설치
  2. lombok 설치 : java get, setter 등을 소스에서 없애서 가독성 향상
  3. SVN커넥터 설치 : Subversive로 설치








  4. 글꼴 변경
  5. 코드 템플릿 변경





  6. JRE(Java) 설정



  7. 톰캣서버 설정



  8. 로거 자동완성용 Java 템플릿 추가
    • CTRL+Space로 로거 자동 완성을 위한 템플릿 등록(LOG 타이핑 후 CTRL+Space를 누르면 자동 완성 됨)
      • private static final Logger LOG = LoggerFactory.getLogger(${enclosing_type}.class);




  9. 인코딩 변경
















  10. javascript 자동완성 셋팅
    • javascript 어시스트 기능 ON



    • javascript Plug-In 설치(문제가 있을 수 있으니 필요한 경우에만 설치)


Posted by 고잉고
코딩하다가보면 가끔 특정 코드 블럭에는 formatter를 적용 안해야하는 부분이 있음.(가독성을 위해서)
그럴 때 사용하는 방법

  1. Enable tag


  2. 소스에 적용 샘플
   // @formatter:off
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       
        /** 인터셉터 */
        registry.addInterceptor(getAccessInterceptor())
            .addPathPatterns( "/**")
                .excludePathPatterns( "/")
                .excludePathPatterns( "/favicon.ico")
                .excludePathPatterns( "/resources/**")
                .excludePathPatterns( "/error/**");
       
        super.addInterceptors(registry );
    }
    // @formatter:on


Posted by 고잉고
  1. 현상
    1. 기존 설치형톰캣 + Spring 3.2 기반의 프로젝트를 Spring boot 1.3.5와 임베디드 톰캣으로 변경하였는데 일정 주기마다 응답이 느려지는 현상이 발생(약, 2~3초)
    2. 다른 프로젝트도 Spring boot로 서비스 중이지만 동일현상이 발생하지 않았음
  2. 의심사항 리스트업
    1. 일정주기 -> ehcache 캐쉬 리로드 타임
    2. 로그백 캐쉬 리로드
    3. 기타 여러가지
  3. 디버깅
    1. 테스트용 URL을 만들어서 call 찍어봄
    2. Spring boot tomcat access로그를 남겨서 응답시간을 남겨봄
    3. 어플리케이션 로그를 DEBUG레벨로 남겨봄
  4. 디버깅을 통한 의심사항 확인
    1. 응답이 느려질 때 어플리케이션 로그에 아래와 같은 딜레이가 발생됨을 확인(3초 가량의 딜레이)
    2. 2016-07-03 12:22:04 [DEBUG] o.a.c.connector.CoyoteAdapter:180 - The variable [semicolon] has value [-1]
      2016-07-03 12:22:04 [DEBUG] o.a.c.connector.CoyoteAdapter:180 - The variable [enc] has value [utf-8]
      2016-07-03 12:22:07 [DEBUG] o.a.c.a.AuthenticatorBase:180 - Security checking request POST 요청URL 블라블라
    3. 해당 시점에 jvm gc를 확인해보니 young gc가 발생 -> GC시점에 느려짐?? -> FULL GC도 아닌데 왜 느려짐? -> 임베디드톰캣 설정이 문제인가??
      1. jstat -gcutil -h10 프로세스ID 1s
      2. 재 확인해보니 꼭 GC발생시점에 느려지지는 않음








Posted by 고잉고

파일업로드 Rest full 기능 샘플 소스
 - 참고 : http://www.technicalkeeda.com/spring-tutorial/spring-mvc-file-upload-restful-web-service-example
 - 소스 : https://github.com/oshnew/spring-boot-study/blob/master/study-spring-boot/src/main/java/com/biz/fileUpload/controller/FileuploadController.java



@RestController
@RequestMapping ("/file")
public class FileuploadController {

     @Autowired
     private ServletContext context;

     /**
      * 파일 멀티파트 업로드 Rest full
      *
      * @param inputFile
      * @return
      */
     @RequestMapping(value = "/upload", headers = ("content-type=multipart/*" ), method = RequestMethod.POST )
     public ResponseEntity<FileInfo> upload(@RequestParam ("file") MultipartFile inputFile) {

          FileInfo fileInfo = new FileInfo();
          HttpHeaders headers = new HttpHeaders();
           if (!inputFile .isEmpty()) {

               try {

                   String oriFileNm = inputFile.getOriginalFilename();
                   File destinationFile = new File(context.getRealPath("/WEB-INF/uploaded" ) + File.separator + oriFileNm);
                    inputFile.transferTo(destinationFile );
                    headers.add("File Uploaded Successfully - ", oriFileNm);

                    fileInfo.setFileName(destinationFile .getPath());
                    fileInfo.setFileSize(inputFile .getSize());
                    return new ResponseEntity<FileInfo>(fileInfo , headers, HttpStatus.OK );

              } catch (Exception e ) {
                    return new ResponseEntity<FileInfo>(HttpStatus.BAD_REQUEST);
              }
          } else {
               return new ResponseEntity<FileInfo>(HttpStatus.BAD_REQUEST);
          }
     }
}




/**
 * 파일정보 VO
 *
 * @author 엄승하
 */
@Data
public class FileInfo {

     private String fileName;
     private long fileSize ;

}




Posted by 고잉고
  1. SVN


  1. SVN 커넥터(Repositories 추가시 설치 창이 뜸)



  1. 인코딩셋 셋팅(웹 개발관련)


4. 에디터에 라인 번호 표시



  1. 톰캣서버 설정






2016-05-31 기준
설치한 플러그린 리스트

Posted by 고잉고



import java.io.IOException;
import java.net.URI;

import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

/**
 * Jenkins JOB 실행하는 프로그램
 *  - httpclient 4.3.x 이상 필요
 *  - 참고 : https://wiki.jenkins- ci.org/display/JENKINS/Authenticating+scripted+clients
 *
 * @author 엄승하
 */
public class TestCallJenkinsJob {

     public String scrape(String urlString, String username, String password ) throws ClientProtocolException, IOException {

          URI uri = URI.create( urlString);
          HttpHost host = new HttpHost(uri.getHost(), uri.getPort(), uri .getScheme());
          CredentialsProvider credsProvider = new BasicCredentialsProvider();
           credsProvider.setCredentials(new AuthScope(uri.getHost(), uri .getPort()), new UsernamePasswordCredentials(username , password));

           // Create AuthCache instance
          AuthCache authCache = new BasicAuthCache();

           // Generate BASIC scheme object and add it to the local auth cache
          BasicScheme basicAuth = new BasicScheme();
           authCache.put(host , basicAuth);
          CloseableHttpClient httpClient = HttpClients.custom().setDefaultCredentialsProvider( credsProvider).build();
          HttpGet httpGet = new HttpGet(uri);

           // Add AuthCache to the execution context
          HttpClientContext localContext = HttpClientContext.create();
           localContext.setAuthCache(authCache );

          HttpResponse response = httpClient .execute(host, httpGet, localContext );

           return EntityUtils.toString(response.getEntity());

     }

     public static void main(String[] args) {

          String jobUrl = "JOB URL(토큰정보 포함)" ;
          String userNm = "계정ID" ;
          String pwd = "계정 암호" ;

           try {

              String rslt = new TestCallJenkinsJob().scrape(jobUrl , userNm, pwd);
              System. out.println("rslt: " + rslt);

          } catch (IOException e ) {
               e.printStackTrace();
          }
     }

}


Posted by 고잉고