샤브의 블로그 RSS 태그 관리 글쓰기 방명록
전체 글 (234)
2010-08-22 01:23:45

보호글입니다.
비밀번호를 입력하셔야 내용을 보실 수 있습니다.


2010-08-22 01:19:14

보호글입니다.
비밀번호를 입력하셔야 내용을 보실 수 있습니다.


2010-08-22 01:07:46

[출처:ORACLE]
1.1 관념
  이 명세서는 JavaTM 메시지 서비스(JMS)의 목적과 기능을 설명해줍니다. JavaTM 메시지 서비스(JMS)은 자바프로그램이 엔터프라이즈 메시징 서비스의 메시지를 만들거나 보내고 받고 읽는 일반적인 역할을 제공합니다.

1.2 개요
  엔터프라이즈 메시징 제품(또는 메시지 지향 미들웨어 제품)은 통합 내부 작업에 필수적인 컴포넌트가 되고 있다. 이런 제품들은 신뢰할 수 있고 유연한 시스템으로 통합하는 비지니스 컴포넌트를 분리할 수 있다. 전통적인 메시지 지향적인 미들웨어 벤더들 외에도 엔터프라이즈 메시징 제품들은 또한 몇몇의 데이터베이스 벤더들과 많은 인터넷 관련 회사들에 의해서도 제공됩니다. 자바 언어 클라이언트와 자바언어기반 미들 계층 서비스는 이 메시징 시스템을 사용할 수 있는 능력이 있어야 한다. 자바 메시징 서비스(이하 JMS)는 자바 언어 프로그램이 이 시스템에 접근하는 일반적인 방법을 제공한다. JMS는 엔터프라이즈 메시징 제품에 JMS 클라이언트가 접근하는 방법을 정의하는 인터페이스와 관련된 시맨틱들의 집합이다.

  메시징이 피어 투 피어인 이래로, JMS의 사용자들은 일반적으로 클라이언트로 여겨진다. JMS 어플리케이션은 메시지를 교환하는 클라이언트의 집합과 메시지를 정의하는 어플리케이션의 집합으로 구성된다. JMS를 충족시키는 제품은 JMS 인터페이스들을 포함하는 프로바이더가 제공함으로 작동된다.

1.2.1 JMS는 Mail API인가?
  메시징은 컴퓨팅 분야에서 꽤널리 정의되어있다. 그것은 다양한 운영체제 개념을 묘사하는데 사용되어지고 이메일과 팩스 시스템을 묘사하기 위해서도 사용되어지며 엔터프라이즈 어플리케이션간에 비동기식 커뮤니케이션을 묘사하는데에도 사용되고있기 때문이다. 여기서 묘사된 바와 같이 메시지는 사람이 아닌 엔터프라이즈 어플리케이션에 의해 소모되는 비동기식 요청, 리포트, 이벤트들이다.
  메시지는 이런 시스템을 조정하는데 필요한 중요한 정보를 포함하고 특정 비지니스 액션을 묘사하는 정밀하게 형식화된 데이터를 포함한다. 이러한 메시지들의 교환을 통해서 각각의 어플리케이션들은 엔터프라이즈의 진행을 추적한다.

1.2.2 기존 메시지 시스템
  메시징 시스템은 피어투피어 기술이다. 보편적으로, 각각의 클라이언트들은 메시지를 다른 클라이언트와 주고 받을수 있다. 각각의 클라이언트는 메시지를 만들고 주고 받기 위한 기술을 제공하는 메시징 에이전트와 연결되어 있다.
  각각의 시스템은 메시지에 접근하고 만들어서 데이터를 채우는 방법을 제공한다. 어떤 시스템은 많은 목적지로 메시지를 브로드캐스팅할수 있는 능력이 있는가 하면 다른 시스템은 하나의 목적지로만 메시지를 보낼 수 있다. 일부 시스템은 메시지의 비동기 수신을 위한 기술을 제공합니다.(메시지가 도착하면 클라이언트에게 전달된다.) 다른 시스템은 동기 수신만을 제공한다.(클라이언트는 각각의 메시지를 요청해야 한다.) 각각의 메시징 시스템은 일반적으로 메시지 기반 당 선택할 수 있는 서비스의 범위를 제공합니다. 한 가지 중요한 속성은 시스템이 배달을 보장할 수 있는 길이다.
  이것은 단순하고 최선의 노력과 보장에 따라 다르지만 단 한번의 배달이다. 다른 중요한 속성은  살아있고 우선순위가 있으며 응답이 필수적인 메시지이다.

