반응형
Oracle Coherence 는 클러스터된 에플리케이션 및 어플리케이션 서버를 대상으로 한 인메모리[각주:1] 분산 데이터 그리드 솔루션입니다.

Oracle Coherence를 적용하는 것은 빈번하게 사용되는 데이터에 대해서 신속하고 신뢰성의 높은 액세스를 제공하며 미션 크리티컬한 어플리케이션을 예측 가능하게 확장할 수 있기 때문입니다. 더불어 여러대의 서버에 걸쳐있는 메모리내의 데이터를 Coherence 스스로 동적으로 파티션화하여 서버의 장애에도 계속적인 데이터의 가용성 및 트랜잭션(transaction)의 정합성을 실현합니다.

그 때문에, Oracle Coherence를 기반으로 하는 어플리케이션들은 경고한 스케일 아웃 할 수 있으면, 어플리케이션에서 필요한 메모리들도 추상적인 인메모리 데이터로 액세스 할 수 있습니다.


Installing Coherence

실습 환경


오라클 사이트에서 Coherence 를 다운로드합니다.


적당한 곳에 받아서 압축을 풉니다.

/co$ unzip coherence-java-3.7.0.0b23397.zip

이제부터 Coherence 가 설치된 디렉토리는 /co/coherence 가 됩니다.


Configure and Run the Sample Cache Server Application

JAVA_HOME 환경변수가 설정이 안되어 있다면 설정합니다.

$ export JAVA_HOME="/usr/lib/jvm/java-6-sun"
$ export PATH="${PATH}:${JAVA_HOME}/bin"

COHERENCE_HOME 환경변수를 설정합니다.

$ export COHERENCE_HOME="/co/coherence"

cache-server.sh 파일을 수정합니다.

/co/coherence/bin$ vi cache-server.sh

아래와 같이 수정합니다.

#!/bin/bash

# This will start a cache server

# specify the Coherence installation directory
SCRIPT_PATH="${BASH_SOURCE[0]}";
if ([ -h "${SCRIPT_PATH}" ]) then // if 다음에 한칸 띄기
  while([ -h "${SCRIPT_PATH}" ]) do SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done
fi
pushd . > /dev/null
cd `dirname ${SCRIPT_PATH}` > /dev/null
SCRIPT_PATH=`pwd`
COHERENCE_HOME=/co/coherence

모든 sh 파일에 실행권한을 줍니다.

/co/coherence/bin$ chmod +x *.sh

쉘스크립트를 실행합니다.

/co/coherence/bin$ ./cache-server.sh

java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

2011-06-24 16:29:48.790/0.261 Oracle Coherence 3.7.0.0 <Info> (thread=main, member=n/a): Loaded operational configuration from "jar:file:/co/coherence/lib/coherence.jar!/tangosol-coherence.xml"
2011-06-24 16:29:48.839/0.310 Oracle Coherence 3.7.0.0 <Info> (thread=main, member=n/a): Loaded operational overrides from "jar:file:/co/coherence/lib/coherence.jar!/tangosol-coherence-override-dev.xml"
2011-06-24 16:29:48.840/0.311 Oracle Coherence 3.7.0.0 <D5> (thread=main, member=n/a): Optional configuration override "/tangosol-coherence-override.xml" is not specified
2011-06-24 16:29:48.843/0.314 Oracle Coherence 3.7.0.0 <D5> (thread=main, member=n/a): Optional configuration override "/custom-mbeans.xml" is not specified

Oracle Coherence Version 3.7.0.0 Build 23397
 Grid Edition: Development mode
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

2011-06-24 16:29:49.059/0.530 Oracle Coherence GE 3.7.0.0 <Info> (thread=main, member=n/a): Loaded cache configuration from "jar:file:/co/coherence/lib/coherence.jar!/coherence-cache-config.xml"
2011-06-24 16:29:49.258/0.729 Oracle Coherence GE 3.7.0.0 <D4> (thread=main, member=n/a): TCMP bound to /192.168.0.192:8088 using SystemSocketProvider
2011-06-24 16:29:52.515/3.986 Oracle Coherence GE 3.7.0.0 <Info> (thread=Cluster, member=n/a): Created a new cluster "cluster:0x96AB" with Member(Id=1, Timestamp=2011-06-24 16:29:49.259, Address=192.168.0.192:8088, MachineId=26816, Location=process:10064, Role=CoherenceServer, Edition=Grid Edition, Mode=Development, CpuCount=8, SocketCount=2) UID=0xC0A800C000000130C08DFECB68C01F98
2011-06-24 16:29:52.519/3.990 Oracle Coherence GE 3.7.0.0 <Info> (thread=main, member=n/a): Started cluster Name=cluster:0x96AB

Group{Address=224.3.7.0, Port=37000, TTL=4}

MasterMemberSet
  (
  ThisMember=Member(Id=1, Timestamp=2011-06-24 16:29:49.259, Address=192.168.0.192:8088, MachineId=26816, Location=process:10064, Role=CoherenceServer)
  OldestMember=Member(Id=1, Timestamp=2011-06-24 16:29:49.259, Address=192.168.0.192:8088, MachineId=26816, Location=process:10064, Role=CoherenceServer)
  ActualMemberSet=MemberSet(Size=1, BitSetCount=2
    Member(Id=1, Timestamp=2011-06-24 16:29:49.259, Address=192.168.0.192:8088, MachineId=26816, Location=process:10064, Role=CoherenceServer)
    )
  RecycleMillis=1200000
  RecycleSet=MemberSet(Size=0, BitSetCount=0
    )
  )

TcpRing{Connections=[]}
IpMonitor{AddressListSize=0}

2011-06-24 16:29:52.546/4.017 Oracle Coherence GE 3.7.0.0 <D5> (thread=Invocation:Management, member=1): Service Management joined the cluster with senior service member 1
2011-06-24 16:29:52.657/4.128 Oracle Coherence GE 3.7.0.0 <D5> (thread=DistributedCache, member=1): Service DistributedCache joined the cluster with senior service member 1
2011-06-24 16:29:52.707/4.178 Oracle Coherence GE 3.7.0.0 <D5> (thread=ReplicatedCache, member=1): Service ReplicatedCache joined the cluster with senior service member 1
2011-06-24 16:29:52.713/4.184 Oracle Coherence GE 3.7.0.0 <D5> (thread=OptimisticCache, member=1): Service OptimisticCache joined the cluster with senior service member 1
2011-06-24 16:29:52.715/4.186 Oracle Coherence GE 3.7.0.0 <D5> (thread=Invocation:InvocationService, member=1): Service InvocationService joined the cluster with senior service member 1
2011-06-24 16:29:52.716/4.187 Oracle Coherence GE 3.7.0.0 <Info> (thread=main, member=1):
Services
  (
  ClusterService{Name=Cluster, State=(SERVICE_STARTED, STATE_JOINED), Id=0, Version=3.7, OldestMemberId=1}
  InvocationService{Name=Management, State=(SERVICE_STARTED), Id=1, Version=3.1, OldestMemberId=1}
  PartitionedCache{Name=DistributedCache, State=(SERVICE_STARTED), LocalStorage=enabled, PartitionCount=257, BackupCount=1, AssignedPartitions=257, BackupPartitions=0}
  ReplicatedCache{Name=ReplicatedCache, State=(SERVICE_STARTED), Id=3, Version=3.0, OldestMemberId=1}
  Optimistic{Name=OptimisticCache, State=(SERVICE_STARTED), Id=4, Version=3.0, OldestMemberId=1}
  InvocationService{Name=InvocationService, State=(SERVICE_STARTED), Id=5, Version=3.1, OldestMemberId=1}
  )

Started DefaultCacheServer...



Configure and Run the Sample Cache Client Application

우선 JLine 을 먼저 설치합니다. 다운로드 받은 후 압축을 풉니다.

/co$ unzip jline-1.0.zip

라이브러리 파일을 복사합니다.

