프로젝트의 빌드버전 확인 - QA관점의 몰래 빌드 금지

SVN을 이용하여 hudson을 빌드시 SVN Head를 포함시켜 중간에 개발자가 변경하여 빌드하는 것을 방지하기 위해 만든 스크립트.

checkversion.jar 파일을 만들어 Manifest에 build date와 최종 svn version을 기록합니다.
아래 쪽의 JSP를 만들어 디플로이 시킨 후 jar 파일의 manifest를 이용하여 버전을 확인합니다.

<target name="jar-checkversion">

		<svn javahl="true"> 
		    <info target="${svn.url}/" /> 
		</svn> 
		<property name="latestRevisionNo" value="${svn.info.lastRev}"/> 
		<echo>******** URL : ${svn.url}/projects/${project.name}/${target}/${REPO_BRANCH}</echo>
		<echo>******** REVISION HEAD : ${latestRevisionNo}</echo>
		
		<jar destfile="checkversion.jar">
			<manifest>
				<attribute name="Revision-Number" value="${latestRevisionNo}"/>

				<attribute name="Build-Date" value="${DSTAMP} ${TSTAMP}"/>
			</manifest>
		</jar>
		<echo>SVN Revision : ${latestRevisionNo}</echo>
		<copy file="checkversion.jar" tofile="${build.dir}/src/${target}/lib/checkversion.jar"
			overwrite="true" failonerror="false"/>
	</target>



<%@ page import="java.util.*, java.io.*, java.util.jar.*" %>

<%!
    public String [] checkVersion(String jarFileUrl) throws Exception {
        JarFile jarFile = new JarFile(new File(jarFileUrl)); 
        Manifest manifest = jarFile.getManifest();
        Attributes attributes = (Attributes) manifest.getMainAttributes();
        String buildDate = attributes.getValue("Build-Date"); 
        String revision = attributes.getValue("Revision-Number"); 

	return new String [] {buildDate, revision};
    }
%>	

<%
    String portalJar = "/jboss/apps/admin/portal.war/WEB-INF/lib/checkversion.jar";
    String [] data = checkVersion(portalJar);

    
    out.println("Admin Portal Version<br>");
    out.println("===============================<br>");
    out.println("Build Date : " + data[0] + "<br>");
    out.println("Revision : " + data[1] + "<br><p>");
%>
크리에이티브 커먼즈 라이센스
Creative Commons License
2012/01/18 08:41 2012/01/18 08:41


<project name="Import Database" basedir="." default="import">


  <property name="sql.driver" value="com.mysql.jdbc.Driver"/>
  <property name="sql.url" value="jdbc:mysql://url:port/dbname"/>
  <property name="sql.user" value="user"/>
  <property name="sql.pass" value="pass"/>


  <target name="import">
    <sql driver="${sql.driver}" 
            src="${sql.file}" 
            url="${sql.url}" 
            userid="${sql.user}" 
            password="${sql.pass}" 
            classpath="mysql-connector-java-5.1.16-bin.jar">
    </sql>
  </target>


</project>
크리에이티브 커먼즈 라이센스
Creative Commons License
2012/01/05 10:21 2012/01/05 10:21



#!/bin/bash CHARSET=utf8 DATABASE="db_name" USER="user" PASSWORD="password" HOST="myrds.c4moohzbz3zn.us-east-1.rds.amazonaws.com" for i in `mysql --default-character-set $CHARSET -u$USER -p$PASSWORD -h $HOST  $DATABASE -e "show tables;" | sed -n 2,$\p` do mysql --default-character-set $CHARSET -u$USER -p$PASSWORD -h $HOST     $DATABASE -e "drop table $i" echo "$i table delete." done
크리에이티브 커먼즈 라이센스
Creative Commons License
2012/01/05 10:17 2012/01/05 10:17

