coherence安装

本文展示了如何通过使用Oracle Coherence中的EntryProcessor可移植对象格式(POF)功能来分发Spring Bean。

Coherence通过EntryProcessor API支持无锁编程模型。 此功能通过减少网络访问并在条目上执行隐式的低级锁定来提高系统性能。 此隐式低级锁定功能与ConcurrentMap API提供的显式lock(key)不同。

显式锁定,Transaction Framework API和Coherence资源适配器是作为入口处理器的其他Coherence事务选项。 有关Coherence交易选项的详细信息,请参阅参考部分。 另外,对于Coherence显式锁定实现,可以建议使用Oracle Coherence文章中的分布式数据管理

可移植对象格式(POF)是独立于平台的序列化格式。 它允许将等效的Java,.NET和C ++对象编码为相同的字节序列。 建议使用POF来提高系统性能,因为POF的序列化和反序列化性能要优于Standart Java序列化(根据Coherence参考文档,在具有String,long和3个整数的简单测试类中,(反序列化)为7比Standart Java序列化快十倍)。

Coherence提供了多种缓存类型,例如分布式(或分区),复制,乐观,近,本地和远程缓存。 分布式缓存定义为在任意数量的群集节点之间分布(或分区)的数据的集合,这样,群集中的一个节点就负责缓存中的每条数据,并且责任是分布式的(或,负载均衡)。 请注意,本文中使用了分布式缓存类型。 由于其他缓存类型不在本文范围之内,请查看“参考”部分或“ Coherence参考”文档。 它们的配置与分布式缓存配置非常相似。

如何通过使用涵盖显式锁定– Java Standart序列化的 Coherence文章来分发Spring Bean,建议比较两种不同的实现( EntryProcessor –便携式对象格式(POF)显式锁定– Java Standart序列化 )。

在本文中,创建了一个名为OTV的新集群,并通过使用一个名为user-cache的缓存对象分发了一个spring bean。 它已分布在集群的两个成员之间。

让我们看一下AbsctractProcessor的实现, 实现为Spring Bean在集群中JVM之间的分配实现了EntryProcessor接口PortableObject接口

二手技术:

JDK 1.6.0_31
春天3.1.1
连贯性3.7.0 SolarisOS 5.10 Maven的3.0.2

步骤1:建立已完成的专案

创建一个Maven项目,如下所示。 (可以使用Maven或IDE插件创建)。

第2步:相干套餐

通过Coherence软件包下载Coherence

步骤3:图书馆

首先,将Spring依赖项添加到Maven的pom.xml中。 请注意,Coherence库已安装到Local Maven Repository,并且其描述如下添加到pom.xml中。 另外,如果未使用Maven,则可以将coherence.jar文件添加到classpath。

<properties><spring.version>3.1.1.RELEASE</spring.version></properties><dependencies><!-- Spring 3 dependencies --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!-- Coherence library(from local repository) --><dependency><groupId>com.tangosol</groupId><artifactId>coherence</artifactId><version>3.7.0</version></dependency><!-- Log4j library --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency></dependencies>

以下maven插件可用于创建runnable-jar。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>1.3.1</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>com.otv.exe.Application</mainClass></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer></transformers></configuration></execution></executions></plugin>

步骤4:建立otv-pof-config.xml
otv-pof-config.xml涵盖了使用可移植对象格式(POF)功能进行序列化的类。 在这个例子中; User,UpdateUserProcessorDeleteUserProcessor类实现com.tangosol.io.pof.PortableObject接口。

-Dtangosol.pof.config参数可用于在启动脚本中定义otv-pof-config.xml路径。

<?xml version="1.0"?>
<!DOCTYPE pof-config SYSTEM "pof-config.dtd">
<pof-config><user-type-list><!-- coherence POF user types --><include>coherence-pof-config.xml</include><!-- The definition of classes which use Portable Object Format --><user-type><type-id>1001</type-id><class-name>com.otv.user.User</class-name></user-type><user-type><type-id>1002</type-id><class-name>com.otv.user.processor.UpdateUserProcessor</class-name></user-type><user-type><type-id>1003</type-id><class-name>com.otv.user.processor.DeleteUserProcessor</class-name></user-type></user-type-list><allow-interfaces>true</allow-interfaces><allow-subclasses>true</allow-subclasses>
</pof-config>

