분류 전체보기 - 해당되는 글 25건

JBoss Seam의 특징


이미지 출처: http://static.raibledesigns.com/repository/images/seam_logo_blue.png

하는 일

  • EJB3와 JSF를 연결
    • JEE5의 주요 표준
      • EJB 3.0 - JSR 220
      • JavaServer Faces - JSR 127
  • EJB3에 Sean Annotation으로 JSF에서 사용
  • POJO를 Seam 컴포넌트로
  • RESTful처리
  • JSF에서 사용할 수 있는 EL(Expression Language) 제공

POJO 기반

  • Plain Old Java Object


    이미지 출처: http://www.rippleinteractive.com/blog/images/typed_a_.png

Web Beans(JSR-299) 표준화

주요 특징

  • ORM을 이해하는 웹 Framework
    • Cache
    • Database validator
  • Stateful 웹 어플리케이션
    • 설계부터
    • HTTP 세션을 직접 Handling안해도 되도록
  • Web 2.0지원
    • AJAX 기술을 제공
    • JSF의 AJAX 컴포넌트 포함
  • Dependency Bijection을 이용한 POJO 서비스
    • POJO를 Seam 서비스로
    • 인터페이스 / Abstract 클래스가 필요없음
    • 주석을 사용하면 Dependency 관리해줌
  • Configuration by Exception
    • Framework의 설계 원칙
    • Annotation 코딩량을 최소화
  • XML 남용을 피함
    • 꼭 필요한 부분에만 사용
  • 테스트를 위한 설계
    • POJO 기반이라 테스팅 Framework에서 사용하기 편리
    • new로 생성하면 됨
  • 개발툴 지원
    • Eclipse 개발툴 지원
      • JBoss Tool
      • JBoss Developer Studio
  • No Vendor Lock-in
    • 어떤 WAS에서도 동작 가능

Seam의 부가 컴포넌트는?

  • AJAX 컴포넌트
  • Hibernate Search를 이용한 전문 검색(Full Text Search)
  • Google Web Tookit
  • Web Services
  • JBoss Rules(Drools)
  • JBoss jBPM
  • iText PDF 생성 컴포넌트
만득이네
|

 

JBoss Seam

JBoss Seam의 주요 특징


이미지 출처: http://www.seamframework.org/themes/sfwkorg/img/seam_icon_large.png

1. 프로그램 다운로드

  • JBoss AS 다운로드
    • http://www.jboss.org/


      이미지 출처: http://www.jboss.org/theme/images/spotlights/spotlight_as5_50k.jpg

2. 설치

  • JBoss Seam 2.2.1 GA
    • jboss-seam-2.1.1.GA.zip 파일 압축 풀기
  • JBoss Application Server 4.2.3 GA
    • jboss-4.2.3.GA.zip 파일 압축 풀기
  • JBoss Developer Studio 2.0 CR2
    • java -jar jbdevstudio-xxx-2.0.0.CR2-xxxxxx.jar
    • 설치 화면에서 디렉토리 지정하여 설치

3. 예제 컴파일

4. Seam Gen

  • 데이터베이스 테이블을 CRUD Seam 어플리케이션으로 생성

5. 예제 실행

seamframework 사용 사이트


이미지 출처: http://www.seamframework.org/themes/sfwkorg/img/runningon_seamlogo_beige.gif

  • ... best Lego Builder in the world.


    이미지 출처: http://nuncscio.com/wp-content/uploads/2008/01/lego_logo-710596.png

참고자료

  • Seam Books
    • Practical JBoss Seam Projects, ...


      이미지 출처: http://i20.tinypic.com/314c6q0.jpg

    • Seam In Action: Covers Seam 2.0


      이미지 출처: http://www.a1bazaar.in/Books/Management/Seam-In-Action_-Covers-Seam-20/admin/productimages/19643/9788177228861_medium.jpg

    • Seam Framework: Experience the Evolution of Java EE (2nd Edition)


      이미지 출처: http://img.tesco.com/pi/Books/L/93/9780137129393.jpg

    • Beginning Jsf 2 Apis and Jboss Seam


      이미지 출처: http://ec2.images-amazon.com/images/I/51q-qazhagL._SL500_AA240_.jpg

    • Practical JBoss Seam Projects, ...


      이미지 출처: http://i20.tinypic.com/314c6q0.jpg

    • Beginning JBoss Seam: From Novice to ...


      이미지 출처: http://202.125.44.112/~linbaioz/img/2007/06/1590597923.jpg

    • JBoss in Action: Configuring the ...


      이미지 출처: http://pixhost.ws/avaxhome/de/d5/000ad5de_medium.jpeg

    • JBoss(R) Seam: Simplicity and Power ...


      이미지 출처: http://vig-fp.pearsoned.co.uk/bigcovers/0131347969.jpg