1.2.3 JMS 목적
  JMS는 메시징 시스템의 모든 기능의 집합을 제공하는 경우, 의도한 사용자에게 매우 복잡할 것입니다. 반면에 JMS는 모든 제품들에게 메시징의 일반적인 특징의 공통점 그 이상이다. JMS는 복잡한 엔터프라이즈 응용 프로그램을 구현하는 데 필요한 기능을 포함하는것은 중요하다. JMS는 엔터프라이즈메시징의 개념과 기술의 공통 집합을 정의합니다. JMS는 Java 언어 프로그래머가 엔터 프라이즈 메시징 제품을 사용하도록 배워야하는 개념의 집합을 최소화하려고 시도합니다. JMS는 애플 리케이션을 메시징의 이동성을 최대화하기 위해 노력하고 있습니다.

1.2.3.1 JMS 프로바이더(provider)
앞서 언급한 것처럼, JMS provider는 메시징 제품을 위해 JMS를 구현한 부분을 제공합니다. 이상적으로 JMS provider들은 애플릿과 같이 순수 자바에서 사용될 것이다. 설치를 간단하게 하고 운영체제나 아키텍쳐를 넘어서 작업할수 있습니다. JMS의 중요한 목표는 provider를 구현하기위해 필요한 작업을 간소화하는 것입니다.
 

1.2.3.2 JMS 메시지
JMS는 메시지 인터페이스들의 집합을 정의한다. 클라이언트는 JMS provider에 의해 지원되도록 구현된 메시지를 사용한다. JMS의 주 목적은 클라이언트가 JMS provider에 독립적인 메시지를 생성하고 작업하는 모순되지 않는 API를 가지는 것이다.

 

1.2.3.3 JMS 도메인
메시징 제품은 크게 포인트투포인트 또는 구독 게시시스템으로 분류할 수 있다. 피투피제품은 메시지큐의 개념으로 만들어져있다. 각각의 메시지는 특정큐로 찾아간다. 클라이언트는 그들의 메시지를 가지고 있는 큐로부터 메시지들을 추출한다. 게시/구독 클라이언트가 콘텐츠 계층에서 어떤 노드에 메시지들의 주소를 지정한다. 게시자들과 구독자들은 일반적으로 익명이고 콘텐츠 계층 구조를 동적으로 게시하거나 구독할 지도 모른다. 시스템은 노드의 여러 게시자로부터 다수의 구독자에게 도착하는 메시지들의 분배를 다룬다. 각 도메인의 시멘틱들을 지원하면서 JMS는 클라이언트가 두 도메인에서 메시지를 주고 받을 수 있는 인터페이스의 집합을 제공합니다. 또한 JMS는 클라이언트 인터페이스를 각 도메인에 맞게 제공합니다. JMS 1.1 버전 이전에서는, 각 도메인에 맞게 조정되는 클라이언트 인터페이스만 사용할 수 있었다. 이러한 인터페이스는 이전 버전의 JMS 클라이언트를 구현에 대한 호환성을 제공하기 위해 지원을 계속합니다. 클라이언트를 구현하기 위한 기본 접근 방법은 도메인 독립적인 인터페이스를 사용하는 것입니다. "공통 인터페이스"로 참고되는 이러한 인터페이스는 도메인의 특정 인터페이스의 부모입니다.

 

1.2.3.4 이식성

기본 이식의 목표는 새로운, JMS, 어플리케이션들이 동일한 메시징 도메인 내에서 제품간에 이식이 되는 것입니다. 이것이 기계 구조와 운영체제를 넘어서는 JMS 클라이언트의 예상되는 이식성이다. 

Although JMS is designed to allow clients to work with existing message
formats used in a mixed language application, portability of such clients is not
generally achievable (porting a mixed language application from one product
to another is beyond the scope of JMS).

JMS는 클라이언트가 기존의 메시지 형식으로 혼합 언어 응용 프로그램에서 사용되는 이러한 클라이언트의 이동성 작동하도록 설계되어 있지만 일반적으로 달성되지 않습니다

 

 

