2010. 5. 17. 15:45

 

 

jboss 툴 + eclipse#

https://www.jboss.org/tools/

 

jboss 주요 키워드#

  • JMX
  • MBean
  • JTA
  • EJB
  • JMS
  • JAAS
  • CMP
  •  

 

클래스 로딩에 대한 상세 로깅하기#

종종 라이브러리가 분명히 존재하는데도, 라이브러리를 찾을 수없다고 하면서 jboss에서 ear,jar,war를 deploy하지 못하는 경우가 생긴다.

이를 위해 classloader 디버깅을 해주면 좋은데, 클래스 로더의 동작에 대한 로깅을 남기는 법이다.

  1. <appender name="UCL" class="org.apache.log4j.FileAppender">
        <param name="File" value="${jboss.server.home.dir}/log/ucl.log"/>
        <param name="Append" value="false"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[%r,%c{1},%t] %m%n"/>
        </layout>
    </appender>
    <category name="org.jboss.mx.loading" additivity="false">
        <priority value="TRACE" class="org.jboss.logging.XLevel"/>
        <appender-ref ref="UCL"/>
    </category>

요렇게 해 두면, 클래스 로더에 대한 로그가 ucl.log 라는 파일에 쌓인다. 필요 이상의 로그가 쌓이기 때문에 평소에는 주석처리 해 두었다가, 디버깅이 필요할때만 켜서 사용하자.

tomcat(jboss-web) 한글 설정하기#

jboss-web(내부적으로는 tomcat)은 기본값으로 한글 처리를 잘 해주지 못한다.

  1. get으로 전달되는 메시지의 한글이 깨짐
  2. post로 전달되는 메시지의 한글이 깨짐
  3. 결과로 전달되는 response 메시지의 한글이 깨짐

위의 세가지를 설정해주기 위해서는 몇가지 수정을 해 주어야한다.

 

server.xml 수정(get으로 전달되는 메시지의 한글 깨짐 해결)#

${jboss-deploy}/jboss-web/server.xml 파일에서 다음과 같은 부분을 수정한다.

  1. <Connector port="8080" ...... URIEncoding="euc-kr"/>

URIEncoding 부분을 추가한다. 위 부분을 UTF-8로 해도 될것 같긴 한데, 브라우저에서 메시지를 거의 euc-kr로 보내기 때문에 위와 같이 한다.

 ==> 현재 URL의 2바이트 문자를 보내는 인코딩은 UTF-8이 표준이라고 함. 단 이를 %인코딩을 통해서 고쳐서 보내주는 것이 맞음.