/co/jline-1.0$ cp jline-1.0.jar ../coherence/bin


query.sh 파일을 수정합니다.

/co/coherence/bin$ vi query.sh

아래와 같이 수정합니다.

#!/bin/bash

# This will start a command line query application

# specify the Coherence installation directory
SCRIPT_PATH="${BASH_SOURCE[0]}";
if ([ -h "${SCRIPT_PATH}" ]) then
  while([ -h "${SCRIPT_PATH}" ]) do SCRIPT_PATH=`readlink "${SCRIPT_PATH}"`; done
fi
pushd . > /dev/null
cd `dirname ${SCRIPT_PATH}` > /dev/null
SCRIPT_PATH=`pwd`
COHERENCE_HOME=/co/coherence

query.sh 실행합니다.

/co/coherence/bin$ ./query.sh

** Starting storage disabled console **
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

Coherence Command Line Tool
jline library cannot be loaded, so you cannot use the arrow keys for line editing and history.

CohQL>

위와 같이 CohQL[각주:2] 콘솔 화면이 나옵니다. CohQL을 이용하여 SQL과 유사한 기술로 테이터의 쿼리 처리나 집계 처리를 수행할 수 있습니다.

"help" 명령어로 이것저것 볼 수 있습니다.

명령어를 입력해 봅시다.

CohQL> create cache "products"

2011-06-24 16:59:43.067/420.632 Oracle Coherence 3.7.0.0 <Info> (thread=main, member=n/a): Loaded operational configuration from "jar:file:/co/coherence/lib/coherence.jar!/tangosol-coherence.xml"
2011-06-24 16:59:43.115/420.681 Oracle Coherence 3.7.0.0 <Info> (thread=main, member=n/a): Loaded operational overrides from "jar:file:/co/coherence/lib/coherence.jar!/tangosol-coherence-override-dev.xml"
2011-06-24 16:59:43.116/420.681 Oracle Coherence 3.7.0.0 <D5> (thread=main, member=n/a): Optional configuration override "/tangosol-coherence-override.xml" is not specified
2011-06-24 16:59:43.119/420.684 Oracle Coherence 3.7.0.0 <D5> (thread=main, member=n/a): Optional configuration override "/custom-mbeans.xml" is not specified

Oracle Coherence Version 3.7.0.0 Build 23397
 Grid Edition: Development mode
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

2011-06-24 16:59:43.333/420.898 Oracle Coherence GE 3.7.0.0 <Info> (thread=main, member=n/a): Loaded cache configuration from "jar:file:/co/coherence/lib/coherence.jar!/coherence-cache-config.xml"
2011-06-24 16:59:43.592/421.157 Oracle Coherence GE 3.7.0.0 <D4> (thread=main, member=n/a): TCMP bound to /192.168.0.192:8090 using SystemSocketProvider
2011-06-24 16:59:43.851/421.416 Oracle Coherence GE 3.7.0.0 <Info> (thread=Cluster, member=n/a): This Member(Id=2, Timestamp=2011-06-24 16:59:43.657, Address=192.168.0.192:8090, MachineId=26816, Location=process:10716, Role=TangosolCoherenceQueryPlus, Edition=Grid Edition, Mode=Development, CpuCount=8, SocketCount=2) joined cluster "cluster:0x96AB" with senior Member(Id=1, Timestamp=2011-06-24 16:49:41.469, Address=192.168.0.192:8088, MachineId=26816, Location=process:10630, Role=CoherenceServer, Edition=Grid Edition, Mode=Development, CpuCount=8, SocketCount=2)
2011-06-24 16:59:43.863/421.428 Oracle Coherence GE 3.7.0.0 <D5> (thread=Cluster, member=n/a): Member 1 joined Service Cluster with senior member 1
2011-06-24 16:59:43.863/421.428 Oracle Coherence GE 3.7.0.0 <D5> (thread=Cluster, member=n/a): Member 1 joined Service Management with senior member 1
2011-06-24 16:59:43.863/421.428 Oracle Coherence GE 3.7.0.0 <D5> (thread=Cluster, member=n/a): Member 1 joined Service DistributedCache with senior member 1
2011-06-24 16:59:43.864/421.429 Oracle Coherence GE 3.7.0.0 <D5> (thread=Cluster, member=n/a): Member 1 joined Service ReplicatedCache with senior member 1
2011-06-24 16:59:43.864/421.429 Oracle Coherence GE 3.7.0.0 <D5> (thread=Cluster, member=n/a): Member 1 joined Service OptimisticCache with senior member 1
2011-06-24 16:59:43.864/421.429 Oracle Coherence GE 3.7.0.0 <D5> (thread=Cluster, member=n/a): Member 1 joined Service InvocationService with senior member 1
2011-06-24 16:59:43.866/421.434 Oracle Coherence GE 3.7.0.0 <Info> (thread=main, member=n/a): Started cluster Name=cluster:0x96AB

Group{Address=224.3.7.0, Port=37000, TTL=4}

MasterMemberSet
  (
  ThisMember=Member(Id=2, Timestamp=2011-06-24 16:59:43.657, Address=192.168.0.192:8090, MachineId=26816, Location=process:10716, Role=TangosolCoherenceQueryPlus)
  OldestMember=Member(Id=1, Timestamp=2011-06-24 16:49:41.469, Address=192.168.0.192:8088, MachineId=26816, Location=process:10630, Role=CoherenceServer)
  ActualMemberSet=MemberSet(Size=2, BitSetCount=2
    Member(Id=1, Timestamp=2011-06-24 16:49:41.469, Address=192.168.0.192:8088, MachineId=26816, Location=process:10630, Role=CoherenceServer)
    Member(Id=2, Timestamp=2011-06-24 16:59:43.657, Address=192.168.0.192:8090, MachineId=26816, Location=process:10716, Role=TangosolCoherenceQueryPlus)
    )
  RecycleMillis=1200000
  RecycleSet=MemberSet(Size=0, BitSetCount=0
    )
  )

TcpRing{Connections=[1]}
IpMonitor{AddressListSize=0}

2011-06-24 16:59:43.899/421.464 Oracle Coherence GE 3.7.0.0 <D5> (thread=Invocation:Management, member=2): Service Management joined the cluster with senior service member 1
2011-06-24 16:59:44.017/421.582 Oracle Coherence GE 3.7.0.0 <D5> (thread=DistributedCache, member=2): Service DistributedCache joined the cluster with senior service member 1

처음의 명령어로는 현재 Coherence 의 맴버로 참여(?) 하는군요..

잠깐 CoHQL 을 해봅시다. SQL 과 비슷합니다.

// 네임드 캐쉬 생성
CohQL> create cache "products"
// 캐쉬에 추가 (키와 값)
CohQL> insert into "products" key "television" value "ID-5070"
// 키 값이 "television" 인 데이터의 값을 "ID-5080" 으로 변경
CohQL> update "products" set value() = "ID-5080" where key() like "television"
Results
television: true
// 조회
CohQL> select * from "products"
Results
ID-5080
// 키 값이 "radio" 인 데이터의 key와 value 조회
CohQL> select key(), value() from "products" where key() is "radio"
Results
// 키 값이 "television" 인 데이터 삭제
CohQL> delete from "products" where key() = "television"
Results
// 네임드 캐쉬의 모든 데이터 삭제
CohQL> delete from "products"
Results
// 네임드 캐쉬 삭제
CohQL> drop cache "products"
// 네임드 캐쉬 다시 생성
CohQL> create cache "products"
// 4개의 데이터 삽입
CohQL> insert into "products" key "television" value "ID-5080"

CohQL> insert into "products" key "radio" value "ID-5090"

CohQL> insert into "products" key "MP3 Player" value "ID-5100"

