Oracle Fusion Middleware/Coherence

4장. Coherence Examples 동작방식 (Contacts Driver class 분석)

수상한 김토끼 2022. 5. 23. 16:57

안녕하세요.

'수상한 김토끼' 입니다.

3장의 예제를 바탕으로 Oracle의 in-memory 캐시 솔루션인 Coherence의 동작방식을 확인 해 보도록 하겠습니다.

 

이 블로그 글은 미들웨어 경험이 없으신 분들도 쉽게 따라 하실 수 있도록 쉽게 작성하는 것이 목표입니다.

설명을 보고 진행하시다가 궁금하신 내용은 댓글로 문의하시면 가능한 범위 내에서 알려 드리도록 하겠습니다.


1. Coherence Examples Contacts 소스파일 구성

코히어런스 Contacts 예제는 다음과 같은 파일로 구성되어 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[coherence@coherence contacts]$ pwd
/home/coherence/coherence14c/coherence/examples/java/src/com/tangosol/examples/contacts
[coherence@coherence contacts]$ ls -al
total 64
drwxr-x---.  2 coherence coherence  270 May 23 15:54 .
drwxr-x---12 coherence coherence  155 May 11 09:56 ..
-rw-r-----.  1 coherence coherence 1822 Mar 26  2020 BasicExample.java
-rw-r-----.  1 coherence coherence 8261 Mar 26  2020 DataGenerator.java
-rw-r-----.  1 coherence coherence 3644 Mar 26  2020 Driver.java
-rw-r-----.  1 coherence coherence 2269 Mar 26  2020 ExamplesHelper.java
-rw-r-----.  1 coherence coherence 7844 Mar 26  2020 FilterFactory.java
-rw-r-----.  1 coherence coherence 7173 Mar 26  2020 LoaderExample.java
-rw-r-----.  1 coherence coherence 2509 Mar 26  2020 ObserverExample.java
-rw-r-----.  1 coherence coherence 3593 Mar 26  2020 ProcessorExample.java
-rw-r-----.  1 coherence coherence 5740 Mar 26  2020 QueryExample.java
-rw-r-----.  1 coherence coherence 5243 Mar 26  2020 QueryLanguageExample.java
cs

총 10개의 클래스 파일로 구성되어 있으며 Contacts 예제에서는 7개의 파일이 사용 됩니다.

  1.  Driver class
  2.  LoaderExample class
  3.  QueryExample class
  4.  QueryLanguageExample class
  5.  ObserverExample class
  6.  BasicExample class
  7.  ProcessorExample class

 

여기에 contacts data로 사용되는 csv 파일이 1개 존재합니다.

1
2
3
4
5
6
7
[coherence@coherence resource]$ pwd
/home/coherence/coherence14c/coherence/examples/resource
[coherence@coherence resource]$ ls -al
total 1732
drwxr-x---2 coherence coherence      26 May 23 15:41 .
drwxr-x---8 coherence coherence      87 May 11 09:56 ..
-rw-r-----1 coherence coherence 1772202 Mar 26  2020 contacts.csv
cs

 

이번 장에서는 Contacts 예제가 수행되는 Driver 클래스를 확인 해 보고 내용 및 용례에 대해 간단히 설명 드리겠습니다.


2. Coherence Examples Contacts Driver Class

코히어런스 Contacts 예제의 Driver class는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
 * #%L
 * Driver.java
 * ---
 * Copyright (C) 2000 - 2020 Oracle and/or its affiliates. All rights reserved.
 * ---
 * Oracle is a registered trademarks of Oracle Corporation and/or its
 * affiliates.
 *
 * This software is the confidential and proprietary information of Oracle
 * Corporation. You shall not disclose such confidential and proprietary
 * information and shall use it only in accordance with the terms of the
 * license agreement you entered into with Oracle.
 *
 * This notice may not be removed or altered.
 * #L%
 */
package com.tangosol.examples.contacts;
 
import com.tangosol.examples.pof.Contact;
import com.tangosol.examples.pof.ContactId;
import com.tangosol.net.NamedCache;
import com.tangosol.net.Session;
import com.tangosol.util.Resources;
 
import java.io.IOException;
 
import java.net.URL;
 
import static com.tangosol.examples.contacts.ExamplesHelper.logHeader;
import static com.tangosol.net.cache.TypeAssertion.withTypes;
 
