run Tomcat as a Daemon

07.Web 2012.07.03 16:01


tomcat을 시작 후 shutdown.sh 종료하는 경우는 stop관련 log가 출력이 된다. (catalina.log)

만약 kill (kill -9 말고)로 ps를 죽이게 된다면 어떻게 될까?


답은, 역시 stop관련 log가 출력이 된다.


이유가 뭘까 싶어 좀 찾아봤다. 해답은,


Runtime.getRuntime().addShutdownHook(shutdownHook);


이 코드였다.shutdown hook을 추가하게 되면 tomcat jvm의 종료가 되는 시점에 shutdownHook의 객체(Thread 타입)가 실행되기 때문에 필요한 종료동작 및 logging 후 안전히 프로세스를 종료하게 된다.



여기서 한가지 의문이 더 들었다.


tomcat의 경우 apache commons daemon lib가 동봉되어 있어 daemon형태로 돌리기 위해서는

jsvc를 통해 구동을 하면 된다고 알고 있는데 자체적으로 shutdown hook 메커니즘이 있는데도

별도로 이렇게 하는 이유는 뭘까? 

(물론 kill -9은 jsvc든 shutdownhook이던 전부 operational signal을 catch할 수 없다.)


daemon이란 

-유닉스와 같은 멀티태스킹 운영체제에서 데몬(daemon, 발음: 데이먼/'de?m?n/ 또는 디먼 /'dim?n/[1])은 

사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다.


tomcat의 경우 기본 port(8080)이 아닌 다른 포트, 예를들어 privilege port(under 1024, 예) HTTP 80)를

사용하기 위해서는 root 권한이 필요한데 이런 경우 jsvc를 통해 root가 아닌 user로

대신 daemon으로 등록할 수 있다.



그렇다면, 기본 포트를 사용할 것이고, httpd와 연동을 할 계획이라면 어떻게 해야하나?


요건 다음번에.......


<출처>

http://stackoverflow.com/questions/11147853/value-of-adding-commons-daemon-to-an-app

http://christopherhunt-software.blogspot.kr/2009/07/replacing-jsvc-for-java-daemons.html

http://fnords.wordpress.com/2010/04/22/tomcat-improvements-coming-up-in-10-04/

신고
Posted by Stewie

Maven Default Properties

Note: In Maven 3.0, all pom.* properties are deprecated. Use project.* instead!

Built in properties