CohQL> insert into "products" key "laptop" value "ID-5110"
// 조회
CohQL> select key(), value() from "products"
Results
"television", "ID-5080"
"radio", "ID-5090"
"MP3 Player", "ID-5100"
"laptop", "ID-5110"
// 백업?
CohQL> backup cache "products" to "products.bkup"
WARNING: The backup command should not be used on active data set,
as it makes no provisions that ensure data consistency during the backup.
Please see the documentation for more detailed information.
// 키값이 "television" 인 테이터 삭제
CohQL> delete from "products" where key() = 'television'
Results
// 조회 (텔레비젼 없음!)
CohQL> select key(), value() from "products"
Results
"radio", "ID-5090"
"MP3 Player", "ID-5100"
"laptop", "ID-5110"
// 네임드 캐쉬 삭제
CohQL> drop cache "products"
// 종료
CohQL> quit
2011-06-24 17:09:19.281/996.846 Oracle Coherence GE 3.7.0.0 <D5> (thread=Invocation:Management, member=2): Service Management left the cluster
2011-06-24 17:09:19.286/996.851 Oracle Coherence GE 3.7.0.0 <D5> (thread=DistributedCache, member=2): Service DistributedCache left the cluster
2011-06-24 17:09:19.307/996.872 Oracle Coherence GE 3.7.0.0 <D5> (thread=Cluster, member=2): Service Cluster left the cluster

다시 CohQL 을 실행하여 Coherence에 참여(?)하게 되면 Member=3 인 것을 확인할 수 있습니다.

2011-06-24 17:16:14.177/20.159 Oracle Coherence GE 3.7.0.0 <D5> (thread=Invocation:Management, member=3): Service Management joined the cluster with senior service member 1
2011-06-24 17:16:14.291/20.273 Oracle Coherence GE 3.7.0.0 <D5> (thread=DistributedCache, member=3): Service DistributedCache joined the cluster with senior service member 1

  1. 인메모리(in-memory): 디스크가 아닌 주 메모리에 모든 데이터를 보유. 상대적으로 인 메모리 자료 접근은 디스크 검색보다 훨씬 빠르다. [본문으로]
  2. Coherence Query Language: "CQL" 이라는 약자는 "Continuous Query Language"가 사용하고 있답니다. -_- [본문으로]
반응형
//

기본 포트 사용 주의!!!!!!!

Posted at 2011. 6. 9. 16:41 | Posted in Server
반응형
공부용으로 쓰려고 집에다가 데스크탑 한대 박아놓고 이것저것 깔아서 서버로 쓰고 있습니다.

그러던 어느날 우분투에 깔려있던 proftpd 로그를 보니까 아주 그냥....

May 09 12:56:22 nerv.kr proftpd[20723] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): FTP session opened.
May 09 12:56:22 nerv.kr proftpd[20723] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER access: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:23 nerv.kr proftpd[20723] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER access: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:24 nerv.kr proftpd[20723] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER access: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:24 nerv.kr proftpd[20723] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): Maximum login attempts (3) exceeded, connection refused
May 09 12:56:24 nerv.kr proftpd[20723] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): FTP session closed.
May 09 12:56:24 nerv.kr proftpd[20724] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): FTP session opened.
May 09 12:56:24 nerv.kr proftpd[20724] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER account: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:25 nerv.kr proftpd[20724] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER account: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:26 nerv.kr proftpd[20724] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER account: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:26 nerv.kr proftpd[20724] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): Maximum login attempts (3) exceeded, connection refused
May 09 12:56:26 nerv.kr proftpd[20724] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): FTP session closed.
May 09 12:56:26 nerv.kr proftpd[20725] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): FTP session opened.
May 09 12:56:26 nerv.kr proftpd[20725] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER accounts: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:27 nerv.kr proftpd[20725] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER accounts: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:27 nerv.kr proftpd[20725] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER accounts: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:27 nerv.kr proftpd[20725] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): Maximum login attempts (3) exceeded, connection refused
May 09 12:56:27 nerv.kr proftpd[20725] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): FTP session closed.
May 09 12:56:27 nerv.kr proftpd[20726] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): FTP session opened.
May 09 12:56:28 nerv.kr proftpd[20726] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER adam: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:29 nerv.kr proftpd[20726] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER adam: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:29 nerv.kr proftpd[20726] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): USER adam: no such user found from ::ffff:121.22.24.61 [::ffff:121.22.24.61] to ::ffff:220.86.83.16:21
May 09 12:56:29 nerv.kr proftpd[20726] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): Maximum login attempts (3) exceeded, connection refused
May 09 12:56:29 nerv.kr proftpd[20726] nerv.kr (::ffff:121.22.24.61[::ffff:121.22.24.61]): FTP session closed.

A 부터 시작해서 무작위로 로그인을 하고 있네요....



아이피 추적을 해보니 중국으로 나오는군요...

일단은 언넝 서버 내리고 다른 포트로 바꿔 놨는데... 기본 포트 무서워서 사용 못하겠습니다. ㅠㅠ

이거 어떠케 해야하나.... ㅠ_ㅠ



121.22.24.61 Whois

% [whois.apnic.net node-4]
% Whois data copyright terms http://www.apnic.net/db/dbcopyright.html

inetnum: 121.16.0.0 - 121.23.255.255
netname: UNICOM-HE
descr: China Unicom Hebei province network
descr: China Unicom
country: CN
admin-c: CH1302-AP
tech-c: KL984-AP
remarks: service provider
mnt-by: APNIC-HM
mnt-lower: MAINT-CNCGROUP-HE
mnt-routes: MAINT-CNCGROUP-RR
status: ALLOCATED PORTABLE
remarks: -+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+
remarks: This object can only be updated by APNIC hostmasters.
remarks: To update this object, please contact APNIC
remarks: hostmasters and include your organisation's account
remarks: name in the subject line.
remarks: -+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+
changed: 20060508
changed: 20080314
changed: 20090508
source: APNIC

route: 121.16.0.0/13
descr: CNC Group CHINA169 Hebei Province Network
country: CN
origin: AS4837
mnt-by: MAINT-CNCGROUP-RR
changed: 20060509
source: APNIC

person: ChinaUnicom Hostmaster
nic-hdl: CH1302-AP
e-mail:
address: No.21,Jin-Rong Street
address: Beijing,100140
address: P.R.China
phone: +86-10-66259940
fax-no: +86-10-66259764
country: CN
changed: 20090408
mnt-by: MAINT-CNCGROUP
source: APNIC

person: Kong Lingfei
nic-hdl: KL984-AP
e-mail:
address: 45, Guang An Street, Shi Jiazhuang City, HeBei Province,050011,CN
phone: +86-311-86681601
fax-no: +86-311-86689210
country: cn
changed: 20090206
mnt-by: MAINT-CNCGROUP-HE
source: APNIC

121.22.24.61 Website Information

Title:

Welcome to BERIS - ??

Description:

n/a

Keywords:

n/a

121.22.24.61 Server Details

IP address:

121.22.24.61

Server Location:

Hebei, Hebei in China

ISP:

China Unicom Hebei province network


반응형
//

Sudoku

Posted at 2011. 6. 9. 15:33 | Posted in Mini Project
반응형
http://antop.nerv.kr/sudoku

※ 혹시나 해보고 에러 찾으면 댓글 달아주세요~ >.,<

드디어 완성이 되었네요...

서버단의 처리보다 화면(UI)의 구성에 더 투자했습니다. (화면 80%, 서버 20%)

서버단은 어노테이션(@) 방식으로 구현했습니다. 확실히 편하긴 하네요...

하지만 관리 측면에서는 xml 로 설정하는게 좋을 듯....?


프레임워크:

기타



소스 파일입니다.



테이블 스키마 파일입니다. (phpmyadmin 으로 export 함)



문제 데이터 입니다. (phpmyadmin)



반응형

'Mini Project' 카테고리의 다른 글