/**
 * Driver executes all the contact examples. The driver will if not passed a
 * cache name use the 'contacts' as as the default cache name. If
 * passed a different name, make sure that the changes are reflected in the
 * configuration files.
 * <p/>
 * Before the examples are run, the Driver will populate the cache with random
 * contact data.
 * <p/>
 * Examples are invoked in this order <p/>
 * 1) LoaderExample<br/>
 * 2) QueryExample <br/>
 * 3) QueryLanguageExample <br/>
 * 4) ObserverExample <br/>
 * 5) BasicExample<br/>
 * 6) ProcessorExample<br/>
 *
 * @author dag  2009.03.02
 */
public class Driver
    {
    // ----- static methods -------------------------------------------------
 
    /**
     * Execute Contact examples.
     * <p/>
     * usage: [cache-name] [contacts file]
     *
     * @param asArgs command line arguments
     */
    public static void main(String[] asArgs)
            throws IOException
        {
        String sCache = asArgs.length > 0 ? asArgs[0] :
                LoaderExample.CACHENAME;
        String sFile = asArgs.length > 1 ? asArgs[1+ "/../resource/" +
                DEFAULT_DATAFILE : DEFAULT_DATAFILE;
 
        // Session implements AutoClosable
        try (Session session = Session.create())
            {
            NamedCache<ContactId, Contact> cache = session.getCache(sCache,
                     withTypes(ContactId.class, Contact.class));
 
            logHeader("contacts examples begin");
            // Load data into cache
            URL contactFileURL = Resources.findFileOrResource(sFile, Driver.class.getClassLoader());
            new LoaderExample().load(contactFileURL.openStream(), cache);
 
            // Run sample queries
            new QueryExample().query(cache);
 
            // Run sample queries using query language
            new QueryLanguageExample().query(cache, new FilterFactory("InvocationService"));
 
            // Run sample change observer.
            ObserverExample observer = new ObserverExample();
            observer.observe(cache);
 
            // Run basic cache commands
            new BasicExample().execute(cache);
 
            // Run sample entry processor
            new ProcessorExample().execute(cache);
 
            // Stop observing
            observer.remove(cache);
 
            logHeader("contacts examples completed");
            }
        catch (Exception e)
            {
            logHeader("contacts examples completed with error");
            e.printStackTrace();
            }
 
        }
 
    // ----- constants ------------------------------------------------------
 
    public final static String DEFAULT_DATAFILE = "contacts.csv";
    }
cs

Driver class는 contacts.csv 파일에서 data를 읽어들여 코히어런스 캐시에 활용하는 예제의 모음입니다.

 

간단히 수행 방식을 확인해 보면

  • sCache 변수에 코히어런스 캐시 네임이 지정되며, sFile 변수에 데이터 파일(contacts.csv)이 지정됩니다.
  • 이후 Session 객체를 생성한 후 contactFileURL 객체를 통해 LoaderExample, QueryExample, QueryLanguageExample, ObserverExample, BasicExample, ProcessorExample 클래스를 순차적으로 호출합니다.

 

요약하면 Session객체에 contacts.csv 파일에서 읽어온 데이터를 가공하여 Coherence 캐시서버에

put(LoaderExample)하고 주소 및 나이 등으로 Query(QueryExample, QueryLanguageExample)를 수행하며

데이터 put, get 및 remove(BasicExample)등을 수행하는 것을 확인할 수 있습니다.

 

Java에서 사용되는 Session, Cache, Map등의 개념을 알고 계신다면 코히어런스 기동 후 기존 방식 그대로

사용할 수 있는 것을 보여주는 예제로 이를 활용하면 Http Session과 같은 Map타입의 데이터들을

여러 JVM(e.g. 이기종 WAS)에서 공유한다거나, 공통 데이터들을 메모리에 올려 놓고 캐시하는 용도로

활용이 가능함을 알 수 있습니다.

 

개발에 관련된 사항은 더 이상 자세히 다루지는 않겠습니다만 예제로 제공된 각각의 클래스 파일을 확인해 보신다면

코히어런스가 실제로 어떻게 동작하고 사용이 가능한지에 대한 이해에 도움이 되리라고 판단됩니다.


여기가지 코히어런스 예제 중 Contacts를 대표로 살펴 보았습니다.

예제를 통해 어느정도는 코히어런스에 대한 개념이 확인 되셨는지 궁금합니다.

예제는 여기까지로 마무리 하고 다음 장에서는 여러분들이 가장 궁금해 하시는 코히어런스의 대표 기능인

웹로직에서 코히어런스를 사용해서 세션을 공유하는 방법에 대해 알아보도록 하겠습니다.