步骤5:创建otv-coherence-cache-config.xml

otv-coherence-cache-config.xml包含(分布式或复制的)缓存方案和缓存方案映射配置。 创建的缓存配置应添加到coherence-cache-config.xml中

<?xml version="1.0"?><cache-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.oracle.com/coherence/coherence-cache-config"xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-cache-configcoherence-cache-config.xsd"><caching-scheme-mapping><cache-mapping><cache-name>user-cache</cache-name><scheme-name>UserDistributedCacheWithPof</scheme-name></cache-mapping></caching-scheme-mapping><caching-schemes><distributed-scheme><scheme-name>UserDistributedCacheWithPof</scheme-name><service-name>UserDistributedCacheWithPof</service-name><serializer><instance><class-name>com.tangosol.io.pof.SafeConfigurablePofContext</class-name><init-params><init-param><param-type>String</param-type><param-value><!-- pof-config.xml path should be set-->otv-pof-config.xml</param-value></init-param></init-params></instance></serializer><backing-map-scheme><local-scheme /></backing-map-scheme><autostart>true</autostart></distributed-scheme></caching-schemes></cache-config>

步骤6:创建tangosol-coherence-override.xml

tangosol-coherence-override.xml涵盖了集群,成员身份和可配置的缓存工厂配置。 同样,以下配置xml文件显示了群集的第一个成员。 -Dtangosol.coherence.override参数可用于在启动脚本中定义tangosol-coherence-override.xml路径。

集群的第一个成员的tangosol-coherence-override.xml:

<?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"><cluster-config><member-identity><cluster-name>OTV</cluster-name><!-- Name of the first member of the cluster --><role-name>OTV1</role-name></member-identity><unicast-listener><well-known-addresses><socket-address id="1"><!-- IP Address of the first member of the cluster --><address>x.x.x.x</address><port>8089</port></socket-address><socket-address id="2"><!-- IP Address of the second member of the cluster --><address>y.y.y.y</address><port>8089</port></socket-address></well-known-addresses><!-- Name of the first member of the cluster --><machine-id>OTV1</machine-id><!-- IP Address of the first member of the cluster --><address>x.x.x.x</address><port>8089</port><port-auto-adjust>true</port-auto-adjust></unicast-listener></cluster-config><configurable-cache-factory-config><init-params><init-param><param-type>java.lang.String</param-type><param-value system-property="tangosol.coherence.cacheconfig"><!-- coherence-cache-config.xml path should be set-->otv-coherence-cache-config.xml</param-value></init-param></init-params></configurable-cache-factory-config></coherence>

集群的第二个成员的tangosol-coherence-override.xml:

<?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"><cluster-config><member-identity><cluster-name>OTV</cluster-name><!-- Name of the second member of the cluster --><role-name>OTV2</role-name></member-identity><unicast-listener>      <well-known-addresses><socket-address id="1"><!-- IP Address of the first member of the cluster --><address>x.x.x.x</address><port>8089</port></socket-address><socket-address id="2"><!-- IP Address of the second member of the cluster --><address>y.y.y.y</address><port>8089</port></socket-address></well-known-addresses><!-- Name of the second member of the cluster --><machine-id>OTV2</machine-id><!-- IP Address of the second member of the cluster --><address>y.y.y.y</address><port>8089</port><port-auto-adjust>true</port-auto-adjust></unicast-listener></cluster-config><configurable-cache-factory-config><init-params><init-param><param-type>java.lang.String</param-type><param-value system-property="tangosol.coherence.cacheconfig"><!-- coherence-cache-config.xml path should be set-->otv-coherence-cache-config.xml</param-value></init-param></init-params></configurable-cache-factory-config></coherence>

步骤7:创建applicationContext.xml

applicationContext.xml已创建。

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- Beans Declaration --><bean id="User" class="com.otv.user.User" scope="prototype" /><bean id="UserCacheService" class="com.otv.user.cache.srv.UserCacheService" /><bean id="CacheUpdaterTask" class="com.otv.cache.updater.task.CacheUpdaterTask"><property name="userCacheService" ref="UserCacheService" /></bean>
</beans>

步骤8:建立SystemConstants类别

SystemConstants类已创建。 此类涵盖所有系统常数。