Image Pyramid  (0) 2014.01.30
Proftpd Manager  (0) 2012.12.10
게시판 2.0  (5) 2011.07.27
간단한 JAVA 실행기(?)  (1) 2011.03.21
Forecast Repository  (8) 2010.11.30
Sales History API  (2) 2010.05.27
Order Entry API  (0) 2010.05.13
Human Resources API  (0) 2010.05.10
게시판 1.0  (1) 2010.03.11
비밀번호 생성기(Generate Password)  (1) 2010.02.10
//
반응형
Introduction

전에 3장에서 각각의 Human Task 폼(화면)을 자동으로 만들었습니다.


이 챕터에서는 ADF(application Development Framework)라는 것으로 화면을 수동으로 만들어 봅시다.

※ 총 3개의 프로젝트를 새로 만들어야 하는데.. 너무 양이 많아서  처음 1개의 프로젝트만 새로 만들어 보겠습니다.

※ 어느정도 익숙해지면 pdf(원서) 보고하는게 더 빠를 것입니다. ㅎㅎ



Task forms for entering a quote

Setup

자동으로 만들었던 Human Flow UI 를 지우고 수동으로 새로 만들겠습니다.

EnterQuoteUILab 프로젝트를 삭제합니다.


파일까지 싸악~ 삭제합니다.




Create a new UI project

Application 메뉴에서 New Project... 클릭.


Generic Project 프로젝트를 선택합니다.



아무것도 없는 빈 프로젝트가 생성됩니다.


Create Business Components

프로젝트 위에서 오른쪽 버튼 클릭 후 New 클릭.


Business Components from Tables 를 선택합니다.



Connection 오른쪽의 추가 버튼(녹색 플러스)을 클릭합니다.



0장(Chapter 0) 에서 만들었던 quote 디비 정보를 입력합니다.



OK 버튼을 클릭합니다.



Package: enterquoteui.adfbc


Query 버튼을 클릭하면 quote 스키마의 테이블들이 Available 목록에 나옵니다.


PRODUCT, TERM 테이블을 선택하고 가운데에 오른쪽으로 가는 화살표를 클릭하여 Selected 목록으로 옮깁니다.


Next 버튼 클릭. (아직 Finish 하면 안됩니다!)



2단계(Step 2)에서는 할 것이 없습니다. Next 버튼 클릭.



3단계에서 1단계에서 했던 것과 같은 작업을 합니다. Next 버튼 클릭.



4단계에서 Finish 버튼을 클릭합니다.



EnterQuoteUILab(프로젝트) - Application Soureces - enterquote.adfbc - AppModule 를 편집합니다.



Configurations 탭으로 이동합니다.


AppModuleLocal 선택 후 수정(연필) 버튼을 클릭합니다.



Connection Type 을 JDBC DataSource 를 선택 하고 Datasource Name 은 jdbc/quoteDB 로 변경합니다.



AppModuleShared 도 같은 값으로 변경합니다.



모두 저장합니다.


Create Task Flow

이제부터 UI(화면)를 만들어 봅시다.

프로젝트(EnterQuoteUILab)에서 오른쪽 버튼 클릭 후 New 클릭.

Web Tier - JSF 분류에서 ADF Task Flow Based on Human Task 를 선택합니다.

BPM의 Human Task 를 기반으로 ADF UI 를 만드는 겁니다.


QuoteProcessLab 프로젝트 안에 EnterQUoteDetails.task 파일을 선택합니다.



Create Train 을 체크합니다.



taskDetails1_jsp(View)가 만들어져 있는데 삭제합니다.



View 컴포넌트를 추가합니다. 이름은 enterHeader.



아래와 같이 차례대로 View 컴포넌트를 4개 더 추가합니다.


각각 이름은 selectProduct, requestDiscount, requestTerms, submit 입니다.


그 후 Control Flow Case 로 submit(View)와 taskReturn 을 연결합니다.



enterHeader 뷰를 선택 후 Mark Default Activity 버튼을 클릭합니다.



기본 흐름이 완성 되었습니다.




Create a form for entering the quote header data

일단 템플릿이 들어있는 라이브러를 프로젝트에 추가시켜 봅시다.

리소스 팔레트(View - Resource Palette)에서 커넥션을 하나 추가합니다.


Connection Name: SalesQuoteUIadflib




경로는 이 라이브러리 파일이 들어있는 폴더(디렉토리)를 선택합니다.



그럼 지정한 폴더 안에 있는 파일들이 표시됩니다.


그 중에 adflibSalesQuoteUITemplates.jar 파일을 프로젝트에 추가시킵니다.



enterHeader 뷰를 더블클릭합니다.



템플릿으로 Oracle BPM 11gR1 Training - Enter Header Template 를 선택합니다.



Data Controls 패널에서 EnterQuoteUILab_EnterQuoteDetails - getTaskDetails(...) - Return 까지 이동합니다.


※ 앞으로 여기가 데이터의 기준이 됩니다. (한군대에선 빼고...)


Task 를 UI 화면 상단 오른쪽의 task-action 부분(facet)에 드래그 앤 드랍합니다.



Human Task - Task Action 을 선택합니다.


※ 앞으로 4개의 뷰를 더 만들텐데 이 작업은 항상 똑같습니다.



Task - Payload - Quote Request - Summary 를 task-summart 부분에 드래그 앤 드랍(이하 추가) 합니다.



Form - ADF Form 선택.



NewCustomer, TotalNetRevenue, EffectiveDiscount 필드는 삭제합니다.



OK 버튼 클릭.



구조 팔레트 부분을 보면 화면의 내용물(?)들이 트리 형태로 잘 보입니다.


방금 추가한 폼을 선택 합니다.


   


그리고 Property Inspector(이하 프로퍼티) 팔레트 부분은 선택한 부분의 속성들을 변경 할 수 있습니다.


MaxColumns: 3

Rows: 1


변경합니다.



Address 데이터 컨트롤을 task-summary-address 부분에 추가 후 ADF - ADF Forms 선택. 설정 창은 그냥 OK.



Panel Collection 컴포넌트를 task-summary-contacts 부분에 추가합니다.



Contacts 데이터 컨트롤을 추가한 Panel Collection 영역에 추가 후 Table - ADF Table 선택.


설정 창은 그냥 OK 합니다.



Panel Collection 컴포넌트의 toolbar 부분에 Toolbar 컴포넌트를 추가합니다.



추가한 툴파 영역에 Contacts - Operations - Create 를 추가합ㅎ니다.



ADF Toolbar Button 클릭.



Delete 를 바로 다음에 추가합니다. 마찬가지로 ADF Toolbar Button 클릭.



처음 추가한 버튼의 Text 속성을 Add 로 변경합니다.



완성된 화면 입니다.



모두 저장합니다.



Create a form for adding products to the quote


프로젝트에서 마우스 오른쪽 버튼 클릭 - Project Properties 클릭.


Libraries and Classpath 로 이동 후 Add JAR/Directory 버튼을 클릭합니다.





라이브러리 파일을 선택합니다.



OK 버튼 클릭.



Task Flow 설정 화면을 엽니다. (파일 위치: {프로젝트}/Web Content/WEB-INF/EnterQuoteDetails_TaskFlow.xml)


Overview 탭으로 이동 후 Managed Beans  탭으로 이동합니다.


추가(Add) 버튼을 클릭합니다.



Name: dropProduct


Class 필드에서 오른쪽에 화살표 클릭 후 Edit 클릭.



enterquoteui.backing.DropProduct 클래스를 선택합니다.



Scope: session



같은 방법으로 2개를 더 추가합니다.


Name: discountHelper

Class: enterquoteui.backing.DiscountHelper

Scope: session


Name: termChoices

Class: enterquoteui.backing.TermChoices

Scope: session



selectProduct 뷰를 편집합니다.



Select Prodcut Template 선택.



Task 데이터 컨트롤을 상단 오른쪽의 task-action 부분에 추가 후 Human ATask - Task Action 선택.


※ 이제 이 부분은 빼겠습니다. 다음 3개의 View를 만들때 맨 처음 해주세요.


available-products 부분에 Panel Collsction 컴포넌트(레이아웃 컨테이너)를 추가합니다.