만득이네
|
하나의 머신에서 여러 개의 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>

|
JBoss ESB에서 작성된 .esb 서비스들은 jUDDI를 이용하여 Registry에 등록되게 됩니다.
ESB 서버상의 UDDI Repository의 내용을 보려면 UDDI Browser라는 Swing Application을 사용하면 됩니다.

http://www.uddibrowser.org/
에서 다운로드 받아 압축을 풀고 실행하면 됩니다.

Windows환경에선 ub.bat 파일을 실행하면 되고, Linux환경에서는 ant를 실행하면 됩니다(build.xml파일이 제공된다).

JBoss ESB 서버에 접속하면 아래와 같은 에러가 발생합니다.
     [java] Caught exception: null
     [java] java.lang.NullPointerException
     [java]     at org.uddibrowser.uddi.UDDIWrapper.findBusiness(UDDIWrapper.java:488)
     [java]     at org.uddibrowser.RegistryActionController.processRead(RegistryActionController.java:500)
     [java]     at org.uddibrowser.RegistryActionController.asyncWork(RegistryActionController.java:471)
     [java]     at org.uddibrowser.RegistryActionController.access$000(RegistryActionController.java:76)
     [java]     at org.uddibrowser.RegistryActionController$1.construct(RegistryActionController.java:355)
     [java]     at org.uddibrowser.ui.SwingWorker$2.run(SwingWorker.java:137)
     [java]     at java.lang.Thread.run(Thread.java:595)

문제는 UDDI Browser에서 사용하는 UDDI4J의 버전이 서버와 맞지 않아 발생하는 것이며,
http://uddi4j.sourceforge.net/
위의 UDDI4J 프로젝트 사이트에서 최신 버전을 다운로드하여 ub-0.2-bin/lib/uddi4j.jar 파일을 업데이트하면 UDDI Browser를 이용하여 JBoss ESB의 서비스를 검색할 수 있습니다.



|

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.
|
JBoss 의 JMS서버의 queue를 모니터링하는 JMX Code입니다. jsp파일로 되어 있으며 복사해서 사용하면 됩니다.

아래의 파일이 실행되어 모니터링되려면 $SERVER_HOME/deploy/jboss-messaging.sar/messaging-service.xml 파일의 다음의 attribute를 true로 바꿔야 합니다.
<attribute name="EnableMessageCounters">true</attribute>

그리고 메시지를 샘플링하는 주기를 적절하게 주면 됩니다.
<attribute name="MessageCounterSamplePeriod">5000</attribute>


<%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8" import="javax.naming.*, java.util.*,javax.management.*,org.jboss.jms.server.destination.*,org.jboss.jmx.adaptor.rmi.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--meta http-equiv="refresh" content="5"-->
<link href="style.css" rel=stylesheet type="text/css">
<title>Insert title here</title>
</head>
 
<body leftmargin=15 topmargin=10>
<center><p>
<br>
 
<table width="600" cellpadding="7" cellspacing="0" border="1" bordercolordark="WHITE" bordercolorlight="BLACK">
<tr bgcolor=#E8EEEC>
<%
    String type = "Queue";
 
    Hashtable<String,String> env = new Hashtable<String,String>();
    String factory = "org.jboss.security.jndi.JndiLoginInitialContextFactory";
    env.put(Context.INITIAL_CONTEXT_FACTORY, factory);
    String url = "jnp://127.0.0.1:1099";
    env.put(Context.PROVIDER_URL, url);
    env.put(Context.SECURITY_CREDENTIALS, "admin");
    env.put(Context.SECURITY_PRINCIPAL, "admin");
    Context ctx = new InitialContext(env);
    RMIAdaptor server = (RMIAdaptor) ctx.lookup("jmx/invoker/RMIAdaptor");
%>
 
