Search code examples
oracle-coherence

How can I connect oracle coherence remote cluster using java


There is a coherence cluster (with a cache by name mycache) that is runnig on ip address xxx.xxx.xxx.xxx (not localhost). I am trying to connect it and read from cache using java.

This is my Reader class:

import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

public class Reader {
    public static void main(String[] args) {
        NamedCache cache = CacheFactory.getCache("mycache");
        System.out.println("Value in cache is: " + cache.get("key1"));
    }
}

I am using Intellij IDEA, in vm option for reader I added this line:

-Dtangosol.coherence.cacheconfig=mycache.xml

and this is mycache.xml file:

<?xml version='1.0'?>
<coherence  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"
            xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config
            coherence-operational-config.xsd"
            xml-override="{tangosol.coherence.override /tangosol-coherence-override-{mode}.xml}">

    <cluster-config>
        <member-identity>
            <cluster-name>RemoteCluster</cluster-name>
        </member-identity>

        <unicast-listener>
            <well-known-addresses>
                <socket-address id="1">
                    <address>192.168.104.160</address>
                    <port>8088</port>
                </socket-address>
            </well-known-addresses>
        </unicast-listener>
    </cluster-config>

</coherence>

when I run reader.main() I get this exception:

Problem   : An ElementProcessor could not be located for the element [coherence]
Advice    : The specified element is unknown to the NamespaceHandler implementation. Perhaps the xml element is foreign to the Xml Namespace?

    at com.tangosol.util.Base.ensureRuntimeException(Base.java:286)
    at com.tangosol.net.ScopedCacheFactoryBuilder.instantiateFactory(ScopedCacheFactoryBuilder.java:433)
    at com.tangosol.net.ScopedCacheFactoryBuilder.buildFactory(ScopedCacheFactoryBuilder.java:385)
    at com.tangosol.net.ScopedCacheFactoryBuilder.getFactory(ScopedCacheFactoryBuilder.java:267)
    at com.tangosol.net.ScopedCacheFactoryBuilder.getConfigurableCacheFactory(ScopedCacheFactoryBuilder.java:119)
    at com.tangosol.net.CacheFactory.getConfigurableCacheFactory(CacheFactory.java:127)
    at com.tangosol.net.CacheFactory.getCache(CacheFactory.java:205)
    at com.tangosol.net.CacheFactory.getCache(CacheFactory.java:182)
    at Reader.main(Reader.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: com.tangosol.config.ConfigurationException: Configuration Exception
-----------------------
Problem   : An ElementProcessor could not be located for the element [coherence]
Advice    : The specified element is unknown to the NamespaceHandler implementation. Perhaps the xml element is foreign to the Xml Namespace?

Solution

  • it looks like the problem in the mycache.xml. Those elements used when you want to set up cluster member, while you want to connect a client.

    Assuming that "mycache" schema exists on remote cluster try to change the mycache.xml with following:

    <?xml version="1.0"?>
    <!DOCTYPE cache-config SYSTEM "cache-config.dtd">
    
    <cache-config xmlns="http://schemas.tangosol.com/cache">
        <caching-scheme-mapping>
            <cache-mapping>
                <cache-name>mycache</cache-name>
                <scheme-name>extend-dist</scheme-name>
            </cache-mapping>       
        </caching-scheme-mapping>
        <caching-schemes>
            <remote-cache-scheme>
                <scheme-name>extend-dist</scheme-name>
                <service-name>ExtendTcpCacheService</service-name>
                <initiator-config>
                    <tcp-initiator>
                        <remote-addresses>
                            <socket-address>
                                <address>192.168.104.160</address>
                                <port>8088</port>
                            </socket-address>
                        </remote-addresses>
                    </tcp-initiator>
                    <outgoing-message-handler>
                        <request-timeout>20s</request-timeout>
                    </outgoing-message-handler>
                </initiator-config>
            </remote-cache-scheme>
        </caching-schemes>
    </cache-config>
    

    Note: if remote cluster uses POF serialization for mycache you'll have to add POF mapping and configuration -Dtangosol.pof.enabled=true