데이터 컨트롤 중에 AppModuleDataControl - ProductView1 을 available-products의 패널에 추가합니다.



Table - ADF Read-only Table 선택.



Category, Imageurl 필드는 삭제합니다.



Multiple Rows 선택 후 OK 버튼을 클릭합니다.



selected-rpoducts 부분에 Panel Collection 컴포넌트 추가 후 Product Item 을 추가합니다.



RequesteDiscount, ControlledAvailability 필드는 삭제합니다.



Data Source(Operations) 컴포넌트를 Available Products 테이블에 추가합니다.



화면에는 보이지 않으니 구조 팔레트에서 선택합니다.



아래와 같이 속성을 바꿔줍니다.


Actions: COPY

DefaultAction: COPY

Discriminant: productItem



Collection Drop Target(Operations) 컴포넌트를 Selected Products 테이블에 추가합니다.



DropListener 오른쪽에 화살표 클릭 후 Method Expression Builder 선택.



ADF Managed Beans - dropProduct - HandleDrop 을 선택합니다.



OK 버튼 클릭.



추가한 Collection Drop Target 컴포넌트의 속성은 아래와 같이 변경합니다.


Actions: COPY

ModalName: prodcutItem



완성된 화면입니다. 모두 저장합니다.




Create a form for request discount

requestDiscount 뷰를 편집합니다.


Request Discount Template 선택.



Summary 데이터 컨트롤을 summary 부분에 추가 후 ADF Form 선택.



TotalNewRevenue, EffectiveDiscount 만 남기고 나머지 필드들은 삭제합니다.



Form 패널의 속성을 아래와 같이 변경합니다.


MaxColumns: 2

Rows: 1



두 필드를 선택합니다. (컨트롤키를 이용)



ReadOnly 속성을 true 로 변경합니다.



NetRevenue 필드만 선택합니다.



Value 속성 오른쪽에 화살표 클릭 후 Expression Builder 를 선택합니다.



입력되어 있던 값 삭제 후 ADF Managed Beans - discountHelper - netRevenue 를 입력합니다.



EffectiveDiscount 필드는 discountHelper - effectiveDiscount 를 입력 해줍니다.


discounts-table 부분에 Panel Collection 컴포넌트를 올리고 Product Item 데이터 컨트롤은 추가합니다.


RestrictedItem, ControlledAvailability 필드는 삭제합니다.



discount-table 부분에 추가했던 Panel Connection 컴포넌트의 StyleClass 를 AFStretchWidth 로 설정합니다.


화면의 가로 길이에 따라 가로 크기가 최대로 늘어나게 됩니다.



ProductId, ProductName, ListPrice, PreApprovedDiscount 필드(칼럼 아님!)를 선택합니다.



readOnly 속성을 true로 변경합니다.



Requested Discount 칼럼을 Quantity 오른쪽으로 이동시킵니다.



Quanity 필드를 선택하면 오른쪽에 나오는 버튼 클릭 후 Convert To 클릭.



Input Number Spinbox 선택.



변환 하게되면 MaximumLength 속성이 없어진다고 하는것 같습니다. -_-;;;



Quantity, Requested Discount 필드를 선택합니다.



autoSubmit 속성을 true 로 변경합니다.



Quantity 칼럼 선택 후 id 속성을 cQuantity 로 변경합니다.


   


Requested Discount 칼럼 선택 후 id 속성을 cRequestedDiscount 로 변경합니다.


  


From 에서 NetRevenue, EffecitveDiscunt 필드 선택합니다.



Partial Triggers 속성을 설정합니다.



아래와 같이 선택합니다.



테이블에서 Product Name 칼럼의 id 값을 적어 놓습니다.


  


테이블의 ColumnStretching 속성을 설정합니다.



완성된 화면입니다.




Create a form for adding terms and conditions to the quote


requestTerms 뷰를 편집합니다.



Request Terms Template 을 선택합니다.



business-terms 부분에 Panel Collection 추가 후 License Term 데이터 컨트롤을 추가합니다.



Table - ADF Table 선택.



Select One Choice 컴포넌트를 Category 칼럼에 추가합니다.



Value: #{termChoices.categoryChoices} (ADF Managed Beans - termChoices - categoryChoices 선택)


Next 버튼 클릭.



Label: Category

Value: #{row.bindings.Category.inputValue} (같은 칼럼의 text 필드의 Value 속성 값)



Select One Choice 컴포넌트를 Type 칼럼에 추가합니다.



Value: #{termChoices.termTypeChoices}


Next 버튼 클릭.



Label: Type

Value: ${row.bindings.Type.inputValue}



추가 후 남아있는 텍스트 필드 두개를 삭제 합니다.


그리고 Create, Delete Operations 두개를 툴바로 추가합니다



바인딩을 하나 추가해줘야 합니다.


Bindings 탭으로 이동 후 컨트롤 바인딩을 추가합니다.



table 을 선택합니다.



Data Collection: AppModuleDataControl - TermView1


Select an Iterator 오른쪽에 New 버튼을 클릭합니다.



OK 버튼 클릭.



Available Attributes 목록에 있는 필드를 전부 Display Attributes 목록으로 옮깁니다.


OK 버튼을 클릭합니다.



아래와 같이 바인딩이 추가 되었습니다.




Create a submit form


마지막으로 submit 뷰를 편집합니다.



Submit Template 탬플릿을 선택합니다.



quote-summary 부분에 Summary 데이터 컨트롤을 추가합니다.


AccountName, SlaesRepName, TotalNetRevenue, EffectiveDiscount, ValidUntil 만 남기고 다른 필드는 삭제합니다.



TotalNetRevenue, EffectiveDiscount 필드의 readOnly 속성을 true 로 설정합니다.


products-discount 부분에 Panel Collection 컴포넌트를 추가합니다.


Product Item 데이터 컨트롤을 추가합니다.



ProductId, ProductName, Quantity, RequestedDiscount 필드만 남기고 삭제합니다.



license-terms 부분에 Panel Collection 컴포넌트 추가 후 License Term 데이터 컨트롤을 추가합니다.


마지막으로 Task 테이터 컨트롤을 comments 부분에 추가 후 Human Task - Task Comment And Attachment 클릭.


완성된 화면입니다.





Test

배치(Deploy) 후 bpm workspace에 접속합니다. (jcooper 계정으로 로그인)

프로세스를 하나 구동(?) 시킵니다.


enterHeader 화면입니다. Industry 값을 입력 후 2단계로 이동합니다.



2단계(selectProduct) 제품을 드래그 앤 드랍으로 선택할 수 있습니다.



3단계(requestDiscount) 화면은 수량과 할인율을 설정하는 화면입니다.



4단계 화면(requestTerms).



마지막 확인 화면(submit).







반응형
//
반응형
Implementing Approve Quote

Configuring the Human Task

ArroveDeal.task 파일을 열어 수정합니다.



Data 탭으로 이동합니다.

파라미터를 추가합니다. (other parameter)



Element 선택 후 찾기(돋보기) 버튼 클릭.



Quote.xsd - ApprovalFlow 선택.



OK 버튼 클릭.



quote.xsd - ApproveTaskInfo 도 같은 방법으로 추가해 줍니다.


General 탭으로 이동합니다.

Task Title 의 콤보를 Text and Xpath 으로 변경 후 XPath builder 버튼을 클릭합니다.



아래와 같이 입력합니다. (Schema 에서 찾아서 Insert 하는게 편함. ㅋㅋ)



앞에 "Approve Deal for " 를 붙여 줍니다.



Owner 콤보를 User 로 선택 후 찾기(돋보기) 버튼을 클릭합니다.



jstein 유저를 찾아서 선택합니다.



jstein 유저 확인. (직접 입력 해도 됨.)



Assignment 탭으로 이동합니다.

Stage1 부분을 더블 클릭 합니다.



Stage Name: Tier3



default.DefaultPerformer 더블 클릭.



Type: Serial
Label: SalesManagement