${basedir} represents the directory containing pom.xml 
${version} equivalent to ${project.version} or ${pom.version

Pom/Project properties

All elements in the pom.xml, can be referenced with the project. prefix or using pom. as prefix. This list is just an example of some commonly used elements.

${project.build.directory} results in the path to your "target" dir, this is the same as ${pom.project.build.directory} 
${project.build.outputDirectory} results in the path to your "target/classes" dir 
${project.name} or ${pom.name} refers to the name of the project. 
${project.version} or ${pom.version} refers to the version of the project. 
${project.build.finalName} refers to the final name of the file created when the built project is packaged 
${project.artifactId} refers to the artifact id

Local user settings

Similarly, values in the user's settings.xml can be referenced using property names with settings. prefix.

${settings.localRepository} refers to the path of the user's local repository. 
${maven.repo.local} also works for backward compatibility with maven1 ?? 

Environment variables

Environment variables can be referenced using the env prefix

${env.M2_HOME} returns the Maven2 installation path. 
${java.home} specifies the path to the current JRE_HOME environment use with relative paths to get for example:

<jvm>${java.home}..//bin//java.exe</jvm> 

Java system properties

All Java System Properties defined by the JVM.

Custom properties in the POM

User defined properties in the pom.xml. 

<project>
...
  <properties>
    <my.filter.value>hello</my.filter.value>
  </properties>
...
</project>


${my.filter.value} will result in hello if you inserted the above XML fragment in your pom.xml 

Parent Project variables

How can parent project variables be accessed? You can use the prefix: ${project.parent}. A good way to determine possible variables is to have a look directly at the API. I'm currently using Maven 2.2.1, and to access the Parent you can use${project.parent}. This will return an org.apache.maven.project.MavenProject instance. 

To access the parent version: ${parent.version}.

Reflection Properties

The pattern ${someX.someY.someZ} can simply sometimes mean getSomeX().getSomeY().getSomeZ(). Thus, properties such as${project.build.directory} is translated to getProject().getBuild().getDirectory()

<출처>

http://www.captaindebug.com/2011/01/maven-default-properties.html

신고

'03.Build Process' 카테고리의 다른 글

Maven Default Properties  (0) 2012.06.29
Hudson Remote Run API  (0) 2012.05.17
Maven Dependency Version Range  (0) 2012.05.11
Hudosn을 통한 Maven depoly => Nexus  (0) 2012.02.17
package emma:emma 의 goal 은 Test를 2번한다?  (0) 2012.01.02
Jenkins plugin Install (Emma, N'SIQ)  (0) 2011.12.26
Posted by Stewie

Spring Batch Admin Webapps 실행 법


-Eclipse 3.7

-Maven


1. Web PJT 생성 (maven default web)

2. Dependency Add (이거 외 spring batch 랑 spring도 같이 넣어줌)

		<dependency>

			<groupId>org.springframework.batch</groupId>

			<artifactId>spring-batch-admin-manager</artifactId>

			<version>1.2.0.BUILD-SNAPSHOT</version>

		</dependency>

3. classpath에 batch-default.xml 생성

batch.jdbc.driver=com.mysql.jdbc.Driver
batch.jdbc.url=jdbc:mysql://host:3306/name
batch.jdbc.user=${user}
batch.jdbc.password=${password}
batch.schema.script=classpath:/org/springframework/batch/core/schema-mysql.sql
batch.drop.script=classpath:/org/springframework/batch/core/schema-drop-mysql.sql
batch.business.schema.script=classpath:/delete-table.sql
batch.data.source.init=true


- classpath에 /delete-table.sql 도 역시 생성


4. packing 혹은 eclise에서 server로 기동 


신고
Posted by Stewie

외부에서 remote로 Hudson job을 실행하려면


1. Job Configuration -> Build Trigger

- Remote 항목 check 후 token-name 지정

- uri 획득



2. wget --auth-no-challenge --http-user=[USER] --http-password=[PASSWORD] "http://[IP]:[PORT]/view/[FOLDER]/job/[PJT_NAME]/build?token=[TOKEN-NAME]"

신고

'03.Build Process' 카테고리의 다른 글

Maven Default Properties  (0) 2012.06.29
Hudson Remote Run API  (0) 2012.05.17
Maven Dependency Version Range  (0) 2012.05.11
Hudosn을 통한 Maven depoly => Nexus  (0) 2012.02.17
package emma:emma 의 goal 은 Test를 2번한다?  (0) 2012.01.02
Jenkins plugin Install (Emma, N'SIQ)  (0) 2011.12.26
Posted by Stewie

JKMount /* ajp13

으로 모든 request에 대해서 mod_jk 설정을 하였을 때

특정 request에 대해서만 DocumentRoot로 돌리고 싶을 때가 있다. (ELB의 healthcheck 등)


다음 option이 도움이 된다.

SetEnvIf Request_URI "/*.html" no-jk

신고
Posted by Stewie



신고

'03.Build Process' 카테고리의 다른 글

Maven Default Properties  (0) 2012.06.29
Hudson Remote Run API  (0) 2012.05.17
Maven Dependency Version Range  (0) 2012.05.11
Hudosn을 통한 Maven depoly => Nexus  (0) 2012.02.17
package emma:emma 의 goal 은 Test를 2번한다?  (0) 2012.01.02
Jenkins plugin Install (Emma, N'SIQ)  (0) 2011.12.26
Posted by Stewie

JMX Url

01.Java 2012.04.02 10:35

기본적으로 JMX에서 사용하는 url 형태는 다음과 같다.

service:jmx:rmi:///jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi


하지만 실질적으로 JMX에서 이용되는 port는 2가지인데 다음과 같다.

service:jmx:rmi://<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi


service되는 서버에 방화벽 설정이 필요하다면 다음과 같이 두 port를 모두 열어주어야 한다.

첫번째처럼 설정한다면 JMX_RMI_SERVER_PORT는 가변적으로 설정이 되어 block당할 수 있다.


출처 : http://stackoverflow.com/questions/2768087/explain-jmx-url


신고

'01.Java' 카테고리의 다른 글

Arrays.asList의 UnsupportedOperationException  (1) 2012.09.05
Apache Flume-NG structure  (0) 2012.07.18
JMX Url  (0) 2012.04.02
run Hadoop Mapreduce Job Remotely(Cluster)  (0) 2012.03.13
Exception Handling vs. Error Logging  (0) 2012.02.14
JUnit Test. 그리고 Stub, Mock  (0) 2011.12.27
Posted by Stewie
4시간이나 걸렸다. -_- 이거 하나를 하기 위해 얼마나 검색능력과 영어 속독력이 필요한지 다시 한번 실감했다.

<배경>
client에서 물리적으로 다른 서버에 위치한 Hadoop Cluster에 Job 실행 명령을 내리고 싶다.

<초기 의문점>
-Job을 이루는 Mapper/Reducer 등은 어디에 위치해야 하는가? (Hadoop Cluster에? Client에? 아니면 두군데 동시?)
-Jar형태로 배포가 되어야 하는가? Eclipse에서 실행해보기 위해서는 어떻게 해야하는가?


 <출처 :  http://helloworld.naver.com/helloworld/1250 >

위 그림과 같이 간단한 Process의 흐름을 알 수있다. 내가 처음에 가장 의문이 들었던 점은 과연 Tasktracker의 JVM이 어떻게 Client측의 Map Reduce를 인식할 수 있느냐 이다.

다음은 Sample 코드 이다.


public class WordCountDriver {

	public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

		Configuration conf = new Configuration();
		conf.set("fs.default.name", "hdfs://sample:8020");
		conf.set("mapred.job.tracker", "hdfs://sample:8021");

		Job job = new Job(conf, "wordcount");
		job.setWorkingDirectory(new Path("/log"));
		job.setMapperClass(WordCountMapper.class);
		job.setReducerClass(WordCountReducer.class);
		job.setJarByClass(WordCountDriver.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);

		job.setInputFormatClass(TextInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);

		FileInputFormat.addInputPath(job, new Path("/log/input.log"));
		FileOutputFormat.setOutputPath(job, new Path("/log/output.log"));

		System.out.println(job.waitForCompletion(true));
	}

}


public class WordCountMapper extends Mapper<longwritable, text,="" intwritable=""> {
	private Text word = new Text();
	private final static IntWritable one = new IntWritable(1);

	protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
		String line = value.toString();
		StringTokenizer tokenizer = new StringTokenizer(line);
		while (tokenizer.hasMoreTokens()) {
			word.set(tokenizer.nextToken());
			context.write(word, one);
		}
	}
}


public class WordCountReducer extends Reducer<text, intwritable,="" text,="" intwritable=""> {
	protected void reduce(Text key, Iterable<intwritable> values, Context context) throws IOException,
		InterruptedException {
		int sum = 0;
		for (IntWritable value : values) {
			sum += value.get();
		}
		context.write(key, new IntWritable(sum));
	}
}




결론 부터 말하자면 Job 이라는 Class의  setJarByClass 이 메서드가 Key Point다. 메서드를 통해 명시한 class파일이 포함된 jar가 Jobtracker로 전달이 되고 그것을 통해 Job이 excute되는 것이기 때문에 그 jar안에 필요한 Mapper나 Reducer가 모두 존재 해야 한다.

만약 Eclipse에서 실행하고자 한다면 Project를 Jar로 Packaging 한 뒤에 그것을 스스로 참조(self reference)하여 그 class를 활용하는 형태로 실행을 해야 

경고: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String). 

다음과 같은 문구가 뜨지 않는다. 

테스트한 Hadoop version은 0.20.203.0이며 최근 release된 1 버전에서도 아마 같지 않을 까 생각한다. 

PS. java source css좀 바꿔야겠다 -.,- 

<참고>
http://stackoverflow.com/questions/3912267/hadoop-query-regarding-setjarbyclass-method-of-job-class 
http://search-hadoop.com/m/R7Uxr1dp4h&subj=setJarByClass+question 
http://helloworld.naver.com/helloworld/1250 
 
신고

'01.Java' 카테고리의 다른 글

Apache Flume-NG structure  (0) 2012.07.18
JMX Url  (0) 2012.04.02
run Hadoop Mapreduce Job Remotely(Cluster)  (0) 2012.03.13
Exception Handling vs. Error Logging  (0) 2012.02.14
JUnit Test. 그리고 Stub, Mock  (0) 2011.12.27
java.io.FilenameFilter 활용  (0) 2011.08.09
Posted by Stewie

<상황>
test.war을  $TOMCAT_HOME/webapps/에 카피하면 보통

http://localhost:8080/test로 접속을 해야한다.

하지만 http://localhost:8080/ 으로 접속하고 싶다.

1. $TOMCAT_HOME/webapps 안에 test.war말고 다 삭제
2. $TOMCAT_HOME/conf/server.xml 수정

 

    
    ............
    


이렇게 하면 webapps에 ROOT 및 test 두개의 디렉토리가 생겨 둘다 접속이 가능하다.
test.war를 다른곳으로 뺀 뒤 docBase를 변경하면 ROOT만 생긴다.
 
신고
Posted by Stewie

Step

1. Hudson 서버 내 Maven setting.xml 설정
-Nexus 서버 설정

  
    nexus
    admin
    admin123
  



2. Maven Build Project deploy 추가
- resources -> compile -> test -> package -> install -> deploy 



3. pom.xml에 설정 추가

	
		nexus
		releases
		http://NEXUS_IP:PORT/nexus/content/repositories/releases
	
	
		nexus
		snapshots
		http://NEXUS_IP:PORT/nexus/content/repositories/snapshots
	



끗. 어렵지 않아요. 
신고

'03.Build Process' 카테고리의 다른 글

Hudson Remote Run API  (0) 2012.05.17
Maven Dependency Version Range  (0) 2012.05.11
Hudosn을 통한 Maven depoly => Nexus  (0) 2012.02.17
package emma:emma 의 goal 은 Test를 2번한다?  (0) 2012.01.02
Jenkins plugin Install (Emma, N'SIQ)  (0) 2011.12.26
Jenkins  (0) 2011.12.21
Posted by Stewie


티스토리 툴바