package com.otv.common;/*** System Constants** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public class SystemConstants {public static final String APPLICATION_CONTEXT_FILE_NAME = "applicationContext.xml";//Named Cache Definition...public static final String USER_CACHE = "user-cache";//Bean Names...public static final String BEAN_NAME_CACHE_UPDATER_TASK = "CacheUpdaterTask";public static final String BEAN_NAME_USER = "User";}

步骤9:创建用户豆

创建了一个新的User Spring bean。 该bean将分布在OTV集群中的两个节点之间。 可以实现PortableObject进行序列化。 PortableObject Interface有两个未实现的方法,如readExternalwriteExternal 。 必须定义仅序列化的属性。 在此示例中,所有属性(用户的id,名称和姓氏)都已序列化。

package com.otv.user;import java.io.IOException;import com.tangosol.io.pof.PofReader;
import com.tangosol.io.pof.PofWriter;
import com.tangosol.io.pof.PortableObject;/*** User Bean** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public class User implements PortableObject {private String id;private String name;private String surname;/*** Gets User Id** @return String id*/public String getId() {return id;}/*** Sets User Id** @param String id*/public void setId(String id) {this.id = id;}/*** Gets User Name** @return String name*/public String getName() {return name;}/*** Sets User Name** @param String name*/public void setName(String name) {this.name = name;}/*** Gets User Surname** @return String surname*/public String getSurname() {return surname;}/*** Sets User Surname** @param String surname*/public void setSurname(String surname) {this.surname = surname;}@Overridepublic String toString() {StringBuilder strBuilder = new StringBuilder();strBuilder.append("Id : ").append(id);strBuilder.append(", Name : ").append(name);strBuilder.append(", Surname : ").append(surname);return strBuilder.toString();}/*** Restore the contents of a user type instance by reading its state* using the specified PofReader object.** @param PofReader in*/public void readExternal(PofReader in) throws IOException {this.id = in.readString(0);this.name = in.readString(1);this.surname = in.readString(2);}/*** Save the contents of a POF user type instance by writing its state* using the specified PofWriter object.** @param PofWriter out*/public void writeExternal(PofWriter out) throws IOException {out.writeString(0, id);out.writeString(1, name);out.writeString(2, surname);}
}

步骤10:建立IUserCacheService接口

创建了一个新的IUserCacheService接口以执行缓存操作。

package com.otv.user.cache.srv;import com.otv.user.User;
import com.otv.user.processor.DeleteUserProcessor;
import com.otv.user.processor.UpdateUserProcessor;
import com.tangosol.net.NamedCache;/*** User Cache Service Interface** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public interface IUserCacheService {/*** Gets Distributed User Cache** @return NamedCache User Cache*/NamedCache getUserCache();/*** Adds user to cache** @param User user*/void addUser(User user);/*** Updates user on the cache** @param String userId* @param UpdateUserProcessor processor**/void updateUser(String userId, UpdateUserProcessor processor);/*** Deletes user from the cache** @param String userId* @param DeleteUserProcessor processor**/void deleteUser(String userId, DeleteUserProcessor processor);}

步骤11:创建UserCacheService类

通过实现IUserCacheService接口创建UserCacheService类。

package com.otv.user.cache.srv;import com.otv.cache.listener.UserMapListener;
import com.otv.common.SystemConstants;
import com.otv.user.User;
import com.otv.user.processor.DeleteUserProcessor;
import com.otv.user.processor.UpdateUserProcessor;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;/*** User Cache Service** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public class UserCacheService implements IUserCacheService {private NamedCache userCache = null; public UserCacheService() {setUserCache(CacheFactory.getCache(SystemConstants.USER_CACHE));//UserMap Listener is registered to listen user-cache operationsgetUserCache().addMapListener(new UserMapListener());} /*** Adds user to cache** @param User user*/public void addUser(User user) {getUserCache().put(user.getId(), user);}/*** Deletes user from the cache** @param String userId* @param DeleteUserProcessor processor**/public void deleteUser(String userId, DeleteUserProcessor processor) {getUserCache().invoke(userId, processor);}/*** Updates user on the cache** @param String userId* @param UpdateUserProcessor processor**/public void updateUser(String userId, UpdateUserProcessor processor) {getUserCache().invoke(userId, processor);}/*** Gets Distributed User Cache** @return NamedCache User Cache*/public NamedCache getUserCache() {return userCache;}/*** Sets User Cache** @param NamedCache userCache*/public void setUserCache(NamedCache userCache) {this.userCache = userCache;}
}

