JBoss AS - 해당되는 글 17건

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>



|
하나의 머신에서 여러 개의 JBoss 인스턴스를 구성하려면 Service Binding Manager를 사용하여 별도로 포트가 설정된 XML파일을 이용하여 설정할 수 있다.

첨부한 port-bindings.xml 설정파일을 $JBOSS_HOME/conf/port-bindings.xml 디렉토리에 복사하여 놓고,
$SERVER_HOME/conf/jboss-service.xml 파일의 설정 중  ServiceBindingManager  부분에 아래와 같이 설정하면 된다.  기본적으로 아래 설정은 주석으로 처리되어 있으니, 주석을 제거하고 사용하여야 한다.

첨부한 port-bindings.xml 파일에는 ports-01 부터 ports-09 까지 9개의 포트가 구성되어 있습니다.

<mbean code="org.jboss.services.binding.ServiceBindingManager"

     name="jboss.system:service=ServiceBindingManager">

     <attribute name="ServerName">ports-01</attribute>

     <attribute name="StoreURL">${jboss.home.url}/conf/port-bindings.xml</attribute>

     <attribute name="StoreFactoryClassName">

       org.jboss.services.binding.XMLServicesStoreFactory

     </attribute>

   </mbean>

ports-01부터 ports-09까지 각각의 포트가 리슨하는 주요 포트는 아래 표를 참고하십시오.
 

 

AJP Port

HTTP Port

ports-01

8109

8180

ports-02

8209

8280

ports-03

8309

8380

ports-04

8409

8480

ports-05

8509

8580

ports-06

8609

8680

ports-07

8709

8780

ports-08

8809

8880

ports-09

8909

8980

 

|

아래의 코드를 복사하셔서 web application context에 vm.jsp로 저장하신 후 확인하시면 됩니다.

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import="java.net.InetAddress" %>
<%@ page import="java.text.*" %>
<%@ page import="java.util.*" %>

<%
  if (request.getParameter("gc") != null) {
    System.gc();
    System.runFinalization();
  }
 Properties p = System.getProperties();
%>

<HTML>
<HEAD>
<META content="text/html; charset=euc-kr" http-equiv=Content-Type>
<!--META http-equiv="Refresh" content="10;url=<%= request.getRequestURI() %>"-->
<link href="style.css" rel=stylesheet type="text/css">
</HEAD>

<body leftmargin=15 topmargin=10>
<center><p>

<table width="600" cellpadding="7" cellspacing="0" border="1" bordercolordark="WHITE" bordercolorlight="BLACK">
<tr><td>
■ HOST : <%= InetAddress.getLocalHost().getHostName() %>
(<%= InetAddress.getLocalHost().getHostAddress() %>)&nbsp;&nbsp;
<% SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss z", Locale.CHINA); %>
■ Current Time : <%= formatter.format(new Date()) %>
</td></tr>

<tr><td align=center>

<%
   Runtime rt = Runtime.getRuntime();
   long free = rt.freeMemory();
   long total = rt.totalMemory();
   long usedRatio = (total - free) * 100 / total;
   long unusedRatio = free * 100 / total;
%>

<table width=100% bgcolor="lightgrey" border=1 cellpadding=6 cellspacing=0>
<tr>
<td align="center" colspan="2">Total Java Virual Machine Memory (<b><%= total/1024 %> KB</b>)</td>
</tr>
<tr bgcolor=#E3E3E3>
<td align="center">Used Memory (<b><%= (total - free)/1024 %> KB</b>)</td>
<td align="center">Available Memory (<b><%= free/1024 %> KB</b>)</td>
</tr>
<tr bgcolor=#E8EEEC>
<td><hr color="#CC3366" align=left size=10 width="<%= usedRatio %>%" noshade>
(<%= usedRatio %> %)</td>
<td><hr color="#0066FF" align=left size=10 width="<%= unusedRatio %>%" noshade>
(<%= unusedRatio %> %)</td>
</tr>
</table>

<p>
<a href="<%= request.getRequestURI() %>?gc=">
<img src="trash.gif" valign=middle border=0>&nbsp;Execution GC</a>
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
<a href="<%= request.getRequestURI() %>">
<img src="refresh.gif" valign=middle border=0>&nbsp;Reload</a>

</td></tr>
</table>

</center>
</BODY>
</HTML>

|

Sometimes, when copying a big package from a distant location in /deploy, the file gets deployed before the file is acctually copied. Instead of copying it to /deploy, split the copying in two steps :
   - Copy the file to any localtion on the local filesystem that JBoss is using
   - Move the file from the temporary location to /deploy.(Move is atomic operation)

In linux, links may also be used.

때때로 /deploy 디렉토리의 원격으로부터 큰 용량의 WAR, EAR등을 카피할 때 JBoss에서 실제 카피가 모두 일어나기 전에 디플로이를 시도함으로써 문제가 발생할 수 있는 데 이 때 다음의 두 단계를 거쳐서 해결하면 됩니다.
   - JBoss가 사용하는 로컬 시스템에 파일을 먼저 복사합니다.
   - mv 명령을 이용하여 JBoss의 /deploy 디렉토리로 옮깁니다.

예> cp some_remote_location/my_big.ear /tmp
      mv /tmp/my_big.ear /home/jboss/server/default/deploy

There was a similar situation when using WebLogic Integration File Transport.
|

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