Build a list of particlpants using: Management Chain

Value-based 선택 후 유저(User) 추가.



데이터 타입(Data Type)을 수식(By Expression)으로 변경합니다.



... 버튼 클릭.



Identity Service Functions 에 있는 getManager() 함수를 이용하여 아래 조건식은 만듭니다.



Number of Levels: XPath

오른쪽에 XPath Builder 버튼을 클릭합니다.



아래와 같이 입력합니다.



완성된 Participant 수정 화면 입니다.

OK 버튼을 클릭합니다.



다시 Assignment 탭 화면 입니다.

Tier3(Stage)를 선택 하고, Sequential stage 를 추가합니다.



Tier3 아래에 stage 가 생성됩니다.

이름(Name)을 Tier2 로 변경 후 <Edit Participant> 부분을 더블 클릭 합니다.



아래와 같이 설정합니다.

유저의 수식은 /task:task/task:payload/ns0:ApprovalFlow/ns0:Tier2Approvers 입니다.



한번더 Tier2 아래에 스테이지를 추가합니다.



추가한 스테이지의 이름을 Tier1 으로 변경하고 <Edit Paricipant> 더블 클릭.



아래와 같이 설정 합니다.

Name 오른쪽의 찾기 버튼을 클릭합니다.



Tier1ApprovalGroup 를 선택합니다.

※ 만약 여기서 Tier1ApprovalGroup 이 보이지 않느다면 그냥 수동으로 입력합니다.



OK 버튼을 클릭합니다.



Adding a data assignment

BPM Project Navigator 에서 QuoteProcessLab 를 편집합니다.

Approve Deal 액티브티를 더블 클릭하여 수정 합니다.



Implementation 탭에서 Edit Data Associations 버튼을 클릭합니다.



approvalFlow 데이터를 Input 쪽에 넣어줍니다.



Deploy the application

모두 저장 후 배치(Deploy) 합니다.



Running

Creating the approval group

Tier1ApprovalGroup 이 존재하는지 확인해봅시다.

BPM Workspace 에 접속합니다. (weblogic 관리자 계정으로 로그인)

Administration - Approval Groups 로 이동합니다.

Tier1ApprovalGroup 그룹이 없으면 만들고 그룹에 속한 유저로 cdoyle 를 등록해줍니다.

※ 전 그룹이 이미 만들어져 있었습니다. -_-;




Hierarchy of users

아래 그림은 테스트할 유저들의 조직도입니다. 이 조직도를 잘 봐야 합니다.



Instantiate a new process

jcooper 계정으로 bpm workspace 에 로그인하여 주문의 만듭니다.

이때 주문자를 wshake 계정으로 합니다.


비지니스 룰(Business Rule)에 따라 결제가 어떻게 달라지는지 테스트 해보겠습니다.

아래 그림의 3가지 조건을 테스트 해보겠습니다.



R1 조건

아래 그림 흐름을 보면 이해가 될 것입니다. (안돼면......)

Approval Deal 에서 NumOfTeir3Levels 값에 의해서 주문자(wshake) 보다 한단계(0) 위에 있는 사람(rsteven)까지 결제를 하게 됩니다.




R2 조건

discount가 0.4 가 되서 NumOfTier3Levels 가 1이 됩니다.

그럼 Approve Deal 의 Tier3에서는 2단계 위의 사람(rsteven, jsteion)까지 결제를 하게 됩니다.




R5 조건

비지니스룰의 결과에 따라 NumberOfTier3Levels 가 2가 되고, Tier2 단계의 결제자가 2명이 되었습니다.



주문자(wshake)를 기준으로 NumOfTier3Levels 값에 따른 결제자의 목록입니다.







반응형
//
반응형
Introduction

정해진 업무의 규칙에 따라서 처리를 하게 할 수 있습니다.



Creating and Using New Business Rules

Adding Business Rules Activity

QuoteEntered(Measurement)와 IS Business Practices Review required?(XOR) 사이에 Business Rule 액티브티를 추가합니다.



Name: Determine Approvals




Adding Data Object to hold rules results

Business Object 를 추가합니다.



Name: ApprovalFlow
Destination Module: Data

Based on External Schema 체크 후 찾기 버튼 클릭.



Quote.xsd - ApprovalFlow 선택.



OK 버튼을 클릭합니다.



RequestQuoteLab BPM 편집 화면의 구조 패널에서 Process Data Object 를 추가합니다.



Name: approvalFlow
Type: <Component>

찾기(돋보기) 버튼을 클릭합니다.



ApprovalFlow 선택.



OK 버튼을 클릭합니다.




Creating new Rules Dictionary[각주:1]

DeterMine Approvals(Business Rule)를 더블클릭하여 편집 합니다.

Implementation 탭으로 이동 후 Business Rule 을 추가합니다. (녹색 + 버튼)

 



Name: ApprovalRules

Input Data Object 를 추가합니다.



RequestQuoteLab - quote 를 추가합니다.



방향(Direction)을 출력(Output)으로 변경 후 approvalFlow 를 추가합니다.


OK 버튼을 클릭하면 Business Ruels Dictionary 이 만들어집니다.




Bind Business Rules Activity to Implementation

Use Associations 체크 후 편집(연필) 버튼을 클릭합니다.

 



입력에는 quote, 출력에는 approvalFlow 를 넣어줍니다.




Defining Rules

Now it's time to define the rule within the dictionary you just created.


Adding Decision Table Rules

ApprovalRules.rules 를 열어서 편집합니다.



Globals 탭으로 이동합니다.

추가 버튼을 클릭합니다.



Name: preApprovedDiscount
Type: double

Value 오른쪽의 Expression builder 버튼을 클릭합니다.



0.3 을 입력합니다.



Final 체크 후 OK 버튼을 클릭합니다.



같은 방법으로 추가합니다.

Name: tier2Approvers-base
Type: String
Value: "wfaulk" // 쌍따옴표(") 포함!



Name: tier2Approvers-high
Type: String
Value: "wfaulk,jlondon"



총 3개의 글로벌 변수(인듯?)가 추가되었습니다.



Bucketsets 탭으로 이동합니다.

추가 버튼 클릭 - List of Ranges 클릭.



Bucketset3 이 추가되었습니다. 선택 후 편집 버튼을 클릭합니다.



Name: DiscountBuckets

아래와 같이 4개의 Range Bucket Values 를 설정합니다.



또 하나의 Bucketset 을 추가합니다.

Name: RevenueBuckets

아래와 같이 Range Bucket Values 를 추가합니다.



2개의 Bucketset 을 추가하였습니다.



Ruleset1 탭으로 이동합니다.



DecisionTable1 이라고 되어 있는 이름을 ApprovalMatrix 로 변경합니다.



조건(condition)을 추가합니다.



<edit condition> 부분을 더블클릭 후 수식편집(Expression Builder) 버튼을 클릭합니다.



Variables 탭에서 QuoteSummaryType - effectiveDiscount 를 선택 후 Insert Into Expression 버튼을 클릭합니다.



뒤에 <=  를 입력하고 Constants 탭에서 preApprovedDiscount 를 수식에 추가합니다.



수식이 완성되었습니다. OK 버튼을 클릭합니다.



조건을 하나 추가 후 <edit condition> 더블 클릭 후 effectiveDiscount 를 선택합니다.



조건 추가 후 totalNetRevenue 를 선택합니다.



아래와 같이 3개의 조건이 추가 되었습니다.


두번째 조건(QuoteSummary.effectiveDiscount) 선택 후 Local List of Ranges 콥보 클릭 후 DiscountBuckets 선택.



세번째 조건(QuoteSummaryType.totalnetRevenue)은 RevenueBuckets 를 선택합니다.



Assert New 액션을 추가합니다.



assert new 부분을 더블클릭 합니다.



Facts: ApprovalFlowType

Properties 에 나오는 모든 Parameterized 를 체크합니다.



아래와 같이 액션이 만들어졌습니다.