아마존 RDS DB 파라미터 그룹은 기본적으로 생성된 것은 수정하지 못하며,  RDS CLI를 통해서 생성된 것만 수정이 가능합니다. 아래는 그 내용입니다.
If you would make Amazon RDS on AWS, the default charset parameters will be latin1. In this case, you can NOT modify DB parameter group for your character set.(http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/index.html?USER_WorkingWithParamGroups.html) .
For solving this problem, you have to work using RDS CLI tool getting from amazon (http://aws.amazon.com/developertools/2928?_encoding=UTF8&jiveRedirect=1)
Here is the example you can create RDS DB paramter group and modify paramters :


Amazon RDS MySQL의 DB parameter는 기본 latin1으로 되어 있어 콘솔이 아닌 CLI(Command Line Interface)를 사용하여 파라미터 그룹을 생성한 후 RDS를 생성하여야 합니다.


1. Create db-parameter-group
rds-create-db-parameter-group rds-utf8 -f mysql5.5 -d "default parameter with utf8" -I <Your Access Key> -S <Your Secret Key> --region eu-west-1




2. Modify db-parameter-group
rds-modify-db-parameter-group --debug --db-parameter-group-name rds-utf8 -I <Your Access Key> -S <Your Secret Key> --parameters "name=character_set_server, value=utf8, method=immediate" --parameters "name=character_set_filesystem, value=utf8, method=immediate" --parameters "name=character_set_client, value=utf8, method=immediate" --parameters "name=character_set_connection, value=utf8, method=immediate" --parameters "name=character_set_database, value=utf8, method=immediate" --parameters "name=character_set_results, value=utf8, method=immediate" --parameters "name=collation_server, value=utf8_general_ci, method=immediate" --parameters "name=collation_connection, value=utf8_general_ci, method=immediate"  --parameters "name=long_query_time,value=1,method=immediate" --parameters "name=slow_query_log, value=ON, method=immediate" --parameters "name=general_log, value=ON, method=immediate"  --region eu-west-1
크리에이티브 커먼즈 라이센스
Creative Commons License
2011/12/19 18:28 2011/12/19 18:28

Infinispan 5.0으로 테스트한 hot-rod, embeded 방식의 이클립스 프로젝트입니다.

Infinispan은 JBoss data grid를 목표로 만들고 있는 프로젝트이며, 이전에는 jboss cache라는 이름의 프로젝트로 jgroups와 결합하여 JBoss내의 클러스터링을 담당하고 있습니다.


다운로드 받기 :

크리에이티브 커먼즈 라이센스
Creative Commons License
2011/10/06 09:38 2011/10/06 09:38

API에서 고정 길이의 큐에 대한 지원은 없는 것으로 나와 있습니다.

현재 구현해야 하는 것 중의 하나가 현재 시간으로부터 30초 이전까지의 데이터만을 구현해야 하며, sampling interval은 1초 라고 했을 때 queue를 30으로 한정시키면 항상 큐안에 30초 데이터만 있도록 구현해야만 했습니다.

즉 FIFO 방식으로 특정 범위안의 데이터만을 처리하는데 아래와 같은 pseudo code를 이용하면 가능합니다.


package javapattern;

import java.util.LinkedHashMap;
import java.util.Map;

public class FixedQueueTest {
	public static void main(String[] args) {
		Map<Integer, String> queue = new LinkedHashMap<Integer, String>() {
			@Override
			protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest) {
				return this.size() > 5;
			}
		};
		
		for( int i = 0 ; i < 10 ; i++) {
			queue.put(i, "Hello" + i);
		}
		
		System.out.println(queue);
	}
	
}



아래 코드는 위의 pseudo를 이용하여 만든 Utility

import java.util.LinkedHashMap; import java.util.Map; public class FixedQueue<T, V> extends LinkedHashMap<T, V> { private static final long serialVersionUID = 621231404269530192L; private int capacity; public FixedQueue(int capacity) { this.capacity = capacity; } @Override protected boolean removeEldestEntry(Map.Entry<T, V> eldest) { return this.size() > this.capacity; } }
크리에이티브 커먼즈 라이센스
Creative Commons License
2011/07/14 14:10 2011/07/14 14:10

공용 Maven Repository에 라이선스 등의 이슈로 인하여 Oracle JDBC Driver는 다운받은 후 로컬 리포지토리에 등록을 해줘야 합니다.
C:\workspace\sdscloud-sys-agent\lib>mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dpackaging=jar -Dfile=ojdbc6.jar -Dversion=11g
C:\workspace\sdscloud-sys-agent\lib>set JAVA_HOME=C:\Java\jdk1.6.0_24
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-pom ---
[INFO] Installing C:\workspace\sdscloud-sys-agent\lib\ojdbc6.jar to C:\Documents and Settings\SDS\.m2\repository\com\oracle\ojdbc6\11g\ojdbc6-11g
.jar
[INFO] Installing C:\DOCUME~1\SDS\LOCALS~1\Temp\mvninstall8397476623953445314.pom to C:\Documents and Settings\SDS\.m2\repository\com\oracle\ojdb
c6\11g\ojdbc6-11g.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.750s
[INFO] Finished at: Tue Jun 28 14:02:14 KST 2011
[INFO] Final Memory: 2M/15M
[INFO] ------------------------------------------------------------------------
크리에이티브 커먼즈 라이센스
Creative Commons License
2011/06/28 14:07 2011/06/28 14:07