1.2.4 What JMS Does Not Include
JMS does not address the following functionality:
• Load Balancing/Fault Tolerance - Many products provide support for
multiple, cooperating clients implementing a critical service. The JMS API
does not specify how such clients cooperate to appear to be a single, unified
service.
• Error/Advisory Notification - Most messaging products define system
messages that provide asynchronous notification of problems or system
events to clients. JMS does not attempt to standardize these messages. By
following the guidelines defined by JMS, clients can avoid using these
messages and thus prevent the portability problems their use introduces.
• Administration - JMS does not define an API for administering messaging
products.
• Security - JMS does not specify an API for controlling the privacy and
integrity of messages. It also does not specify how digital signatures or keys
are distributed to clients. Security is considered to be a JMS providerspecific
feature that is configured by an administrator rather than controlled
via the JMS API by clients.
• Wire Protocol - JMS does not define a wire protocol for messaging.
• Message Type Repository - JMS does not define a repository for storing
message type definitions and it does not define a language for creating
message type definitions.

'Device & Language > Java' 카테고리의 다른 글

Java의 연산자(내림차순)  (0) 2010.08.31
배열 원소의 최기값  (0) 2010.08.31
CellPhone 클래스를 완성하라!  (0) 2010.08.25
Java StringBuilder vs StringBuffer  (1) 2010.08.23
자바를 이용한 부대활동(???)  (0) 2010.08.21
2010-08-21 15:11:08

자~ 제목은 거창하지만 사실 내용은 별게 없습니다.
현재까지 배운 쏘스를 고쳐서 만드는 작업으로 현재 듣는 강의의 소스입니다~ ^^;;;
하나하나 해 가면서 첨부해 나갈 수도 있을 것이라고 생각합니다.

일단 과제는 이렇습니다.

1. 모든 병사는 건강도를 갖는다.
2. 척후병은 적군의 동태를 감시하다가 적군이 움직이면 지휘관에게 보고를 한다. 매번 보고때마다 건강도는 2씩 감소한다.
3. 지휘관은 척후병의 주어진 정보를 바탕으로 소총수에게 공격과 방어를 명령하낟. 이때, 적군의 수가 5명 이하이면 공격을 초과이면 방어를 하도록 한다.
4. 소총수는 소총으로 공격과 방어를 한다. 한번의 공격에 총알 5개를 사용하고, 한번의 방어에 총알1개를 사용한다. 건강도는 한번 공격때 5씩 감소하고, 한번 방어할 때 10씩 감소한다.
5. 소총수는 총탄이 떨어지면 지휘관에게 보고를 한다.
6. 지휘관은 소총수에게 총탄이 남아 있는 한 총탄을 지급한다. 한번 지급되는 총탄은 50발이다. 하지만 총탄이 모자라면 적게 줄 수도 있다.
7. 지휘관은 소총수의 건강도를 체크하다가 건강도가 70이하가 되면, 취사병에게 식사를 준비시킨다. 취사병이 식사를 먹일 때마다 지휘관과 척후병은 1씩, 나머지 병사들의 건강도는 10씩 증가한다.

위의 문제를 현재까지 배운 내용을 가지고서 분석/작성하는 것입니다.

그래서 제일 먼저 공통 사항을 뽑아 냈습니다.
위의 사람들은 사람이면서 군인입니다.
그래서 나온 녀석이 Soldier 클래스~

public abstract class Soldier {
   final static int MAXHEALTH = 100 ;
   final static int MINHEALTH = 0 ;
   final static int MAXBULLETIN = 280 ;
   final static int MINBULLETIN = 0 ;
 
   private int health =  80 ;
   private int bullet = 50 ;
 
   public int getHealth() {
       return health;
   }

   public void setHealth(int health) {
      this.health = health;
   }

   public int getBullet() {
      return bullet;
   }

   public void setBullet(int bullet) {
      this.bullet = bullet;
   }
 
   abstract void incHealth();
}


위에서 보시는 바와 같이 health와 bullet을 공통적으로 가지고 있으며 식사를 하게 되면 건강도가 올라가야 해서 3가지 공통 요소를 뽑아냈습니다.

그리고 다음은 척후병입니다.
척후병은 지휘관에게 보고를 해야하기에 지휘관이 누구인지를 정확하게 알아야 합니다.

import java.util.Random;