步骤12:建立USERMAPLISTENER类别

创建一个新的UserMapListener类。 该侦听器接收分布式用户缓存事件。

package com.otv.cache.listener;import org.apache.log4j.Logger;import com.tangosol.util.MapEvent;
import com.tangosol.util.MapListener;/*** User Map Listener** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public class UserMapListener implements MapListener {private static Logger logger = Logger.getLogger(UserMapListener.class);/*** This method is invoked when an entry is deleted from the cache...** @param MapEvent me*/public void entryDeleted(MapEvent me) {logger.debug("Deleted Key = " + me.getKey() + ", Value = " + me.getOldValue());}/*** This method is invoked when an entry is inserted to the cache...** @param MapEvent me*/public void entryInserted(MapEvent me) {logger.debug("Inserted Key = " + me.getKey() + ", Value = " + me.getNewValue());}/*** This method is invoked when an entry is updated on the cache...** @param MapEvent me*/public void entryUpdated(MapEvent me) {logger.debug("Updated Key = " + me.getKey() + ", New_Value = " + me.getNewValue() + ", Old Value = " + me.getOldValue());}
}

步骤13:创建UpdateUserProcessor类

AbstractProcessor是位于com.tangosol.util.processor包下的抽象类。 它实现EntryProcessor接口。

创建UpdateUserProcessor类以处理缓存上的用户更新操作。 当为密钥调用UpdateUserProcessor时 ,首先在集群中找到包含该密钥的成员。 之后,从包含相关键的成员中调用UpdateUserProcessor ,并更新其值(用户对象)。 因此,减少了网络流量。

package com.otv.user.processor;import java.io.IOException;import org.apache.log4j.Logger;import com.otv.user.User;
import com.tangosol.io.pof.PofReader;
import com.tangosol.io.pof.PofWriter;
import com.tangosol.io.pof.PortableObject;
import com.tangosol.util.InvocableMap.Entry;
import com.tangosol.util.processor.AbstractProcessor;/*** Update User Processor** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public class UpdateUserProcessor extends AbstractProcessor implements PortableObject { private static Logger logger = Logger.getLogger(UpdateUserProcessor.class);private User newUser;/*** This empty constructor is added for Portable Object Format(POF).**/public UpdateUserProcessor() {}public UpdateUserProcessor(User newUser) {this.newUser = newUser;}/*** Processes a Map.Entry object.** @param Entry entry* @return Object newUser*/public Object process(Entry entry) {Object newValue = null;try {newValue = getNewUser();entry.setValue(newValue);} catch (Exception e) {logger.error("Error occured when entry was being processed!", e);}return newValue;}/*** Gets new user** @return User newUser*/public User getNewUser() {return newUser;}/*** Sets new user** @param User newUser*/public void setNewUser(User newUser) {this.newUser = newUser;}/*** Restore the contents of a user type instance by reading its state* using the specified PofReader object.** @param PofReader in*/public void readExternal(PofReader in) throws IOException {setNewUser((User) in.readObject(0));}/*** Save the contents of a POF user type instance by writing its state* using the specified PofWriter object.** @param PofWriter out*/public void writeExternal(PofWriter out) throws IOException {out.writeObject(0, getNewUser());}
}

步骤14:创建DeleteUserProcessor类别

创建DeleteUserProcessor类以处理缓存上的用户删除操作。 当为密钥调用DeleteUserProcessor时 ,首先在集群中找到包含该密钥的成员。 然后,从包含相关密钥的成员中调用DeleteUserProcessor 。 因此,减少了网络流量。

package com.otv.user.processor;import java.io.IOException;import org.apache.log4j.Logger;import com.otv.user.User;
import com.tangosol.io.pof.PofReader;
import com.tangosol.io.pof.PofWriter;
import com.tangosol.io.pof.PortableObject;
import com.tangosol.util.InvocableMap.Entry;
import com.tangosol.util.processor.AbstractProcessor;/*** Delete User Processor** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public class DeleteUserProcessor extends AbstractProcessor implements PortableObject { private static Logger logger = Logger.getLogger(DeleteUserProcessor.class);/*** Processes a Map.Entry object.** @param Entry entry* @return Object user*/public Object process(Entry entry) {User user = null;try {user = (User) entry.getValue();entry.remove(true);} catch (Exception e) {logger.error("Error occured when entry was being processed!", e);}return user;}/*** Restore the contents of a user type instance by reading its state* using the specified PofReader object.** @param PofReader in*/public void readExternal(PofReader in) throws IOException {}/*** Save the contents of a POF user type instance by writing its state* using the specified PofWriter object.** @param PofWriter out*/public void writeExternal(PofWriter out) throws IOException {}
}