MyBatis 3.0의 예제를 보면 파라미터를 하나 던지는 예제만 줄줄 있습니다.
그 타입이 primitive 이던, POJO 형태든지 말이죠.

여러 개의 파라미터를 던지려면 @Param 어노테이션을 사용하고, map으로 xml 파일에 정의해 주면 됩니다.

1. 먼저 Mapper Interface에 메소드를 정의합니다.
public Map selectMachineAgentMap(@Param("machineId") int machineId, @Param("agentId") int agentId);


2. mapper.xml 파일에 paramterType을 map으로 잡습니다.
<select id="selectMachineAgentMap" parameterType="map" resultType="map">
 SELECT MACHINE_ID, AGENT_ID
 FROM M_MACHINE_AGENT_MAP_TBL
 WHERE MACHINE_ID = #{machineId} AND AGENT_ID = #{agentId}
  </select>


위와 같이 하면 MyBatis는 맵 객체를 생성하고 거기에 @Param에 해당하는 이름으로 전달받은 인자를 저장합니다. 이후 프로세서에서는 #{}의 이름에 해당하는 key를 이용하여 데이터를 추출하고 컬럼의 메타데이터에 해당하는 타입으로 캐스팅하여 쿼리를 날리게 됩니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2011/06/24 15:43 2011/06/24 15:43

System 상태 및 모니터링 대상이 파일/패키지 소프트웨어일 경우 어떻게 접근할 것인가에 대한 컨셉을 XML로 표현했습니다. 실제 구현체는 너무 복잡해서 패스.

