'Java'에 해당되는 글 26건

  1. 2011.10.05 Jetty Scanner 를 이용한 특정 디렉토리 및 파일 변경사항(delete, change, add) 모니터링하기
  2. 2011.09.28 java.sql.SQLException: Column count doesn't match value count at XXX 가 발생하는 경우
  3. 2011.09.27 JDK 설치시 이것저것 물어보는 대화창 없이 커맨드창에서 한번에 쭉 설치하기(Winodws)
  4. 2011.09.20 Apache Velocity 변수가 null 일때 공백으로 출력되게 하기
  5. 2011.09.08 java.security.NoSuchAlgorithmException: SunTlsRsaPremasterSecret KeyGenerator not available 익셉션이 날때

Jetty Scanner 를 이용한 특정 디렉토리 및 파일 변경사항(delete, change, add) 모니터링하기

maven jetty plugin 옵션 중에 scanIntervalSeconds 라는 옵션을 줘서 파일이 변경됬을 경우 일정시간 마다 서버를 리스타트 하는 기능이 있다.


이것과 비슷하게 지정된 특정 디렉토리에 파일이나 디렉토리가 생성, 삭제, 변경 되는 것을 모니터링 하는 클래스를 맨들어 보았다.


이것을 위해서 Jetty util 패키지에 있는 Scanner 클래스를 사용했다.

maven 사용자는 다음과 같은 dependency 를 추가하면 되고
<dependency>
	<groupId>org.eclipse.jetty</groupId>
	<artifactId>jetty-util</artifactId>
	<version>8.0.1.v20110908</version>
</dependency>


maven 사용안하는 사람은 jetty-util-8.0.1.v20110908.jar 요파일을 클래스 패스에 추가 시켜 주면 된다.

jetty-util-8.0.1.v20110908.jar



FileChangeScanner 클래스는 다음과 같다. DiscreteListener 클래스의 각각의 경우에 대해서 원하는 엑션을 취해주면 된다.
package scanner;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import org.eclipse.jetty.util.Scanner;

public class FileChangeScanner {
	private Scanner scanner;

	public FileChangeScanner(String targetDir){
		List<File> scanFiles = new ArrayList<File>();
		
		searchSubDirs(targetDir, scanFiles);
		
		scanner = new Scanner();
		scanner.setScanInterval(1);          // 1초 간격으로 변경사항 스캔
		scanner.setScanDirs(scanFiles);
		scanner.setReportExistingFilesOnStartup(false);
		
		scanner.addListener(new Scanner.DiscreteListener() {
			public void fileRemoved(String filename) throws Exception {
				System.out.println(filename + " is deleted");
			}
			
			public void fileChanged(String filename) throws Exception {
				System.out.println(filename + " is changed");
			}
			
			public void fileAdded(String filename) throws Exception {
				File f = new File(filename);
				if(f.isDirectory()) scanner.addScanDir(f);
				
				System.out.println(filename + " is added");
			}
		});
	}
	
	public void start(){
		try {
			scanner.start();
		} catch (Exception e) {
			new RuntimeException(e);
		}
	}
	
	/**
	 * 하위 디렉토리들 찾기
	 * @param targetDir
	 * @param dirs
	 * @return
	 */
	private List<File> searchSubDirs(String targetDir, final List<File> dirs){
		File target = new File(targetDir);
		target.listFiles(new FileFilter() {
			public boolean accept(File file) {
				if( file.isDirectory() ) {
					dirs.add(file);
					searchSubDirs(file.toString(), dirs);
				}
				return false;
			}
		});
		
		return dirs;
	}

	public static void main(String[] args) throws Exception{
		// c:\test 하위 폴더 및 파일 변경 감시
		new FileChangeScanner("c:\\test").start();
		
		// 실행하자 마자 프로그램이 종료되기 때문에 프로그램 종료방지를 위해 타이머 생성
		// WAS 환경에서 돌릴때는 타이머 생성할 필요없음
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			public void run() {}
		}, 60*1000, 60*1000 );
	}
}


java.sql.SQLException: Column count doesn't match value count at XXX 가 발생하는 경우

실행하는 SQL 들중 INSERT 문에서 발생하는 익셉션이다.

INSERT INTO TB( COLUMNS... ) VALUES( COL_VALUES... )

요런 SQL 을 실행한다고 했을때 COLUMNS.. 에 있는 컬럼 갯수랑 COL_VALUES... 에 있는 밸류 갯수가 틀릴경우 발생한다.




