2009/03 - 해당되는 글 8건

JBoss 5.0의 포트 기준이 바뀌었습니다.
기존에서는 /jboss-eap-4.3/jboss-as/docs/examples/binding-manager/sample-bindings.xml 파일을 기준으로 conf/jboss-service.xml파일을 수정하여 변경했었습니다. 이 파일의 경우 단지 4개의 포트를 추가할 수밖에 없었고, 새로운 포트를 추가하려면 사용자가 부가적인 작업을 해줬어야 했습니다.

5.0에서는 설정 파일도 달라졌으며, offset을 이용한 port 변경 방식이 도입되었습니다.
$SERVER_HOME/conf/bootstrap 디렉토리를 보게되면 bindings.xml 파일이 존재합니다.

위 파일을 열어보면 다음과 같은 tag가 설정되어 있습니다. 붉은 색으로 나타난 첫번째 파라미터인 "ports-default'가 사용됨을 의미하는데 "${jboss.service.binding.set:ports-default}"는 JMX에 등록된 서비스 이름입니다. 

 

15       <constructor>
 16          <!-- The name of the set of bindings to use for this server -->
 17          <parameter>${jboss.service.binding.set:ports-default}</parameter>
 18
 19          <!-- The named sets of bindings -->
 20          <parameter>
 21             <bean name="ServiceBindingStore" class="org.jboss.services.binding.impl.PojoServiceBindingStore">
 22
 23                <!-- Base bindings that are used to create bindings for each set -->
 24                <property name="standardBindings"><inject bean="StandardBindings"/></property>
 25
 26                <!-- The sets of bindings -->
 27                <property name="serviceBindingSets">
 28                   <set>
 29                      <inject bean="PortsDefaultBindings"/>
 30                      <inject bean="Ports01Bindings"/>
 31                      <inject bean="Ports02Bindings"/>
 32                      <inject bean="Ports03Bindings"/>
 33                   </set>
 34                </property>
 35             </bean>
 36          </parameter>
 37       </constructor>


위의 port-default 값은 아래쪽의 xml 설정을 보시면 다음과 같이 정의되어 있습니다.

 41    <!-- The ports-default bindings are obtained by taking the base bindings and adding 0 to each port value  -->
 42    <bean name="PortsDefaultBindings"  class="org.jboss.services.binding.impl.ServiceBindingSet">
 43       <constructor>
 44          <!--  The name of the set -->
 45          <parameter>ports-default</parameter>
 46          <!-- Default host name -->
 47          <parameter>${jboss.bind.address}</parameter>
 48          <!-- The port offset -->
 49          <parameter>0</parameter>
 50          <!-- Set of bindings to which the "offset by X" approach can't be applied -->
 51          <parameter><null/></parameter>
 52       </constructor>
 53    </bean>


위에서 중요한 태그는 'ports-default'라는 파라미터 이름과 붉은 부분으로 표시된 offset 값입니다. 기본 port는 RMI 1099, Web 8080, AJP 8009로 시작하며 실제 Ports01Bindings의 경우 기본 offset에 100값을 더한 값으로 세팅되어 있습니다.(bindings.xml 참조). 즉 ports-01을 사용하게 되면 RMI는 1199, Web 8180, AJP 8109 와 같은 형식으로 포트를 변경하게 됩니다.

Offset 파라미터를 조정함으로써 수십개의 포트를 손쉽게 추가할 수 있는 기능이 마련되었습니다.

|

JBoss 5.0의 경우 설정 방식이나 디렉토리 구조가 조금 바뀌었습니다.

기존 방식에서는 $SERVER_HOME/deploy/jboss-web.deployer 파일을 이용하여 포트를 변경하였으나, 5.0에서 포트를 변경하기 위해서는 변경된 $SERVER_HOME/deploy/jbossweb.sar 디렉토리 하위의 server.xml파일을 변경하시면 됩니다.