<sys-mon> <!-- 에이전트에 대한 이름을 설정한다. 에이전트 이름은 컨트롤러 측과 데이터베이스의 유일한 식별정보이다. 내부적으로는 머신의 식별을 MAC Address, 에이전트의 식별을 에이전트의 이름을 이용한다. 따라서 에이전트의 이름은 전체 클라우드 플랫폼 영역에서 유일하여야만 하는 제약 조건을 가진다. 만일 동일한 이름이 있을 경우, 시스템 에이전트가 올바르게 동작하지 않을 수 있다. --> <agent-info> <name>JW_WIN</name> </agent-info> <!-- 컨트롤러의 측의 IP와 PORT를 명시하는 부분이다. 컨트롤러와의 접속 해제시 재접속을 하는 방법으로 2차 URL을 줄 수 있는 환경이 마련되어 있다. 즉 IP:PORT,IP:PORT의 형태로 컨트롤러의 주소를 나열하면, 문제 발생시 콤마(,)이후의 접속 정보로 재접속을 시도하게 된다. 서버 컨트롤러는 클러스터 구성이 되어 있게 되므로 다음과 같이 설정하면 에이전트의 페일오버가 진행된다. 예) 192.168.0.1:8080,192.168.0.2:8080 --> <controller-info> <host>127.0.0.1:8080,127.0.0.1:8180,127.0.0.1:8280</host> </controller-info> <!-- 서비스 제공자의 모니터링 수집 정보가 데이터베이스에 존재할 경우 해당 데이터베이스에 대한 연결풀을 설정한다. 일반적인 JDBC에서 사용하는 데이터 정보를 기술하게 되며, commons-pool을 이용하여 데이터베이스 연결을 미리 name 속성에 해당하는 이름으로 생성하여 놓는다. 여러개의 데이터 소스를 설정한다면 root 엘리먼트의 <data-source></data-source> 설정을 복수로 한다. --> <data-source name="jdbc/platform"> <driver-class>com.mysql.jdbc.Driver</driver-class> <connect-uri>jdbc:mysql://localhost:3306/cloud</connect-uri> <user>cloud</user> <password>cloud</password> </data-source> <data-source name="jdbc/informatica"> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <connect-uri>jdbc:oracle:thin:@localhost:1521:CLOUD</connect-uri> <user>INFOM</user> <password>INFOM</password> </data-source> <!-- System Resource Monitoring Cycle(Baseline : milliseconds) 시스템 리소스에 대한 모니터링 주기를 밀리초 단위로 표시한다. 시스템 리소스 데이터의 수집주기는 5분이지만 데이터의 오류를 막기 위하여 아래에 설정된 repeat-interval을 통해 일정 시간 간격 사이의 데이터를 수집한다. 즉, 5분에 한 번씩 데이터를 수집한다고 가정했을 때, 데이터 수집시점에는 적은 리소스를 사용할 수 있다. 하지만 2분 30초 시점에 리소스에 문제가 발생을 했다면 그 정보는 추적이 불가능한 상태로 남게 된다. 이를 방지하게 하기 위하여 5분간의 평균값, 최대값, 최소값을 얻기 위한 방법으로 리소스 데이터 수집 주기를 설정한다. --> <system-monitoring> <repeat-interval>30000</repeat-interval> </system-monitoring> <!-- 가용성 체크를 담당하는 설정이 아래와 같다. availability 태그의 name 속성은 클라우드 플랫폼 내에서 유일하도록 설정한다. --> <availability name="MSTR_AVAILABILITY" repeat-interval="100000"> <!-- 메소드는 현재 HTTP와 SHELL 형식이 지원된다. 이 두 값중의 하나를 반드시 사용해야 한다. 메소드가 HTTP인 경우 command 항목에 하나의 파라미터를 가지며, http 호출이어야 한다. <command> <param>http://xxx.xxx.xxx.xxx:8080/sdscloud/index.jsp</param> </command> 메소드가 SHELL일 경우 MS-Windows의 경우 아래의 같이 cmd /c 옵션을 각 파라미터 값을 사용한다. <command> <param>cmd</param> <param>/c</param> <param>tasklist /FI "IMAGENAME eq eclipse*"</param> </command> 메소드가 SHELL이며 Unix계열인 경우 아래와 같은 유닉스 쉘을 사용하도록 한다. <command> <param>sh</param> <param>-c</param> <param>ps -ef | grep java</param> </command> --> <method>HTTP</method> <!-- HTTP 메소드일 경우 command param의 첫번째 항목에 체크해야 할 URL을 명시하도록 한다. 아래의 param URL을 repeat-interval에 의하여 주기적으로 가용성 체크를 시도한다. --> <command> <param>http://xxx.xxx.xxx.xxx:8080/cloud/index.jsp</param> </command> <!-- 호출의 결과값으로 반드시 포함되어 있어야 하는 문자열 값을 명시한다. --> <validation-string></validation-string> <!-- 메소드 호출시 응답 대기 시간을 밀리초 단위로 설정한다. 만약 3초 이내에 응답이 안 올 경우 가용성에 문제가 있는 것으로 인식한다. --> <timeout>3000</timeout> <!-- 어떤 서비스 제공자의 서비스를 모니터링하고 있는지 기술한다. 안타깝게도 웹 플랫폼에서 제공하는 서비스 제공자의 아이디 값을 자동으로 얻어올 수 없기 때문에 service-id는 데이터베이스의 M_SVC_TBL에서 조회한 후 아래에 기술해 주어야만 한다. 이후 server-name, server-version, server-install-path, metadata-name등은 모니터링하는 서버의 항목을 기술하도록 한다. --> <provider service-id="2"     server-name="JBoss Web Server"   server-version="5.0"   server-install-path=""   server-vendor="Red Hat"   metadata-name="MSTR_AVAILABILITY"   is-local="false">   </provider>   </availability>     <availability  name="APACHE_AVAILABILITY" repeat-interval="100000">   <method>SHELL</method>   <!--  for windows --> <command> <param>cmd</param> <param>/c</param> <param>tasklist /FI "IMAGENAME eq eclipse*"</param> </command> <!--  for linux --> <!-- <command> <param>sh</param> <param>-c</param> <param>ps -ef | grep java</param> </command> --> <validation-string></validation-string> <timeout>3000</timeout>   <provider service-id="2"     server-name="MSTR_APACHE"   server-version="5.0"   server-install-path=""   server-vendor="Apache Foundation"   metadata-name="APACHE_WEB_AVAIL"   is-local="false">   </provider> </availability> <!-- collector는 서비스 제공자가 남기는 실제 모니터링 데이터를 추출해오는 데 사용된다. collector는 복수개의 provider 정보를 가질 수 있으며, 대부분의 서비스 제공자 로그가 파일 또는 데이터베이스에 남기 때문에 provider 태그는 파일과 DB 둘 중의 하나로 결정된다. --> <collector name="PLATFORM_COLLECTOR" repeat-interval="180000"> <!-- 서비스 제공자의 모니터링 데이터를 데이터베이스에서 추출해올 경우 적용 클래스는 "com.athena.sysmon.job.CommonDatabaseJob" 클래스이다. 이 때 데이터베이스에 대한 접속이 미리 이루어져 있어야 하므로 위에서 기술한 data-source-name을 설정하도록 한다. 또한 이때의 extrace-type은 DB로 설정하도록 한다. use-datalist속성은 추출된 데이터를 테이블 형태로 볼 것인지 여부를 결정하는 데 사용한다. true로 설정되어 있다면 추출된 실제 데이터를 그대로 웹 화면에서 테이블 형태로 볼 수 있다. --> <provider class="com.athena.sysmon.job.CommonDatabaseJob"   service-id="2"     data-source-name="jdbc/platform"   server-name="PLATFORM"   server-version="1.0"   server-install-path=""   server-vendor="SAMSUNG SDS"   metadata-name="TENANT_USER_CNT"   extract-type="DB"   use-datalist="false"   is-local="false"   use-tenant-list="true">   <!--   데이터베이스 추출에 필요한 쿼리를 설정한다.   --> <query> SELECT TENANT_ID, USER_CNT FROM V_SVC_TENANT_VIEW WHERE SVC_ID = 2 </query> <!-- 데이터베이스에서 추출된 컬럼 데이터중 미터링으로 사용될 데이터에 대한 설정을 billable 태그로 복수개 설정하는 것이 가능하다. --> <billable name="USER_CNT" type="int" method="sum" />   </provider>     <provider class="com.athena.sysmon.job.CommonDatabaseJob"   service-id="2"     data-source-name="jdbc/platform"   server-name="PLATFORM"   server-version="1.0"   server-install-path=""   server-vendor="SAMSUNG SDS"   metadata-name="LOGIN_CNT"   extract-type="DB"   use-datalist="false"   is-local="false"   use-tenant-list="true"> <query> SELECT TENANT_ID, TOTAL_ACCESS_CNT FROM V_TENANT_LOGIN_CNT_VIEW </query> <billable name="TOTAL_ACCESS_CNT" type="int" method="sum" />   </provider>     <!-- 서비스별 계약 건수 -->   <provider class="com.athena.sysmon.job.CommonDatabaseJob"   service-id="2"     data-source-name="jdbc/platform"   server-name="PLATFORM"   server-version="1.0"   server-install-path=""   server-vendor="SAMSUNG SDS"   metadata-name="SVC_COUNT"   extract-type="DB"   use-datalist="false"   is-local="false"   use-tenant-list="false"> <query> SELECT COUNT(SVC_ID) AS SVC_COUNT from V_RUN_USVC_CONTRACT_TBL WHERE SVC_ID = 2 </query> <billable name="SVC_COUNT" type="int" method="sum" />   </provider> </collector>   <collector name="INFO_COLLECTOR" repeat-interval="180000">   <!--  Service ID 2 is BI Service -->   <provider class="com.athena.sysmon.job.CommonDatabaseJob"   service-id="2"     data-source-name="jdbc/informatica"   server-name="INFORMATICA"   server-version="1.0"   server-install-path=""   server-vendor="INFORMATICA"   metadata-name="C_INFOM_SESSION1"   extract-type="DB"   use-datalist="true"   is-local="false"> <query base-time-field="END_TIME"> SELECT COMP_ID TENANT_ID,    SUBJECT_NAME,    SESSION_NAME,    SUCCESSFUL_ROWS,    FAILED_ROWS,    LAST_ERROR,    LAST_ERROR_CODE,    START_TIME,    END_TIME,    'RED HAT' TENANT FROM    A_SESSION_LOG WHERE #range_expression# ORDER BY END_TIME </query> <billable name="SUCCESSFUL_ROWS" type="int" method="sum" /> <billable name="FAILED_ROWS" type="int" method="avg" />   </provider>     <!--   서비스 제공자 모니터링 대상이 디스크에 기록되는 파일일 경우   "com.athena.sysmon.job.CommonFileJob" 클래스를 설정하여 정보를 추출한다.   이 때 extract-type은 "FILE"로 기술해줘야 하며, 이 때 기술된 data-source-name은   물리적인 파일의 위치를 기술해줘야 한다.   또한 파일의 경우 각 필드를 구분할 수 있는 구분자 값을  delimeter속성에 기본적으로   입력해주어야 한다.       -->   <provider class="com.athena.sysmon.job.CommonFileJob"   service-id="2"     data-source-name="C:\SamsungPoc\httpd-2.2\logs\access_log"   server-name="Apache"   server-version="2.2"   server-install-path="C:\SamsungPoc\httpd-2.2"   server-vendor="Apache"   metadata-name="Apache Access Log"   extract-type="FILE"   is-local="false"   line-unit="3">   <!--   field-map을 구분자에 의해서 잘려진 각 데이터가 표시하는 정보를 나타낸다.   아래의 필드값을 컨트롤러의 각 항목의 메타데이터로 표시되어지며,   tail 이벤트에 의해 추출된 데이터 값이 파싱되어 컨트롤러 측으로 전송된다.   추출된 데이터가 컨트롤러로 전송될 필요가 없다면 ignore 속성을 true로 한다.   ignore 속성이 true이면 파싱된 필드는 서버로 전송되지 않는다.   -->   <regular-expresssion>   <![CDATA[^([\d.]+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(.+?)" (\d{3}) (\d+)]]>   </regular-expresssion> <field-map> <field name="IP_ADDRESS" type="String"/> <field name="IDENT" type="String" ignore="true"/> <field name="WHAT" type="String" ignore="true"/> <field name="REQUEST_TIME" type="String"/> <field name="LOCALE" type="String"/> <field name="METHOD" type="String"/> <field name="URL" type="String"/> <field name="HTTP_VERSION" type="String" ignore="true"/> <field name="RESPONSE_CODE" type="String"/> <field name="RESPOSNE_BYTES" type="int"/> </field-map>   </provider>   </collector> </sys-mon>
크리에이티브 커먼즈 라이센스
Creative Commons License
2011/06/23 17:24 2011/06/23 17:24