대체적으로 ,(콤마) 를 .(쩜) 으로 타이핑을 잘못쳐서 에러가 나는 경우가 많음 -_-

고게 아니면 컬럼 갯수와 밸류 갯수를 잘 비교해 보길 바람.

JDK 설치시 이것저것 물어보는 대화창 없이 커맨드창에서 한번에 쭉 설치하기(Winodws)


탐색기에서 더블클릭만 하면 될것을..

뭐 굳이 귀찮게 요렇게 설치할 필요성은 1g 도 없지만 그냥 뭐 이런것도 있구나~~~하는.. 그냥 재미삼아~


만약 다운받은 jdk 설치파일이 e:\jdk-6u26-windows-x64.exe 에 요렇게 있다면

 
커맨드창 실행후 다운로드 받은 경로까지 이동한다. 

cd e:\

e:\jdk-6u26-windows-x64.exe /passive installdir=설치할경로,ex)c:\jdk\jdk1.6.26

요렇게 뽓 입력하고 엔터를 치면 이것저것 물어보면서 확인버튼 누를필요없이 쭉 그냥 설치가 된다;;  

다시 말하지만 이런 뻘짓은 그냥 재미로 해본거다.



 


뭐 그리고 아예 아무 UI 도 안띄우고 그냥 빽그라운드로 설치하고 싶다면

e:\jdk-6u26-windows-x64.exe /quiet installdir=설치할경로,ex)c:\jdk\jdk1.6.26

요렇게 하면 된다. 엔터를 치면 명령이 바로 끝나버리지만 빽그라운드로 jdk 를 설치하고 있는중이다 -_-; 

 

Apache Velocity 변수가 null 일때 공백으로 출력되게 하기

템플릿과 모델 데이터를 결합해서 파싱할때 모델에 해당 변수가 없을때 ${ XXX } 같은게 결과로 변환되어 출력된다.

찾아보니까 $!{ XXX } 요렇게 느낌표를 붙여주면 공백으로 변환된다고  하던데 일일히 바꾸기가 귀찮았다.

일일히 바꾸기 귀찮을땐 InvalidReferenceEventHandler 를 한번 써보자

InvalidReferenceEventHandler 인터페이스를 구현한 클래스를 하나 맨들고 밸로시티 Property 로 그것을 사용하도록 설정해 주면 된다.



먼저 InvalidReferenceEventHandler 인터페이스를 구현한 클래스이다.
package com.tistory.stove99;

import org.apache.velocity.app.event.InvalidReferenceEventHandler;
import org.apache.velocity.context.Context;
import org.apache.velocity.util.introspection.Info;

public class InvalidReferenceHandler implements InvalidReferenceEventHandler{

	@Override
	public Object invalidGetMethod(Context context, String reference,
			Object object, String property, Info info) {
		return "";
	}

	@Override
	public boolean invalidSetMethod(Context context, String leftreference,
			String rightreference, Info info) {
		return false;
	}

	@Override
	public Object invalidMethod(Context context, String reference,
			Object object, String method, Info info) {
		return null;
	}
}

invalidGetMethod 메소드에서 리턴을 "" 요걸로 공백을 리턴해 주면 된다.


이제 클래스를 맨들었으니 요걸 밸로시티에서 쓰도록 설정해 보자.

velocityProperties 에 기존에 설정된 프로퍼티에 아래와 같이 추가하면 된다.
eventhandler.invalidreferences.class = com.tistory.stove99.InvalidReferenceHandler

이제 해보면 아마 잘될꺼임.

java.security.NoSuchAlgorithmException: SunTlsRsaPremasterSecret KeyGenerator not available 익셉션이 날때


뭐 찾아보니 여러가지 경우에 발생하는 익셉션 같은데

나 같은 경우는 이클립스에서 Javamail 로  메일 보내는 클래스를 작성하고 이클립스 상해서 해당 클래스를 실행해 메일보내는 테스트를 할때 발생했다.



찾아보니까 이클립스에서 참조하는 JDK 의 JRE system libraries 에 암호관련 jar 파일이 추가가 안되 있어서 나는 에러라고 한다.




해결하는 방법은 Window > Preperences >  Java > Installed JREs 에 가서

Add 를 클릭해서 JRE를 다시 하나 추가한 다음 기존에 체크되 있던걸 remove 하고 방금 추가한걸 체크해 주면 된다.
prev 1 2 3 4 5 6 next