<!-- A HTTP/1.1 Connector on port 8080 -->
      <Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}"
               connectionTimeout="20000" redirectPort="8443" />

      <!-- Add this option to the connector to avoid problems with
          .NET clients that don't implement HTTP/1.1 correctly
         restrictedUserAgents="^.*MS Web Services Client Protocol 1.1.4322.*$"
      -->

      <!-- A AJP 1.3 Connector on port 8009 -->
      <Connector protocol="AJP/1.3" port="8009" address="${jboss.bind.address}"
         redirectPort="8443" />




필요에 따라 AJP Connector도 변경하시면 됩니다.

|
WebLogic의 경우 weblogic.xml에 virtual-directory-mapping을 지정하여 외부 경로의 Content를 사용할 수 있다. JBoss에서 External(Virtual) Directory를 지정할 수 있는 기능이 있지만, JBoss에서는 HTML, Image등의Static Content만 사용이 가능하다.

$SERVER_NAME/deploy/jboss-web.deployer/server.xml

     <Host name="localhost" ...>
           <!-- ADD static DIRECTORY -->
           <Context path="/externaldir" appBase=""
                   docBase="/home/tester/externaldir"
                   debug="99" reloadable="true">
           </Context>
       ...
      </Host>

JSP파일과 같은 파일을 외부 경로의 파일을 사용하려면 symbolic link를 이용하여 설정이 가능하다. Symbolic Link에 대해서는 기본적으로 인식하지 않도록 설정되어 있어, 다음과 같이 이를 인식할 수 있도록 context.xml파일에 allowLinking을 true로 설정하여야 한다.

$SERVER_NAME/deploy/jboss-web.deployer/context.xml

<Context cookies="true" crossContext="true" allowLinking="true">

|
타 WAS에서 CLOB 함수를 이용하여 처리하는 부분이 있을 때, JBoss에서 사용하려면,  Oracle의 CLOB를 이용하도록 소스 코드의 변경이 필요하다.

그러나, JBoss의 Result Set에서 rs.getCLOB(1) 과 같이 사용하면 ClassCastException이 발생한다. JBoss에서 내부적으로 JDBC 함수들을 Wrapping하여 사용하기 때문인데,
java.lang.ClassCastException: org.jboss.resource.adapter.jdbc.WrappedResultSet

WrappedResultSet의 getUnderlyingResultSet() 함수를 이용하여, 원래의 ResultSet을 가져올 수 있다. 이를 이용하여 코드를 아래 처럼 작성하여야 한다.


ResultSet urs = (org.jboss.resource.adapter.jdbc.WrappedResultSet) rsClob).getUnderlyingResultSet();

CLOB clob = ((oracle.jdbc.OracleResultSet)urs).getCLOB(1);


컴파일을 위해서는 $SERVER_HOME/lib/jboss-common-jdbc-wrapper.jar 파일이 필요하다.

|
JBoss에서 JDBC DataSource 설정시에 <jndi-name>DataSourceName</jndi-name>에 이름을 지정하고 이를 application에서 JNDI를 통해서 참조하게 되는데, WebLogic의 경우에는 작성된 DataSourceName 으로 바로 참조할 수 있지만, JBoss의 경우엔 java:DataSourceName와 같이 앞에 java: 를 붙여야 참조할 수 있다.

WebLogic과 같이 java: 없이 참조하려면 JBoss의 데이터 소스를 지정하는 *-ds.xml 파일의 설정중에 use-java-context를 false로 설정하면 된다.
    <use-java-context>false</use-java-context>

또 한가지, 흔히 발생하는 오류중의 하나가 JDBC Driver Jar 파일을 WEB-INF\lib 디렉토리에 놓는 경우이다. 이럴 경우에 ClassCastException등 다양한 오류가 발생할 수 있다. JDBC Driver파일은 반드시, $SERVER_HOME/lib  디렉토리에 복사해 놓도록 한다.