步骤15:创建CacheUpdaterTask类别

创建CacheUpdaterTask类以执行缓存操作(添加,更新和删除)并监视缓存内容。

package com.otv.cache.updater.task;import java.util.Collection;import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;import com.otv.common.SystemConstants;
import com.otv.user.User;
import com.otv.user.cache.srv.IUserCacheService;
import com.otv.user.processor.DeleteUserProcessor;
import com.otv.user.processor.UpdateUserProcessor;/*** Cache Updater Task** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public class CacheUpdaterTask implements BeanFactoryAware, Runnable {private static Logger log = Logger.getLogger(CacheUpdaterTask.class);private IUserCacheService userCacheService;private BeanFactory beanFactory;public void run() {try {while(true) {/*** Before the project is built for the first member,* this code block should be used instead of* method processRequestsOnSecondMemberOfCluster.*/processRequestsOnFirstMemberOfCluster();/*** Before the project is built for the second member,* this code block should be used instead of* method processRequestsOnFirstMemberOfCluster.*/
//    processRequestsOnSecondMemberOfCluster();}} catch (InterruptedException e) {e.printStackTrace();}}/*** Processes the cache requests on the first member of cluster...** @throws InterruptedException*/private void processRequestsOnFirstMemberOfCluster() throws InterruptedException {//Entry is added to cache...getUserCacheService().addUser(getUser("1", "Bruce", "Willis"));//Cache Entries are being printed...printCacheEntries();Thread.sleep(10000);User newUser = getUser("1", "Client", "Eastwood");//Existent Entry is updated on the cache...getUserCacheService().updateUser(newUser.getId(), new UpdateUserProcessor(newUser));//Cache Entries are being printed...printCacheEntries();Thread.sleep(10000);//Entry is deleted from cache...getUserCacheService().deleteUser(newUser.getId(), new DeleteUserProcessor());//Cache Entries are being printed...printCacheEntries();Thread.sleep(10000);}/*** Processes the cache requests on the second member of cluster...** @throws InterruptedException*/private void processRequestsOnSecondMemberOfCluster() throws InterruptedException {//Entry is added to cache...getUserCacheService().addUser(getUser("2", "Nathalie", "Portman"));Thread.sleep(15000);User newUser = getUser("2", "Sharon", "Stone");//Existent Entry is updated on the cache...getUserCacheService().updateUser(newUser.getId(), new UpdateUserProcessor(newUser));User newUser2 = getUser("1", "Maria", "Sharapova");//Existent Entry is updated on the cache...getUserCacheService().updateUser(newUser2.getId(), new UpdateUserProcessor(newUser2));Thread.sleep(15000);//Entry is deleted from cache...getUserCacheService().deleteUser(newUser.getId(), new DeleteUserProcessor());Thread.sleep(15000);}/*** Prints cache entries**/private void printCacheEntries() {Collection<User> userCollection = (Collection<User>)getUserCacheService().getUserCache().values();for(User user : userCollection) {log.debug("Cache Content : "+user);}}/*** Gets new user instance** @param String user id* @param String user name* @param String user surname* @return User user*/private User getUser(String id, String name, String surname) {User user = getNewUserInstance();user.setId(id);user.setName(name);user.setSurname(surname);return user;}/*** Gets user cache service...** @return IUserCacheService userCacheService*/public IUserCacheService getUserCacheService() {return userCacheService;}/*** Sets user cache service...** @param IUserCacheService userCacheService*/public void setUserCacheService(IUserCacheService userCacheService) {this.userCacheService = userCacheService;}/*** Gets a new instance of User Bean** @return User*/public User getNewUserInstance() {return  (User) getBeanFactory().getBean(SystemConstants.BEAN_NAME_USER);}/*** Gets bean factory** @return BeanFactory*/public BeanFactory getBeanFactory() {return beanFactory;}/*** Sets bean factory** @param BeanFactory beanFactory* @throws BeansException*/public void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;}
}

步骤16:创建应用程序类

