This chapter describes how to set up JDeveloper to build and run Coherence-based Java applications.
To start up and configure JDeveloper for use with Coherence:
Open a terminal window and verify that the PATH environment variable is set to include \oracle\product\jdk160_05\bin. If the PATH environment variable does not include jdk160_05\bin directory, then set the variable as follows:
Set the JAVA_HOME environment variable to the base of the JDK installation.
set JAVA_HOME=\oracle\product\jdk160_05
Include %JAVA_HOME%\bin in the PATH environment variable.
set PATH=%JAVA_HOME%\bin;%PATH%
Start JDeveloper. If you get a message asking you to select a role, select Default Role. If you get a message asking whether you want to migrate from previous versions of JDeveloper, select No. Close any window that displays the Tip of the Day."
After JDeveloper starts up, click New Application to create an application.
An application is a way of grouping projects or source code. This new application will hold the Coherence projects.
In the dialog box, change the application name to Coherence, the directory to \home\oracle\labs, and the application package prefix to com.oracle.coherence.handson. Click OK, and then click Cancel when prompted to create a new project.
Figure 2-2 Creating an Application in JDeveloper

Add the Coherence JAR files to the default project properties. From the Tools menu, select Default Project Properties. The Default Properties dialog box opens.
Click Libraries and Classpath, and click the Add Library button. The Add Library dialog box opens.
In the Add Library dialog box, click New.
The Create Library dialog box opens.
Click Add Entry to open the Select Path Entry dialog box.
Find and expand the coherence\lib directory, which is under the \oracle\product directory.
Highlight and select the coherence.jar file add it to the Classpath. Then, click OK to return to the Create Library dialog box.
In the Create Library dialog box, change the name in the Library Name field to Coherence. The contents of the dialog box should look like this:
Figure 2-7 Create Library Dialog Box with the Coherence Jar on the Classpath

Click OK in the Create Library, Add Library, and Default Project Properties dialog boxes to return to the JDeveloper IDE. Oracle JDeveloper is now set up with the correct Coherence libraries.
In this exercise, you develop a simple, Java console-based application to access, update, and remove simple types of information from a Coherence clustered cache. You also get familiar with using the Coherence Java APIs. In this practice, using JDeveloper, you perform the following:
Create a new project
Create a new NamedCache
Put information into the cache and then retrieve it
Retrieve information about the cache
All Coherence caches are named, have a lifetime scoped by the cluster instance in which they exist, and implement the com.tangosol.net.NamedCache interface. The NamedCache interface is an extension of java.util.Map and holds data and resources that are shared among the cluster members. Each NamedCache holds data as key/value pairs. Keys and values can be both simple and complex object types. The NamedCache interface provides extensions to the Map interface, such as locking and synchronization, storage integration, queries, event aggregations, and transactions. The cache topology (or implementation) can be swapped or changed without code changes. Table 2-1 describes some of the more commonly used methods within the NamedCache interface:
Table 2-1 Methods in the NamedCache Interface
| Method Name | Description |
|---|---|
|
|
Removes all entries from the |
|
|
Returns |
|
|
Returns |
|
|
Gets the entry from |
|
|
Puts an object in |
|
|
Removes the mapping for this |
|
|
Returns a set of key/value pairs |
|
|
Gets all values back as a collection |
|
|
Returns the |
The com.tangosol.net.CacheFactory class is typically used to obtain an instance of a NamedCache. Table 2-2 describes some of the more commonly used methods in the CacheFactory class.
Table 2-2 Methods in the CacheFactory Class
| Method Name | Description |
|---|---|
|
|
Obtains a cluster object running Coherence services |
|
|
Shuts down all clustered services |
|
|
Returns an instance of a cache. Either joins an existing cache in the cluster or creates the cache if this is the first member. |
For a full list of methods, in the NamedCache interface and the CacheFactory class, see the Javadoc in \oracle\product\coherence\doc.
To create an application to access, update, and remove simple types of information from a Coherence clustered cache:
Create a new project in JDeveloper.
Choose File > New... in the JDeveloper IDE. This will open the New Gallery.
Choose General > Projects in the Categories section of the New Gallery dialog box and Generic Project in the Items section. Click OK.
Figure 2-8 Choosing Projects in the New Gallery