R1 아래 첫번째 라인(C1)의 ? 를 클릭 후 true 를 체크합니다.



Rule 을 추가합니다.



새로 추가된 룰(R1)에 첫번째 라인(C1) ? 를 클릭 후 false 를 선택합니다.



그러면 false 로 선택한 Rule 이 두번째로 이동 했습니다. (햇갈리지 마세용!)

R2 의 두번째 라인(C2) ? 를 클릭 후 <0.3 과 (0.3, 0.6) 을 체크합니다.



이런식으로 R4 까지 완성 합니다.

나머지 설정 안한 ? 부분은 해당 셀에서 오른쪽 버튼 클릭 후 Don't Care 를 클릭합니다.



? 표시가 - 표시로 바뀌었습니다.

Action 쪽도 아래 그림처럼 완성해줍니다.



R4 의 Confilict 셀(R3)을 더블클릭합니다.



Resolution 칼럼의 콤보를 Override 로 변경합니다.



비지니스 룰(Business Rule)이 완성되었습니다.



아래의 흐름(Flow)을 수정합니다.



아래와 같이 조건을 변경합니다.

비지니스 룰을 거쳐서 나온 결과를 비교합니다.




Testing

인스턴스 생성 후 EM에서 확인해봅시다.



비지니스 룰을 거쳐 갔습니다.

출력 데이터를 확인 해봅시다.




이 부분에 대해서는 9장에서 자세히 다루겠습니다.





9장 후다닥하느라 8장까지 완료한 소스를 따로 안 빼놨네요 -_-;;;
  1. (컴퓨터의) 사전[딕셔너리] [본문으로]
반응형
//
반응형
Introduction

In this exercise, you publish the BPM Project to MDS and open the published project in Process Composer. In addition, you also convert the BPM Project as a template and open this template inside Process Composer to create a new project.

Objectives

After completing this lesson, you will know how to:
  • Publish BPM projects inside BPM Studio to MDS.
  • Open published BPM Projects inside Process Composer
  • Convert BPM Project to template and publish template to MDS
  • Create new BPM Project out of template inside Process Composer


Set up MDS Connection

Resource Palette 에서 Database Connection 을 추가합니다.



접속 정보를 입력합니다.

Connection Name: bpm_ps3_db

BPM 도메인 생성시 설정했던 데이터베이스 스키마중 하나("{접두어}_MDS")입니다.



SOA-MDS Connection 을 추가합니다.



Connection Name: bpm_ps3_mds
Connection Type: DB Based MSD
Connection: bpm_ps_db (방금 만들었던 데이터베이스 커넥션)



BPM MDS Navigator(안보이면 View - BPM MSD Navigator)에서 커넥션을 설정합니다.



MDS Connections: bpm_ps3_mds (방금 만들었던 SOA_MSD 커넥션)



아래와 같이 두개의 폴더가 표시됩니다.




Publish BPM Project in BPM Studio to MDS

BPM Project Navigator 에서 QuoteProcessLab 선택 후 마우스 오른쪽 버튼 클릭 - Public to BPM MDS 클릭.



Project Name: QuoteProcessLab

Override 체크 후 Location 에서 폴더를 추가합니다.



Name: QuoteToCashLab



OK 버튼 클릭.



BPM MDS Navigator 에 보면 발행(Publish)된 것을 볼 수 있습니다.





View the Published BPM Project

BPC(Business Process Composer)에 접속합니다. (weblogic 계정으로 로그인)



화면에 발행한 BPM 프로젝트가 보입니다. 제목을 클릭합니다.



아래와 같이 볼 수 있습니다.




Publish process template to MDS

BPM Project Navigator 에서 QuoteProcessLab 선택 후 마우스 오른쪽 버튼 클릭 - Convert to template 클릭.



아래와 같이 경고가 나옵니다. 되돌릴 수 없다고 합니다...

이 부분부터 진행을 하게 되면 이 프로젝트는 일반 BPM 프로젝트가 아니라 템플릿 프로젝트가 됩니다.

서버에 직접 배치도 안됩니다.



Approve Terms 액티브티를 편집합니다.



Permissions: Must implement



액티브티 이미지에 아이콘이 하나 더 달렸습니다.



MDS에 발행합니다.

여기서 보면 위치가 Templates 아래인 것을 확인할 수 있습니다.





Creating a new BPm Project from a template

BPC에 접속(weblogic 계정) 후 Create New Project 를 클릭합니다.

1단계
전에 배포한 QuoteProcesslab 선택.

2단계
Name: QuoteProcessLab_Custom
Enable Sharing, Begin editing new 체크

3단계
Next 버튼 클릭.



4단계
Respository - QuoteToCashlab 선택.

5단계
뭔지 몰름 -_-;;

6단계
Create 버큰 클릭.



QuoteProcessLab_Custom 편집 화면 입니다.

보면 오른쪽에 컴포넌트 팔레트가 있고, Approve Terms 에 빈 조각 구멍이 나 있습니다.


컴포넌트 팔레트는 Basic Flow Objects, BPMN Flow Objects, Business Catalog 3개로 구성되어 있습니다.

 


ApproveTerms(Suman Task)를 구멍난 Approve Terms 에 드래그합니다.



구멍이 채워졌습니다!!

채워진 Approve Terms 선택 후 Data Association 버튼을 클릭합니다.



아래와 같이 Data Object 를 넣습니다.



validate 버튼을 클릭합니다.



에러가 없다고 나옵니다. Save 버튼을 클릭하여 저장합니다.



Editing 상태의 버튼을 클릭하여 발행(Publish) 합니다.



Tools 클릭 - Deploy Project 클릭. 배치합니다.



New Revision ID: 1.0
Deployer username: weblogic
Password: welcome1
Deploy Target: default

Deploy 버튼 클릭.



배치가 완료 되었습니다.


※ 그냥 배치를 해보면 네임스페이스가 중복된다면서 배치가 안될 것입니다.

기존에 배치되어 있던 QuoteProcessLab 조합(Composite)을 배치 해제한 후 배치해 봅시다.





반응형
//
반응형

Setting Up for Monitoring with Oracle BAM


Configuring BAM Adapter


웹로직 콘솔에 접속합니다.

디플로이(Deployments) 화면에서 OracleBamAdapter 선택.



Configuration 탭 - Outbound Connection Pools 탭으로 이동합니다.

eis/bam/soap 클릭.



BAM 서버의 정보에 맞게 입력합니다.

HostName: localhost
Password: welcome1
PortNumber: 9101
UserName: weblogic

Save 버튼 클릭.


적당한 위치에 BAM Plan 파일을 저장합니다.



다시 디플로이 목록에서 OracleBamAdapter 선택 후 Update 버튼 클릭.


Finish 버튼 클릭.



Configuring BPM Engine for BAM Integration

Enterprise Manager(EM)에 접속합니다.

왼쪽 메뉴에서 Farm_{DOMAIN_NAME} - WebLogic Domain - soa_server 선택합니다.

WebLogic Server 콤보(selectbox)를 선택 후 System MBean Browser 선택.



왼쪽 트리에서 Application Defined MBeans - oracle.as.soainfra.config - Server: soa_server1 - BPMNConfig - bmpn 선택.

MBean 속성 정보에서 DisableActions 값을 삭제합니다.

Apply 버튼 클릭.



Importing BAM Monitor Express

Monitoring Express 샘플을 설치합니다.

콘솔에서 작업합니다.

// 미들웨어 홈 환경변수 등록
$ export MW_HOME=/home/weblogic/app/11.1.1.4.0
// 설정파일 수정
$ vi $MW_HOME/Oracle_SOA1/bam/config/BAMICommandConfig.xml

<BAMICommand>
  <!-- 추가 -->
  <ICommand_Default_User_Name>weblogic</ICommand_Default_User_Name>
  <ICommand_Default_Password>welcome1</ICommand_Default_Password>
  <!--// 추가 -->
  <ADCServerName>localhost</ADCServerName>
  <ADCServerPort>9101</ADCServerPort>