단순 메시지 전송입니다. Queue를 미리 RabiitMQ에 생성해놓을 필요가 없습니다. 자동으로 Runtime에 바인딩됩니다.


import java.io.IOException; import java.util.Random; import java.util.UUID; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; public class ProxyLogSender { private String QUEUE_NAME = "Compute"; private final static String DELEMETER = "|"; String txId; String [] users = {"YooSun", "DoYoul", "MiHyun", "JaeSang", "SeungJin"}; String [] targets = {"SWIFT", "NOVA"}; long elapsedTime; String [] requestApis = {"list", "create", "create", "delete", "get"}; boolean responseCode; ConnectionFactory factory; Connection connection; Channel channel; public ProxyLogSender() { factory = new ConnectionFactory(); factory.setHost("70.5.30.245"); try { connection = factory.newConnection(); channel = connection.createChannel(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void send() throws IOException { String target = targets[Math.abs(((new Random().nextInt())) % targets.length)]; String action = ""; if( target.equals("SWIFT")){ QUEUE_NAME = "Storage"; action = "Bucket"; } else if( target.equals("NOVA")){ QUEUE_NAME = "Compute"; action = "Instance"; } channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = makeMessage(target, action); channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); } public String makeMessage(String target, String action) { StringBuilder sb = new StringBuilder(); txId = UUID.randomUUID().toString(); String userId = users[Math.abs(((new Random().nextInt())) % users.length)]; elapsedTime = Math.abs(new Random().nextInt()) % 1000; String requestApi = requestApis[Math.abs(((new Random().nextInt())) % requestApis.length)]; responseCode = new Random().nextBoolean(); sb.append(txId).append(DELEMETER); sb.append(userId).append(DELEMETER); sb.append(target).append(DELEMETER); sb.append(elapsedTime).append(DELEMETER); sb.append(requestApi).append(action).append(DELEMETER); sb.append(responseCode); return sb.toString(); } public void close() { try { channel.close(); connection.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] argv) throws Exception { ProxyLogSender compute = new ProxyLogSender(); while(true) { compute.send(); Thread.sleep(1000 * 60 * 2);  // 2 minutes break; } } }
크리에이티브 커먼즈 라이센스
Creative Commons License
2011/06/08 10:48 2011/06/08 10:48