In the Create Generic Project dialog box, name the project Lab3. Ensure that directory is C:\home\oracle\labs\Lab3. Click Finish.
Create your first Coherence Java program.
Right-click the Lab3 project entry and select New.
Select the General category and select Java Class. Click OK.
Enter MyFirstSample as the class name and select the Generate Main Method check box. The dialog box should appear as follows. Click OK.
Right-click the Lab3 project and choose Project Properties. Select Libraries and Classpath in the Project Properties dialog box. You should see the Coherence library that you defined earlier included here by default. Click Cancel to dismiss the dialog box.
In the editor for MyFirstSample, you must import the following components into your Java class:
import com.tangosol.net.CacheFactory; import com.tangosol.net.NamedCache;
Write the code to create a NamedCache, put in a value, and then verify the value that you put in. Save the file after you finish coding. Example 2-1 illustrates a sample program.
Example 2-1 Creating a NamedCache; Inserting and Verifying Values
package com.oracle.coherence.handson;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
public class MyFirstSample {
public MyFirstSample() {
}
public static void main(String[] args) {
// ensure we are in a cluser
CacheFactory.ensureCluster();
// create or get a named cache called mycache
NamedCache myCache = CacheFactory.getCache("mycache");
// put key, value pair into the cache.
myCache.put("Name","Tim Middleton");
System.out.println("Value in cache is " + myCache.get("Name"));
}
}
Run the program in JDeveloper: right-click the MyFirstSample.java class in the editor and choose Run.
You should see messages similar to the following:
Figure 2-11 Output of Program to Create a NamedCache and to Store and Retrieve Values

Now create another Java class only to get the value from your cache, rather than doing a put, and then a get. Name this Java class MyFirstSampleReader. Example 2-2 illustrates a sample program.
Example 2-2 Getting a Value from the Cache
package com.oracle.coherence.handson;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
public class MyFirstSampleReader {
public MyFirstSampleReader() {
}
public static void main(String[] args) {
// ensure we are in a cluser
CacheFactory.ensureCluster();
// create or get a named cache called mycache
NamedCache myCache = CacheFactory.getCache("mycache");
System.out.println("Value in cache is " + myCache.get("Name"));
}
}
Run the MyFirstSampleReader class. Figure 2-12 illustrates the output from the program. Note that a null value returned. When the MyFirstSample class runs, it is storage-enabled by default unless otherwise specified. So, it creates a NamedCache when it starts, puts the value in, and when the class completes, the NamedCache disappears.
Figure 2-12 Output from the Sample Reader Program

Start up the cache-server.cmd that you used in "Testing a Coherence Installation", run MyFirstSample to put the value in the NamedCache, and then run MyFirstSampleReader to read the value from the cache. Note the output illustrated in Figure 2-13: the "Gene Smith" value stored by MyFirstSample is returned by MyFirstSampleReader. By default, unless specified otherwise, all processes start up as storage-enabled. This means that the process can store data as part of the cluster.
Figure 2-13 Output from the Sample Reader Program with a Running Cache Server

This should not be the case for a process that joins the cluster only to perform an operation, such as putting in a value and then leaving, like MyFirstSample. You must modify the process so that it will not be storage-enabled.
This is done using the following Java command-line parameter.
-Dtangosol.coherence.distributed.localstorage
The value -Dtangosol.coherence.distributed.localstorage=true specifies that the process is storage-enabled. Setting the parameter to false specifies that the process is not storage-enabled.
Right-click the Lab3 project and select Project Properties.
Choose Run/Debug/Profile and click Edit.
Ensure the Virtual Machine field is set to server.
Enter the following value in the Java Options field:
-Dtangosol.coherence.distributed.localstorage=false -Dtangosol.coherence.log.level=3
The screen should look similar to the illustration in Figure 2-14.
Figure 2-14 Editing Run Configuration Properties