public class Scout extends Soldier {
   void reportNum(Commander commander) {
      int num = 0;
      Random r = new Random();
      num = r.nextInt(10) + 1;
      System.out.println("적 " + num + "명 출현!!!!!");
      decHealth(num);
      commander.report(num);
   }

   void decHealth(int num) {
      if (getHealth() < 2) {
         setHealth(0);
         System.out.println("척후병이 죽었습니다.");
         System.exit(0);
      } else {
         setHealth(getHealth() - 2);
         System.out.println("척후병의 HP:" + getHealth());
      }
   }

   void incHealth() {
      setHealth(getHealth() + 1);
      System.out.println("철후병의 HP:" + getHealth());
   }
}


보고를 할 때는 지휘관이 누구인지 알아야 하기에 지휘관의 클래스를 인자로 받는 함수를 선언하였습니다.
그리고 보고 할때마다 건강도가 감소해야한다는 조건이 있어서 decHealth와 report 함수를 호출하게 되어있습니다.

public class Commander extends Soldier {
   Rifleman rifle;
   Cooksoldier cook;
   Scout scout;
   Magazine magazine;

   public Commander(Rifleman rifle, Cooksoldier cook, Scout scout, Magazine magazine) {
      this.rifle = rifle;
      this.cook = cook;
      this.scout = scout;
      this.magazine = magazine;
   }

   void incHealth() {
      if (getHealth() != 100) {
         setHealth(getHealth() + 1);
      }
      System.out.println("지휘관의 HP:" + getHealth());
   }

   void giveBullet() {
      if (magazine.getBullet() > 50) {
         magazine.setBullet(magazine.getBullet() - 50);
         System.out.println("탄 50발을 소총수에게 보급하였습니다.");
         System.out.println("탄약고 잔탄:"+magazine.getBullet());
         rifle.incBullet(50);
      } else if(magazine.getBullet() > 0) {
         rifle.incBullet(magazine.getBullet());
         System.out.println("탄 " + magazine.getBullet() + "발을 소총수에게 보급하였습니다.");
         magazine.setBullet(0);
      } else{
         System.out.println("탄약고가 비었습니다.");
      }
   }

   void report(int num) {
      if (num > 5) {
         System.out.println("지휘관:방어하라!!!");
         rifle.command(this, 2);
      } else {
         System.out.println("지휘관:공격하라!!!");
         rifle.command(this, 1);
      }
      if (rifle.getHealth() <= 70)
         checkHealth();
      }

   void checkHealth() {
      System.out.println("취사병~!!! 밥준비해~~~");
      cook.cooking(this);
   }
}


지휘관은 척후병에게 보고 받은 사항에 대해서 판단을 하여 공격인지 방어인지에 대해서 소총수에게 명령을 하게 되고 소총수가 총탄이 떨어지는 경우에는 탄약고에 있는 총탄을 소총수에게 주는 작업을 하게 되어 있고 또한 소총수의 건강도를 점검하다가 70이하로 떨어진 경우에는 취사병에게 취사명령을 하여 모든 군인들의 건강도를 올리도록 합니다.

다음은 소총수 입니다.

public class Rifleman extends Soldier {
   void decHealth(Commander commander, int command) {
      int temp = getHealth();
      switch (command) {
      case 1:
         if (temp > 5) {
            setHealth(getHealth() - 5);
         } else {
            setHealth(0);
         }
         break;
      case 2:
         if (temp > 10) {
            setHealth(getHealth() - 10);
         } else {
            setHealth(0);
         }
         break;
      }
      temp = getHealth();
      if (getBullet() == 0) {
         if (temp > 10) {
            setHealth(getHealth() - 10);
         } else {
            setHealth(0);
            System.out.println("소총수가 죽었습니다.");
            System.exit(0);
         }
      }
      System.out.println("소총수의 HP:" + getHealth());
   }

   void incHealth() {
      if (getHealth() < 90) {
         setHealth(getHealth() + 10);
      } else {
         setHealth(100);
      }
      System.out.println("소총수의 HP:" + getHealth());
   }