<td align center>Queue Name</td>
<td align center>Total Count</td>
<td align center>Current Count</td>
<td align center>Consumer Count</td>
<td align center>Delivering Count</td>
</tr>
<tr>
<td align center>queue/A</td>
<%
    String queueName = "A";
 
    // Get the MBeanInfo for the JNDIView MBean
    String targetName = "jboss.messaging.destination:service=" + type + ",name=" + queueName;
    ObjectName objName = ObjectName.getInstance(targetName);
 
    QueueMBean queueMBean = (QueueMBean) MBeanServerInvocationHandler.newProxyInstance(server, objName, QueueMBean.class, false);
 
    int totalMessageCount = 0;
    int currentMessageCount = 0;
 
    totalMessageCount = queueMBean.getMessageCounter().getCount();
    currentMessageCount = queueMBean.getMessageCount();
%>
<td align center><%= totalMessageCount %></td>
<td align center><%= currentMessageCount %></td>
<td align center><%= queueMBean.getConsumerCount() %></td>
<td align center><%= queueMBean.getDeliveringCount() %></td>
</tr>
<tr>
<td align center>queue/B</td>
<%
    queueName = "B";
 
    // Get the MBeanInfo for the JNDIView MBean
    targetName = "jboss.messaging.destination:service=" + type + ",name=" + queueName;
    objName = ObjectName.getInstance(targetName);
 
    queueMBean = (QueueMBean) MBeanServerInvocationHandler.newProxyInstance(server, objName, QueueMBean.class, false);
 
    totalMessageCount = 0;
    currentMessageCount = 0;
 
    totalMessageCount = queueMBean.getMessageCounter().getCount();
    currentMessageCount = queueMBean.getMessageCount();
%>
<td align center><%= totalMessageCount %></td>
<td align center><%= currentMessageCount %></td>
<td align center><%= queueMBean.getConsumerCount() %></td>
<td align center><%= queueMBean.getDeliveringCount() %></td>
</tr>
</table>
|

 


이미지 출처: http://www.jboss.com/company/logos/jboss_inc_logo.jpg

JBoss.org 프로젝트


이미지 출처: http://www.redhat.com/g/logo_jbossorg.png

  • Server/Platform
    • JBoss Application Server
    • JBoss Web
    • JBoss Microcontainer
    • Mobicent
      • SIP Server
  • Integration
    • JBoss ESB
    • JBoss Messaging
    • Red Hat Messaging
    • Drools
    • JBoss jBPM
    • JBoss Transactions
    • JBoss Web Services
    • RESTEasy
    • DNA
    • JBoss IIOP
  • Tools
    • JBoss Tools
    • JBoss Profiler
    • JBoss JRunits
    • JSFUnit
    • JBoss Distributed Testing Framework
  • Web Interface
    • RichFaces
    • AJAX4JSF
    • Gravel
  • High Performace & Grid
    • JBoss Cache
    • JGroups
  • Portal
    • JBoss Portal
    • Portlets
  • Monitoring
    • Jopr
      • JBoss Operation Network
    • Embedded Jopr
      • JBoss AS Admin Console
  • Programming Model
    • JBoss Seam
    • JBoss EJB3
    • JBoss AOP
    • Hibernate
  • Security
    • JBoss Security and Identity Management
    • JBoss Federated SSO
  • Foundation
    • JBoss Serialization
    • JBoss Remoting

JBoss.com


이미지 출처: http://www.jboss.com/themes/jbosstheme/img/logo.gif

  • Platform
    • Application Platform
    • Portal Platform
    • Data Services Platform
    • SOA Platform
    • Communication Platform
  • Develop Tools
    • JBoss Developer Studio
  • Monitoring
    • JBoss Operation Network
  • Framework
    • Hibernate Framework
    • jBPM Framework
    • Rules Framework
    • Seam Framework
|

 

무료 오픈소스 소프트웨어

웹브라우저

비디오 플레이어

인터넷 메신저

이메일

RSS

DVD 동영상 추출

P2P 파일 공유

오피스

팟캐스팅

녹음

그래픽 편집

FTP

마인드맵

만득이네
|
JBoss Web Service Sample을 작성해보도록 하겠습니다. JBoss Web Service는 jboss.org의 jbossws 프로젝트를 이용하여 구성되어 있으며, JBoss Application Server 내에서 jbossws에 대한 sar(service archive)로 포팅되어 있습니다.

