coherence安装_在Oracle Coherence中分发Spring Bean

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安装

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring 的aop操作

转载于:https://www.cnblogs.com/hwgok/p/6760663.html

excel 公式 单引号 concat_Excel两个新函数帮你快速搞定批量连接

如果将两个文本连接起来&#xff0c;通常第一反应用连接符号"&"。使用连接符&连接文本字符记得曾经有记者采访刘强东问奶茶妹妹漂不漂亮&#xff0c;他竟然回答看不出来好赖…当时真觉得这家伙身在福中不知福&#xff0c;饱汉不知饿汉饥。果然之后还闹出一些…

练习~虚拟线上银行

数据库操作&#xff0c;网络编程及多线程的综合练习~ 客户端&#xff1a; UI层 1 import javax.swing.*;2 import java.awt.*;3 import java.awt.event.*;4 5 public class ATMUI{6 7 //主方法8 public static void main(String [] args){9 ATMUI ui new ATMUI();…

mybatisplus 操作另一个数据库的数据_MySQL数据库的基础操作

一、基本概念数据库术语数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件)。数据表(table) - 某种特定类型数据的结构化清单。模式(schema) - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储&#xff0c;包含存储什么样的数据&#xff0…

JEP 277“增强弃用”非常好。 但这是一个更好的选择

维护API很难。 我们正在维护非常复杂的jOOQ API。 但是就语义版本而言&#xff0c;我们遵循相对宽松的规则 。 当您阅读Brian Goetz和其他人关于在JDK中保持向后兼容性的评论时&#xff0c;我只能对他们的工作表示敬意。 显然&#xff0c;我们都希望最终移除Vector &#xff…

ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法

哈希表概念哈希表&#xff08;散列表&#xff09;&#xff0c;是基于关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。这个映射函数叫做散列函数&#xff08;哈希函数&#xff…

二叉搜索时与双向链表python_剑指Offer(二十六) 二叉搜索树和双向链表

题目描述输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点&#xff0c;只能调整树中结点指针的指向。思路以及解答主要是使用递归&#xff0c;设置一个head和end&#xff0c;head只在第一次设置值&#xff0c;后面就是将end的…

第五天敏捷冲刺

每日任务&#xff1a; 1.本次会议为第三次 Meeting会议&#xff1b; 2.由于本次会议人员都有各自的事情&#xff0c;所以都通过私聊组长来&#xff0c;讨论接下来的任务&#xff1b; 3.今天的代码部分coding:https://git.coding.net/ysh0904/wl2ban.git 4.燃尽图&#xff1a; 5…

mobx中跟新了数据视图没变化_【第1781期】MobX 简明教程

前言SEEConf&#xff0c;2020年1月4号杭州见&#xff0c;C位抢票见文章末尾。今日早读文章由腾讯whinc投稿分享。正文从这开始&#xff5e;&#xff5e;导读&#xff1a;MobX 是一个优秀的响应式状态管理库&#xff0c;在流行的状态管理库 Redux 之外为我们提供了其他选择。如果…

excel导航窗格_Excel小技巧16:在每天的某个时刻自动打开特定工作簿

学习Excel技术&#xff0c;关注微信公众号&#xff1a;excelperfect我想要在每天下班前&#xff0c;将自已一天的工作进行整理并简短记录在一个Excel工作簿中。然而&#xff0c;有时候忙&#xff0c;可能会忘记&#xff1b;有时候到下班时间了&#xff0c;急于下班&#xff0c;…

51单片机按键控制数码管0~9_51单片机外部中断

前面为大家介绍的点亮LED灯、数码管、按键只用到了51单片机的IO资源&#xff0c;我们要是仅仅用单片机点灯、操作数码管&#xff0c;那可真是大才小用了。这些都只是51单片机资源的冰山一角&#xff0c;51单片机还有好多的功能&#xff0c;我后面将为大家一一介绍。今天为大家介…

IIS7开启gZip动态压缩

1.安装动态压缩模块&#xff1a; 安装过程可能的报错&#xff1a;This application has requested the Runtime to terminate it in an unusual way. 解决办法>> 报错&#xff1a;错误: 尝试安装 动态内容压缩 失败&#xff0c;错误代码为 0x8007000E。 存储空间不足&am…

mysql查询不重复记录数_mysql查询不重复的行内容,不重复的记录数.count,distinct

有这么一个表 记录了id, p_id, p_name , p_content , p_time 1 343 aaa aaaaaa 2012-09-01 2 344 bbb bbbbbb 2012-09-02 3 321 ccc cccccccc 2012-09-03 4 343 aaa aaaaaa 2012-09-04 想查询不重复的行的内容,并且输出 p_sum ( 产品p_id出现重复的次数) sele有这么一个表记录了…

使用Java中的FileChannel和ByteBuffer在文件中读取/写入文件

过去&#xff0c;我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO&#xff0c;在本Java NIO教程中&#xff0c;我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。 Channel提供了一种从文件读取数据的替代方法&#xff0c;它提供了比InputStream…

mysql 导入百万级数据 几种 java_Java 修行第034天--执行计划及其使用--Oracle数据导入导出--第三章MySQL使用...

执行计划中牢记几句话:-- 尽量避免是*代替所有列,编写查询语句时使用具体列名代替*,可以防止全表扫描-- 尽可能少的使用like关键字进行模糊查询-- 建立适当的索引可以提高查询效率十三. 执行计划--通过PL/SQL Developer查看查询的1 执行计划是一条查询语句在Oracle中的执行过程…

摄像头分辨率怎么调整_亿联CAM50 - 智能话机专属高清摄像头

亿联CAM50是通过USB连接的高清视频摄像机&#xff0c;适用于亿联桌面高端智能话机&#xff08;SIP-T58V和SIP-T58A&#xff09;&#xff0c;致力于提供一流的个人视频通信体验&#xff0c;优化视频协作。CAM50高清摄像机即插即用&#xff0c;无需额外安装驱动软件&#xff0c;也…

ios系统python编译器_MacBook如何安装Python编译器-百度经验

编程是一门需要动手实践的技能&#xff0c;由于Python的性能&#xff0c;许多人都将其作为学习编程的入门语言。而要想学好Python&#xff0c;首先要在电脑上安装Python&#xff0c;并安装一个可以解释Python的文本编辑器。在此以在MacBook上安装Sublime Text为例。 工具/原料 …

jvm需要多长时间进行转义分析? 可能比您想象的要长。

这篇文章着眼于转义分析&#xff0c;特别是jvm在运行的程序中执行转义分析需要多长时间。 我做了一些观察&#xff0c;但目前还没有全部解释。 作为介绍&#xff0c;让我们绕道看看jvm -Xcomp中一个鲜为人知且使用更少的标志&#xff08;这将是一件好事&#xff09;。 该标志…

Java补漏(一)

&#xfeff;&#xfeff;第一章前言 在学长的建议下&#xff0c;为了弥补之前学Java漏下的或者不是非常清楚的知识点&#xff0c;买了本蛮好的教科书-《Java学习笔记&#xff08;JDK6&#xff09;》&#xff0c;正式又一次学习。为了记下一些让我恍然大悟的知识。写了本文档。…

spring environment_程序员:Spring项目中简单几步实现多个动态数据源切换

每一个请求与其他的用户是面对不同的数据库&#xff0c;这就需要用到动态数据源切换&#xff0c;来满足不同数据库、不同数据表(不同数据源)的灵活调用。动态数据源切换满足mysql、oracle等主流数据库进行动态数据源切换。使用方法在 WEB-INF 目录下建立 lib 目录&#xff0c;并…