   void decBullet(Commander commander, int code) {
      switch (code) {
      case 1:
         if (getBullet() > 5) {
         setBullet(getBullet() - 5);
         System.out.println("소총수가 5발을 소모하였습니다.[" + getBullet() + "]");
      } else if (getBullet() > 0) {
         System.out.println("소총수가 " + getBullet() + "발을 소모하였습니다.[0]");
         setBullet(0);
      } else {
         System.out.println("보유한 탄이 없습니다.");
      }
      break;
   case 2:
      if (getBullet() > 1) {
         setBullet(getBullet() - 1);
         System.out.println("소총수가 1발을 소모하였습니다.[" + getBullet() + "]");
      } else {
         System.out.println("보유한 탄이 없습니다.");
      }
      break;
   }

   if (getBullet() < 1)
      commander.giveBullet();
   }

   void incBullet(int num) {
      setBullet(getBullet() + num);
      System.out.println("소총수가 " + num + "발을 보충받았습니다.");
   }

   void command(Commander commander, int code) {
      switch (code) {
      case 1:
         decHealth(commander, code);
         decBullet(commander, code);
         break;
      case 2:
         decHealth(commander, code);
         decBullet(commander, code);
         break;
      }
   }
}


소총수는 지휘관에게 명령을 받으면 공격이나 방어를 하면서 건강도가 변하게 되고 총탄도 소모하게 됩니다. 그리고 총탄을 소모하게 되면 지휘관에게 보고 하고 총탄을 보급받게 되어 있습니다.

다음은 밥만 짓는 취사병이네요~

public class Cooksoldier extends Soldier {
   void incHealth() {
      if (getHealth() < 90) {
         setHealth(getHealth() + 10);
      } else {
         setHealth(100);
      }
      System.out.println("취사병의 HP:" + getHealth());
   }

   void cooking(Commander commander){
      commander.incHealth();
      incHealth();
      commander.rifle.incHealth();
      commander.scout.incHealth();
   }
}


병사들 중에 가장 간단한 클래스네요. 밥져주고 건강도가 올라가는 함수로 구성되어 있습니다.
마지막으로 탄약고입니다.
클래스 상속은 없는 간단한 클래스 입니다.

public class Magazine {
   int bullet = 70;

   public int getBullet() {
      return bullet;
   }

   public void setBullet(int bullet) {
      this.bullet = bullet;
   }
}


여기 까지 모든 클래스가 끝났네요~
위의 클래스들을 돌려주는 클래스를 한번 보시죠~

public class ArmyDemo {
   public static void main(String[] args) {
      Cooksoldier cook = new Cooksoldier();
      Rifleman rifle = new Rifleman();
      Scout scout = new Scout();
      Magazine magazine = new Magazine();
      Commander commander = new Commander(rifle, cook, scout, magazine);

      while (true) {
         scout.reportNum(commander);
      }
   }
}


총탄을 280로 주면 100% 사람이 죽기에 총탄수와 건강도의 기본 값을 수정하여 테스트 해보았습니다.

적 3명 출현!!!!!
척후병의 HP:78
지휘관:공격하라!!!
소총수의 HP:75
소총수가 5발을 소모하였습니다.[45]
적 5명 출현!!!!!
척후병의 HP:76
지휘관:공격하라!!!
소총수의 HP:70
소총수가 5발을 소모하였습니다.[40]
취사병~!!! 밥준비해~~~
지휘관의 HP:81
취사병의 HP:90
소총수의 HP:80
철후병의 HP:77
.................................................
....중간 생략....
.................................................
적 10명 출현!!!!!
척후병의 HP:24
지휘관:방어하라!!!
소총수의 HP:5
보유한 탄이 없습니다.
탄약고가 비었습니다.
취사병~!!! 밥준비해~~~
지휘관의 HP:100
취사병의 HP:100
소총수의 HP:15
철후병의 HP:25
적 1명 출현!!!!!
척후병의 HP:23
지휘관:공격하라!!!
소총수가 죽었습니다.

누군가가 죽으면 끝나게 만들어서 이렇게 되는 군요~
총탄도 많고 건강도가 조금씩 떨어져서 이렇게 내용이 좀 적네요~^^

'Device & Language > Java' 카테고리의 다른 글

Java의 연산자(내림차순)  (0) 2010.08.31
배열 원소의 최기값  (0) 2010.08.31
CellPhone 클래스를 완성하라!  (0) 2010.08.25
Java StringBuilder vs StringBuffer  (1) 2010.08.23
Java Message Service spec  (0) 2010.08.22