보통의 WebService예제는 vendor specific 으로 구성되어 있지만 JBoss의 특징이라면 "무조건 표준으로 간다"(워낙에 표준 준수가 심해서 가끔은 짜증이 납니다)이므로 JBoss Web Service라지만 다른 엔진 라이브러리만 있다면 아무데서나 구동될 수 있습니다.

Eclipse를 띄우고 일반 웹 애플리케이션 프로젝트를 띄운 후 JBoss library를 프로젝트의 Build Path로 지정합니다. 이 부분에 대해서는 별도 설명을 하지 않습니다.

1. Server 측 코드를 작성합니다.

package com.jboss.webservice;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

/**
 * This is a webservice class exposing a method called greet which takes a input
 * parameter and greets the parameter with hello.
 *
 * @author Ji-Woong Choi
 */

/*
 * @WebService indicates that this is webservice interface and the name
 * indicates the webservice name.
 */
@WebService(name = "Hello", targetNamespace="
http://client.jboss.com/", serviceName="GreetService")
/*
 * @SOAPBinding indicates binding information of soap messages. Here we have
 * document-literal style of webservice and the parameter style is wrapped.
 */
//@SOAPBinding(style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
@SOAPBinding(style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.LITERAL)
public class Hello {
 /**
  * This method takes a input parameter and appends "Hello" to it and returns
  * the same.
  *
  * @param name
  * @return
  */
 @WebMethod
 public String greet(@WebParam(name = "name")
 String name) {
  System.out.println("JBoss Web Service was invoked by " + name);
  return "Hello!, " + name;
 }
}

Web Service Annotation을 이용하여 필요한 메소드들을 구성합니다.

2. Web.xml 파일을 편집합니다. 본 예제에서는 servlet style을 이용하여 처리합니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
 xmlns="
http://java.sun.com/xml/ns/javaee"
 xmlns:web="
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 id="WebApp_ID" version="2.5">
 <display-name>jboss-ws</display-name>
 <servlet>
  <servlet-name>Hello</servlet-name>
  <servlet-class>com.jboss.webservice.Hello</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>Hello</servlet-name>
  <url-pattern>/Hello</url-pattern>
 </servlet-mapping>
 <session-config>
  <session-timeout>30</session-timeout>
 </session-config>

</web-app>

다른 방법으로는 EJB를 이용하여 port proxy를 remote stub을 이용하는 방법이 있지만 web이 테스트하기 보다 단순하므로 이 예제를 이용하겠습니다.

3. 서버에 디플로이 후 Web Service에 대한 deploy상태를 확인합니다.

http://localhost:8080/jbossws/ 라고 입력하면 웹서비스 리스트를 확인할 수 있습니다.


위의 화면에서 "View a list of deployed services"를 클릭하면 웹서비스들의 상태가 나타나게 됩니다.


4. WSDL의 디플로이된 상태를 확인합니다.


5. 이제 클라이언트 코드를 작성합니다. 여기서는 DII방식(Dynamic Invocation Interface) 방식을 이용하여 작성합니다.

package com.jboss.webservice.client;

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Call;

import javax.xml.namespace.QName;

import java.net.URL;

public class HelloClientDII
{
    public static void main(String[] args)
        throws Exception
    {
        String urlstr   = "http://localhost:8080/jboss-ws/Hello?wsdl";
        String argument = "Ji-Woong";

        System.out.println("Contacting webservice at " + urlstr);

        URL url =  new URL(urlstr);

        String ns        = "http://client.jboss.com/";
        QName  qname     = new QName(ns, "GreetService");
        QName  port      = new QName(ns, "HelloPort");
        QName  operation = new QName(ns, "greet");

        ServiceFactory factory = ServiceFactory.newInstance();
        Service        service = factory.createService(url, qname);
        Call           call    = service.createCall(port, operation);

        System.out.println("hello.hello(" + argument + ")");
        System.out.println("output:" + call.invoke(new Object[] {argument}));
    }
}

위의 코드를 실행하면 서버에 System console에 적은 내용이 찍히게 되며, 클라이언트에서 응답을 받을 수 있습니다.


다시 한번 "http://localhost:8080/jbossws/services" url을 확인하면 수행된 시간에 대한 결과치를 확인할 수 있습니다.
|

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