Click OK, and then OK in the Project Properties dialog box save.
Shut down any running cache servers and rerun your MyFirstSample class. What happens? You receive a message similar to the one in Figure 2-15 indicating that storage is not enabled on the cluster, because you have set this member to be storage-disabled.
Figure 2-15 Output from JDeveloper if Storage is Disabled

Start the cache server again and retest. You should now see that the data is persisted between running the two Java examples.
In this practice you develop a simple Java console-based application to access update, and remove simple types of information from a Coherence clustered cache.
This practice assumes you have completed "Testing a Coherence Installation". Make sure you have a cache server and a Coherence console up and running.
Unlike client/server applications, in which client applications typically "connect" and "disconnect" from a server application, Coherence-based clustered applications simply "ensure" they are in a cluster, after which they may use the services of the cluster. Coherence-based applications typically do not "connect" to a cluster of applications; they become part of the cluster.
To change the level of logging produced by Coherence, use the following JVM parameter where level is a number between 0 and 9:
-Dtangosol.coherence.log.level=level
The default is 5. A value of 0 means no logging. A value of 9 means extremely verbose. A value of 3 is often useful enough for most application development.
To create a Java console-based application to access update, and remove simple types of information from a Coherence clustered cache:
In the Coherence Java documentation (Javadoc) that is shipped in the \oracle\product\coherence\doc directory, investigate the methods in the CacheFactory class.
Develop a simple Java console application (Java class) called YourFirstCoherenceApplication that uses the CacheFactory class to join a cluster (using the ensureCluster method), and then leave the cluster (using the shutdown method).
Using the Javadoc, investigate the methods that are available in the NamedCache interface.
Extend your application to use the CacheFactory method getCache to acquire a NamedCache for the cache called mycache (the same cache name used in the exercise: "Testing a Coherence Installation").
With the NamedCache instance, use the "get" method to retrieve the value for the key "message" (the same key used in the exercise: "Testing a Coherence Installation").
Output the value to the standard out using the System.out.println(….) method.
Example 2-3 illustrates a sample Coherence-based Java application:
Example 2-3 Sample Coherence-Based Java Application
package com.oracle.coherence.handson;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;
public class YourFirstCoherenceApplication {
public YourFirstCoherenceApplication() {
}
public static void main(String[] args) {
CacheFactory.ensureCluster();
NamedCache myCache = CacheFactory.getCache("mycache");
String message = (String)myCache.get("message");
System.out.println(message);
CacheFactory.shutdown();
YourFirstCoherenceApplication yourfirstcoherenceapplication = new YourFirstCoherenceApplication();
}
}
Ensure that you have the Coherence cache server and console up and running. In the console, connect to the mycache cache. For example:
Map(?): cache mycache
Execute YourFirstCoherenceApplication from the JDeveloper IDE and view the result.
Figure 2-16 illustrates the output from YourFirstCoherenceApplication. The output indicates that there is no data in the cache for the message key.
Figure 2-16 Output from Coherence-Based Java Application—No Value for the Key

Using the running Coherence shell, change the key "message." For example, enter
Map <mycache>: put message "hello"
Rerun YourFirstCoherenceApplication from the JDeveloper IDE to see the changed values. Figure 2-17 illustrates that cache now holds the value hello for the key message.
Figure 2-17 Output from Coherence-Based Java Application—A Data Value for the Key

Rerun YourFirstCoherenceApplication with the following JVM parameter. Notice that the output is the same as the previous run.
-Dtangosol.coherence.distributed.localstorage=false
Shut down your cache server and Coherence shell instances. Restart the cache server and then rerun YourFirstCoherenceApplication (with the preceding JVM parameter set). Note the output is now null.
If you change the value of the message key in your application (using the put method), is the new value available through the Coherence shell?
For example, comment out the get method and add the put method.
//String message = (String)myCache.get("message");
String message = (String)myCache.put("message", "bye");
Run YourFirstCoherenceApplication.
Run the get command in the Coherence console.
Map (mycache): get message
You should see bye as the output.
Try setting the following JVM parameter and rerunning YourFirstCoherenceApplication. Note that it causes the application to return a null value since local storage is not enabled.
-Dtangosol.coherence.distributed.localstorage=false