|
JDK 1.4에서 컴파일된 어플리케이션을 JDK 1.5에서 사용할 때 종종 JSP 컴파일 오류가 발생하는 경우가 있다. 아래와 같은 generic type에 대한 오류 메시지가 출력된다.

org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 1 in the generated java file
The type Collection is not generic; it cannot be parameterized with arguments <? extends E>

Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:415)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:316)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:294)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:281)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:121)
    com.gauce.filter.GauceFilter.doFilter(Unknown Source)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)


이럴 경우에는
$SERVER_NAME/deploy/jboss-web.deployer/conf/web.xml
파일에 아래 컴파일러 소스, 컴파일러 타겟 버전을 지정하여 해결할 수 있다.
물론 가장 좋은 방법은 개발환경을 1.5로 모두 변경하여 JDK 1.5에서 모두 컴파일 하는 것이다.

<init-param>
 <param-name>compilerTargetVM</param-name>
 <param-value>1.5</param-value>
 </init-param>
 <init-param>
 <param-name>compilerSourceVM</param-name>
 <param-value>1.4</param-value>
 </init-param>


|
APP-INF/lib 디렉토리 아래 jar 파일을 로딩하는 것은 표준 Spec이 아닌 WebLogic의 고유 설정이라 이를 Loading 하기 위해서는 jboss-app.xml 파일에 설정을 추가하여야 한다.
만약, APP-INF/classes 디렉토리의 class 파일들을 읽어들이기 위한 설정이 없다. 하위 디렉토리의 파일들을 .jar 로 묶어 APP-INF/lib 디렉토리 아래에 복사하면 된다.

ABC.ear/META-INF/jboss-app.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE jboss-app
PUBLIC "-//JBoss//DTD J2EE Application 4.2//EN"
"http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd"
>
<jboss-app>

<library-directory>APP-INF/lib</library-directory>

</jboss-app>



|
XSLT를 이용하여 WebLogic EJB Deployment Descriptor의 자동 변환이 가능하다.
아래와 ANT를 이용하여 자동으로 변환하도록 설정할 수 있다.
XSLT를 이용하여 변환한 파일을 jar파일의 /META-INF/jboss.xml파일로 추가하여 deploy하면 된다.

build.xml파일
<project name="JBoss" default="webdocs" basedir="./">
    <target name="webdocs">
    <xslt basedir="in" destdir="out"
            includes="weblogic-ejb-jar.xml"
            extension=".xmls"
            style="xslt/jboss.xslt"/>
        <move file="out/weblogic-ejb-jar.xmls" tofile="out/jboss.xml"/>
        <copy file="out/jboss.xml" tofile="in/jboss.xml"/>
</target>
</project>

jboss.xslt 파일
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" doctype-public="-//JBoss//DTD JBOSS 4.0//EN"  doctype-system="http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd"/>
<xsl:template match="/weblogic-ejb-jar"><jboss>
    <enterprise-beans>

<xsl:apply-templates select="weblogic-enterprise-bean"/></enterprise-beans>
</jboss>
</xsl:template>

<xsl:template match="weblogic-enterprise-bean">
<xsl:if test="entity-descriptor">
<entity><xsl:copy-of select="ejb-name"/><xsl:copy-of select="jndi-name"/><xsl:copy-of select="local-jndi-name"/></entity></xsl:if>
<xsl:if test="stateful-session-descriptor">
<session><xsl:copy-of select="ejb-name"/><xsl:copy-of select="jndi-name"/><xsl:copy-of select="local-jndi-name"/></session></xsl:if>
<xsl:if test="stateless-session-descriptor">
<session><xsl:copy-of select="ejb-name"/><xsl:copy-of select="jndi-name"/><xsl:copy-of select="local-jndi-name"/></session></xsl:if></xsl:template>

</xsl:stylesheet>


|

놀새~'s Blog is powered by Daum & tistory