创建应用程序类以运行应用程序。

package com.otv.exe;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.otv.cache.updater.task.CacheUpdaterTask;
import com.otv.common.SystemConstants;/*** Application Class** @author  onlinetechvision.com* @since   2 Jun 2012* @version 1.0.0**/
public class Application {/*** Starts the application** @param  String[] args**/public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext(SystemConstants.APPLICATION_CONTEXT_FILE_NAME);CacheUpdaterTask cacheUpdaterTask = (CacheUpdaterTask) context.getBean(SystemConstants.BEAN_NAME_CACHE_UPDATER_TASK);Thread cacheUpdater = new Thread(cacheUpdaterTask);cacheUpdater.start();}
}

步骤17:建立专案

生成OTV_Spring_Coherence_With_Processor_and_POF项目后,将创建OTV_Spring_Coherence-0.0.1-SNAPSHOT.jar
请注意,集群成员的Coherence配置不同,因此应为每个成员分别构建项目。

步骤18:在集群的第一个成员上运行项目

在集群成员上运行了已创建的OTV_Spring_Coherence-0.0.1-SNAPSHOT.jar文件后,以下输出日志将显示在第一个成员的控制台上:

--After A new cluster is created and First Member joins the cluster, a new entry is added to the cache.
02.06.2012 14:21:45 DEBUG (UserMapListener.java:33) - Inserted Key = 1, Value = Id : 1, Name : Bruce, Surname : Willis
02.06.2012 14:21:45 DEBUG (CacheUpdaterTask.java:116) - Cache Content : Id : 1, Name : Bruce, Surname : Willis
.......
--After Second Member joins the cluster, a new entry is added to the cache.
02.06.2012 14:21:45 DEBUG (UserMapListener.java:33) - Inserted Key = 2, Value = Id : 2, Name : Nathalie, Surname : Portman
.......
--Cache operations go on both first and second members of the cluster:
02.06.2012 14:21:55 DEBUG (UserMapListener.java:42) - Updated Key = 1, New_Value = Id : 1, Name : Client, Surname : Eastwood,Old Value = Id : 1, Name : Bruce, Surname : Willis02.06.2012 14:21:55 DEBUG (CacheUpdaterTask.java:116) - Cache Content : Id : 2, Name : Nathalie, Surname : Portman
02.06.2012 14:21:55 DEBUG (CacheUpdaterTask.java:116) - Cache Content : Id : 1, Name : Client, Surname : Eastwood02.06.2012 14:22:00 DEBUG (UserMapListener.java:42) - Updated Key = 2, New_Value = Id : 2, Name : Sharon, Surname : Stone,Old Value = Id : 2, Name : Nathalie, Surname : Portman02.06.2012 14:22:00 DEBUG (UserMapListener.java:42) - Updated Key = 1, New_Value = Id : 1, Name : Maria, Surname : Sharapova,Old Value = Id : 1, Name : Client, Surname : Eastwood02.06.2012 14:22:05 DEBUG (UserMapListener.java:24) - Deleted Key = 1, Value = Id : 1, Name : Maria, Surname : Sharapova
02.06.2012 14:22:05 DEBUG (CacheUpdaterTask.java:116) - Cache Content : Id : 2, Name : Sharon, Surname : Stone
02.06.2012 14:22:15 DEBUG (UserMapListener.java:24) - Deleted Key = 2, Value = Id : 2, Name : Sharon, Surname : Stone
02.06.2012 14:22:15 DEBUG (UserMapListener.java:33) - Inserted Key = 1, Value = Id : 1, Name : Bruce, Surname : Willis
02.06.2012 14:22:15 DEBUG (CacheUpdaterTask.java:116) - Cache Content : Id : 1, Name : Bruce, Surname : Willis

步骤19:下载

OTV_Spring_Coherence_With_Processor_and_POF

进一步阅读:

连贯地执行交易
在一致性中使用可移植对象格式
Spring Framework参考3.x

参考: Online Technology Vision博客上来自JCG合作伙伴 Eren Avsarogullari的Oracle Coherence中的EntryProcessor和PortableObject特性如何分发Spring Bean 。

翻译自: https://www.javacodegeeks.com/2012/06/distribute-spring-beans-in-oracle.html

coherence安装