// 자바 홈 환경변수 등록
$ export JAVA_HOME=/usr/lib/jvm/java-6-sun
// monitoring express 설치 실행 디렉토리로 이동
$ cd $MW_HOME/Oracle_SOA1/bam/samples/bam/monitorexpress/bin
// 설치 실행
$ ./setup.sh

BAM Home =/home/weblogic/app/Oracle_SOA1/bam
Using JAVA_HOME=/usr/lisb/jvm/java-6-sun
Creating the Data Objects

Oracle BAM 명령 유틸리티 [빌드 13846, BAM 저장소 버전 2025] Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
"/home/weblogic/app/Oracle_SOA1/bam/samples/bam/monitorexpress/data_objects/MonitorExpress_DataObjects.xml" 파일에서 임포트하는 중입니다.
/Samples/Monitor Express 폴더가 생성되었습니다.
"/Samples/Monitor Express" 폴더에 데이터 객체 "COMPONENT" 생성 중...
데이터 객체 "/Samples/Monitor Express/COMPONENT"이(가) 생성되었습니다.
"INSTANCE_IDS" 인덱스가 생성되었습니다.
임포트할 내용 섹션이 없습니다.
데이터 객체가 성공적으로 임포트되었습니다(0개 행).
"/Samples/Monitor Express" 폴더에 데이터 객체 "INTERVAL" 생성 중...
데이터 객체 "/Samples/Monitor Express/INTERVAL"이(가) 생성되었습니다.
"UPDATE_INDEX" 인덱스가 생성되었습니다.
임포트할 내용 섹션이 없습니다.
데이터 객체가 성공적으로 임포트되었습니다(0개 행).
"/Samples/Monitor Express" 폴더에 데이터 객체 "COUNTER" 생성 중...
데이터 객체 "/Samples/Monitor Express/COUNTER"이(가) 생성되었습니다.
"UPDATE_INDEX" 인덱스가 생성되었습니다.
임포트할 내용 섹션이 없습니다.
데이터 객체가 성공적으로 임포트되었습니다(0개 행).
"3" 항목이 성공적으로 임포트되었습니다.
Data Objects successfully created
Creating the Reports

Oracle BAM 명령 유틸리티 [빌드 13846, BAM 저장소 버전 2025] Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
"/home/weblogic/app/Oracle_SOA1/bam/samples/bam/monitorexpress/reports/FaultReport.xml" 파일에서 임포트하는 중입니다.
"/public/Report/Samples/Monitor Express/Sub-reports/Fault Report" 보고서가 성공적으로 임포트되었습니다.
"1" 항목이 성공적으로 임포트되었습니다.

$

// 영어 로그




Configuring BPM Project for BAM Monitoring

BPM Projects Navigator 에서 QuoteProcessLab 에서 오른쪽 버튼 클릭 - Proejct Preferences 클릭.



Category - Process Analytics Summary

Data Targets 탭 선택.

Enable BAM 체크.

Data Object Path: /Samples/Monitor Express




Creating Process Specific BAM Data Object

Oracle BAM 접속. (weblogic 계정으로 로그인)

Architect 버튼 클릭.

/Samples/Monitor Express 폴더에서 BI_default_QuoteProcessLab_RequestQuoteLab 데이터 오브젝트 선택.

Layout 클릭.



Edit Layout 버튼 클릭.



아래와 같이 필요한 필드를 추가해줍니다.


Save changes 버튼 클릭 - Continue 버튼 클릭.




Creating BAM Dashboards

Oracle BAM 접속. (weblogic 계정으로 로그인)

메인 화면에서 Active Studio 버튼 클릭.

Shared Reports 탭으로 이동 후 Create A new Report 버튼을 클릭합니다.



세로 2단 템플릿을 선택합니다.



타이틀 부분은 Request Quote Dashboard 입력.

첫번째 영역은 "3D Bar Chart"를 선택합니다.



그러면 화면 아래쪽에 설정 마법사(?)가 뜹니다.

Data Object: BI_default_QuoteProcessLab_RequestQuoteLab 선택.

Next 버튼 클릭.



필드를 설정합니다.

Group By: METRIC_RANGE_revenueDimesion, METRIC_industry
Chart Values: METRIC_discount
Summary Function(s): Average

Next 버튼 클릭.



Change View Properties 클릭.



General 탭으로 이동합니다.

View title: Discounts by Revenue and Idustry
Vetical Axis Label: Discount%




Data 부분의 Fields 탭으로 이동합니다.

Group By 중에서 industry 를 선택하고 화살표를 이용하여 최상위로 올립니다.

OK 버튼 클릭.



아래의 영역은 Range Gauge 를 선택합니다.



Data Object: BI_default_QuoteProcessLab_RequestQuoteLab 선택 후 Next 버튼 클릭



가운데 콤보는 METRIC_discount 선택.
그 바래 콤보는 Average 선택.

Next 버튼 클릭.



Change View Properties 클릭.



View Title: Discount Gauge
Value display ranges: 0, 30, 65, 90

Apply 버튼 클릭 - OK 버튼 클릭.



Save 버튼 클릭



Shared Reports/Samples/Monitor Express 폴더에 Request Quote Dashboard 이름으로 저장.



저장 되었습니다.




Viewing BAM Dashboards

OracleBAM 로그인 후 Active Viewer 클릭.



Select Report 버튼 클릭.



Shared Reports/Samples/Monitor Express 폴더에 Request Quote Dashboard 선택.



데이터를 좀 넣으면서 보면 실시간으로 갱신 됩니다.


이번에는 샘플로 깔았던 기본 Express Dashboard 를 열어봅시다.



아래와 같이 총 통계를 볼 수 있습니다.





Create an Alert for a High Discount Sales Quote

discount 의 평균이 지정한 수보다 높으면 경고가 나는 Alert 기능을 만들어보겠습니다.

OracleBAM 로그인 후 Active Studio 클릭.



Create A New Alert 버튼 클릭.



시간대를 맞추라고 합니다. 현재 아시아 도쿄로 되어있네요...



Asia/Seoul 로 변경합니다.



OK 버튼 클릭.



Create A Rule 클릭.



Rule Name: HighDiscount Alert

"When a data field in report meets specified conditions" 선택 후 Rule Expression 부분에서 "select report" 클릭.



Request Quote Dashboard 선택.



"this data field has condition of x" 클릭.



Data Objects: BI_default_QuoteProcessLab_ReuquestQuoteLab 선택.

Group Filter 탭으로 이동 후 "add new entry" 클릭.



Field: AVG(METRIC_discount)
Comparison: is greater than or equal to, Value
Value: 65

입력 후 "Add Entry" 클릭. (이걸 클릭 안하면 저장이 안됩니다)



OK 버튼 클릭.



Select an Action 에서 "Send a message via email" 체크 후 Rule Expression 영역에서 두번째 줄에 "create message" 클릭.



아래와 같이 입력 후 OK 버튼 클릭.

[AVG(...)] 처럼 빨간색으로 된 글씨는 아래 필드 부분에서 선택해서 삽입(Inert)한 것입니다.



"select user" 클릭.



"weblogic" 선택 후 OK 버튼 클릭.



완성 되었습니다. OK 버튼 클릭.



Active Studio 에서 Alert 탭을 보면 아래와 같이 등록되어 있습니다.


Active Studio 에서 Request Quote Dashboard 를 클릭합니다.



Edit 클릭.



Insert View 버튼클 클릭합니다.



Action List 를 선택합니다.



Data Object: Data objects/System/Alerts/History 선택.

Next 버튼 클릭.



Data Fields: MessageText, SentDate



Change View Properties 클릭



View Title: Alerts

OK 버튼 클릭.



레이아웃을 잘 조정하여 배치시킵니다.



저장 후 데이터를 경보가 발생되게 넣어봅시다. 그러면 아래와 같이 경보가 나옵니다.






반응형
//