filter 사용(post로 전달되는 & 결과로 전달되는 reponse 메시지의 한글 깨짐 해결)#

  • 다음 소스를 다운 받는다. : SetCharacterEncodingFilter.java
  • 배포되는 war파일의 web.xml 파일에 다음과 같이 추가한다. 모든 url로 전달되는 처리 중간에 SetCharacterEncodingFilter를 사용한다는 것이고, 그내용은 인자로 설정된 인코딩으로 처리하겠다는 것이다.
  1. <filter>
           <filter-name>Set Character Encoding</filter-name>
           <filter-class>com.kisinfo.companydata.webservice.filters.SetCharacterEncodingFilter</filter-class>
           <init-param>
               <param-name>encoding</param-name>
               <param-value>euc-kr</param-value>
           </init-param>
        </filter>
       
        <filter-mapping>
           <filter-name>Set Character Encoding</filter-name>
           <url-pattern>/*</url-pattern>
        </filter-mapping>

 

웹서비스 시 호스트 주소 설정#

http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4215755
jboss에서 호스트명 a.b.com 이런 식으로 해줘야 하는데, 이걸 세팅 안해주면,
그냥 http://a:80/ 처럼 참조 주소를 보내준다.
위의 url 설명을 참조하여, jboss-4.2.3.GA/server/default/deploy/jbossws.sar/jbossws.beans/META-INF/jboss-beans.xml
파일을 수정해주면, 그 내용대로 호스트 명을 설정해준다.

 

JVM 옵션 설정#

메모리 좀 늘려볼라구...

run.sh 파일에 다음을 추가

  1. JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m"

 

 

EJB 3.0 개발#

jboss rmi 서버 설정#

jndi 에서 EJB를 검색하고 나면, J2EE서버에 접속해서 EJB 클래스를 요청해야한다. 이때 jndi에서 돌려주는 J2EE서버의 주소는 jboss서버의 binding된 '호스트명' 또는 'IP주소'이다. 즉

  1. sh run.sh -b testserver

라는 이름으로 서비스를 실행했다면, 돌려주는 서버 이름도 'testserver'이다. 서버명이 공식 도메인명이면 상관 없겠지만, 개발중에 사용하는 임시 이름이라면,

서버에서 사용하는 'testserver'라는 이름이 클라이언트 서버에는 존재하지 않을 수도있다.

이때의 해결책은 3가지가 있다.

hosts 파일 변경#

hosts 파일 내에

  1. testserver 1.1.1.1

와 같이 host이름을 적어준다.

 

서버 구동시 binding 네임 변경#

  1. sh run.sh -b 1.1.1.1

이왕이면 서버에서만 사용되는 hostname보다는 공인 ip를 적어주면 된다.

 

명시적으로 rmi서버 이름 설정하기#

가장 근본적인 해결책으로 서비스 실행시 다음과 같은 옵션을 주어서 실행한다.

  1. sh run.sh -b testserver -Djava.rmi.server.hostname=1.1.1.1

 

 

데몬 띄우기#

기본 서비스 인증 추가하기#

다음의 서비스는 jboss에서 기본을 열어두는 서비스 이므로 실서버로 이전하기 전에 전부 막아두어야 한다.

 

  • jbossws
  • jbossws.bean
  • jboss-web
  • jmx-console

mysql 접속시 -ds.xml 설정#

  1. <?xml version="1.0" encoding="euc-kr"?>
    <datasources>
      <no-tx-datasource>
        <jndi-name>jdbc/jupiter</jndi-name>
        <!-- Sybase jConnect URL for the database.
        NOTE: The hostname and port are made up values. The optional
              database name is provided, as well as some additinal Driver
              parameters.
        -->
        <connection-url>jdbc:mysql://hostname:3306/접속DB명?useUnicode=true&amp;characterEncoding=euckr</connection-url>
        <driver-class>com.mysql.jdbc.Driver</driver-class>
        <user-name>사용자명</user-name>
        <password>패스워드</password>
        <min-pool-size>5</min-pool-size>
        <max-pool-size>30</max-pool-size>
        <idle-timeout-minutes>5</idle-timeout-minutes>
        <exception-sorter-class-name>com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter</exception-sorter-class-name>
        <valid-connection-checker-class-name>com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker</valid-connection-checker-class-name>
      </no-tx-datasource>
    </datasources>

oracle 접속시 -ds.xml 설정#

  1. <?xml version="1.0" encoding="UTF-8"?>
    <datasources>
      <local-tx-datasource>
        <jndi-name>OracleDS</jndi-name>
        <connection-url>jdbc:oracle:thin:@IP주소:포트:SID</connection-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>USERNAME</user-name>
        <password>PASSWORD</password>
        <!-- DriverManager.getConnection(props) 호출시 넘겨주는 속성값들 -->
        <connection-property name="char.encoding">UTF-8</connection-property>
        <!-- Connection Pool의 최대, 최소 커넥션의 개수 -->
        <min-pool-size>5</min-pool-size>
        <max-pool-size>20</max-pool-size>
        <!-- 사용하지 않는 커넥션이 있는 경우 닫을 때까지 대기하는  시간(기본 15분) -->
        <idle-timeout-minutes>1</idle-timeout-minutes>
        <!-- JDBC Resource의 Unclosed에 대한 모니터링 활성화 여부 -->
        <track-statements>true</track-statements>
        <!-- 모든 커넥션을 다 소진했을 때 대기하는 시간(ms) -->
        <blocking-timeout-millis>5000</blocking-timeout-millis>
        <!-- 트랜잭션 Query Timeout을 적용 -->
        <set-tx-query-timeout/>
        <!-- 트랜잭션 Query Timeout의 시간을 5분으로 설정 -->
        <query-timeout>300</query-timeout>
        <!-- 커넥션 풀에서 커넥션을 넘겨받기 전에 여전히 커넥션이 유효한지 검증하는 Checker. pingDatabase 메소드를 사용 -->
        <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name-->
        <!-- 치명적 에러시 사용하는 Oracle 에러 코드와 메시지를 확인 -->
        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
        <!-- 새로운 커넥션을 획득했을 때 호출하는 SQL문 -->
        <new-connection-sql>some arbitrary sql</new-connection-sql>
        <!-- Connection Pool에서 커넥션을 얻었을 때 얻은 커넥션에 대해서 호출하는 SQL문 -->
        <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
        <!-- standardjbosscmp-jdbc.xml 파일내에 정의되어 있는 type-mapping과 일치 -->
        <metadata>
           <type-mapping>Oracle9i</type-mapping>
        </metadata>
      </local-tx-datasource>
    </datasources>

또는

  1. [C:\jboss-4.2.3.GA\server\default\deploy]에 저장해 둔다.
    <?xml version="1.0" encoding="UTF-8"?>
    <datasources>
      <local-tx-datasource>
        <jndi-name>OracleDS</jndi-name>
        <connection-url>jdbc:oracle:thin:@192.168.1.2:1521:orcl</connection-url>
        <!--
            Here are a couple of the possible OCI configurations.
            For more information, see http://otn.oracle.com/docs/products/oracle9i/doc_library/release2/java.920/a96654/toc.htm
        <connection-url>jdbc:oracle:oci:@youroracle-tns-name</connection-url>
            or
        <connection-url>jdbc:oracle:oci:@(description=(address=(host=youroraclehost)(protocol=tcp)(port=1521))(connect_data=(SERVICE_NAME=yourservicename)))</connection-url>
            Clearly, its better to have TNS set up properly.
         -->
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <user-name>dbaccessid</user-name>
        <password>dbaccesspassword</password>
        <!-- Uses the pingDatabase method to check a connection is still valid before handing it out from the pool -->
        <!--valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name-->
        <!-- Checks the Oracle error codes and messages for fatal errors -->
        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
            <!-- sql to call when connection is created
            <new-connection-sql>some arbitrary sql</new-connection-sql>
            -->
            <!-- sql to call on an existing pooled connection when it is obtained from pool - the OracleValidConnectionChecker is prefered
            <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
            -->
          <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
          <metadata>
             <type-mapping>Oracle11g</type-mapping>
          </metadata>
      </local-tx-datasource>
    </datasources>

 

context-root 패스 변경하기#

내가 추가한 war에 특정 url할당하기#

war패키지 안의 WEB-INF/jboss-web.xml 파일을 만들어서 그 내용을 다음과 같이 수정한다.

  1. <jboss-web>
      <context-root>/myapp</context-root>
    </jboss-web>

위와 같이 하면 http://my.domain.com/myapp 라는 주소로 내가 만든 war파일을 액세스 할 수 있다.

 

사이트 root에 내 war할당하기#

  1. <jboss-web>
      <context-root>/</context-root>
    </jboss-web>

위와 같이 루트를 할당해버리면 최상위 디렉토리로 접속 가능하다. 혹시 사이트가 갱신되지 않을때는 '새로고침'을 하면 바뀔 것이다.

 

jboss의 virtual hosting#

http://nagpals.com/blog/post.cfm/running-railo-and-adobe-coldfusion-on-the-same-context-root-in-jboss

http://www.jboss.org/community/wiki/VirtualHosts

 

출처:  http://alexk.springnote.com/pages/2975760

 

Posted by 굿데이