coherence安装_在Oracle Coherence中分发Spring Bean相关推荐

  1. 在Oracle Coherence中分发Spring Bean

    本文展示了如何通过使用Oracle Coherence中的EntryProcessor和可移植对象格式(POF)功能来分发Spring Bean. Coherence通过EntryProcessor ...

  2. JSP页面中调用Spring Bean

    前言 spring boot 2.0.3.RELEASE spring mvc view : jsp JSP页面中调用Spring Bean 在 JSP 页面获得 WebApplicationCont ...

  3. 【thymeleaf】【SpringBoot】在HTML中调用Spring Bean

    前言 spring boot : 2.0.0.RELEASE maven eclipse thymeleaf 3.0 某些情况下需要在HTML中调用Service.比如:做CMS系统时提供的随时获取文 ...

  4. oracle语句mysql数据库名称_查询oracle数据库中当前数据库所有表的名称

    SQL查询数据库中所有指定类型的字段名称和所在的表名 --查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 ...

  5. oracle安装 sysi,在Oracle 10g 中如何以sys的身份登录isqlplus页面

    在linux上安装完成Oracle 10g以后,我们常常会用到isqlplus来执行SQL语句.但正常的isqlplus登录界面只支持以普通用户的身份进行登录,而我们有时又必须用到sys身份的权限才能 ...

  6. 存clob为空的值_给Oracle数据库中CLOB字段插入空值

    遇到往ORACLE数据库中插入数据时总是报ORA-01084 invalid argument in OCI call错误,经分析是因为表中的一个字段类型为CLOB,并且可为空,当在给该字段插入空值时 ...

  7. spring 启动进度_在Web浏览器中显示Spring应用程序启动的进度

    spring 启动进度 重新启动企业应用程序时,客户打开Web浏览器时会看到什么? 他们什么也没看到,服务器还没有响应,因此Web浏览器显示ERR_CONNECTION_REFUSED 应用程序前面的 ...

  8. spring bean配置_在运行时交换出Spring Bean配置

    spring bean配置 如今,大多数Java开发人员都定期与Spring打交道,而我们当中的许多人都已经熟悉了它的功能和局限性. 最近,我遇到了一个我从未遇到过的问题:引入了基于运行时引入的配置来 ...

  9. Oracle的介绍及其在安装和使用Oracle过程中可能遇到的困难及其相应的解决措施

    Oracle的创始人:Scott 系统自带一个Scott用户 下载地址:www.oracle.com 在安装过程中需要注意的点 安装之前 关闭防火墙 保证系统是健康的不然会崩溃 安装有两个压缩包 建议 ...

最新文章

  1. ubuntu装机必备
  2. 组合数学 —— 概述
  3. 不良事件总结怎么写_护理不良事件总结分析.doc
  4. StarlingMVC:为Starling量身打造的MVC框架
  5. hive多个表join_8个Hive数据仓工具面试题锦集!
  6. 【资料搬迁】虚拟机安装CentOS
  7. matlab函数结果,matlab多返回值函数怎么设定
  8. 编码 - ASCII码表
  9. ArcGIS10破解版安装方法
  10. 显卡排行榜天梯图2022 显卡性能天梯图2022
  11. 题目名称:你好,i春秋
  12. matlab神经网络工具箱的使用
  13. 你应该学点哲学的20个理由:不为拥有深奥的思想,只为更好地生活
  14. react具名插槽与作用域插槽
  15. 共享打印机计算机睡眠时不可用,WIN10从睡眠中唤醒后共享打印机不可用
  16. saas商城跟源码商城对比优势在哪里
  17. 增删改查操作下锁的相关情况_查询时的锁分析
  18. 中国腹肌刺激器行业发展动态与投资前景预测报告(2022-2027)
  19. tkMybatis基本用法(二)
  20. 独立游戏开发如何入门?

热门文章

  1. java语音播报案例
  2. Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
  3. 交换两个数字的三种方式
  4. C语言调用es6,ES6 箭头函数、普通函数、调用方法
  5. aria2c rpc php,aria2c 的基本配置,附带傻瓜式源码
  6. resnet50加入fpn_FPN+SSD同时兼顾速度和精度的检测器(二)
  7. 关于es查询dsl的filter与must,term与match的区别
  8. openfire client聊天消息交互和存储离线(在线)消息记录策略
  9. java 反射api_反射是最重要的Java API
  10. java javadoc_使用Java 9向Javadoc搜索添加术语