昨天寫了個Coherence的小例子,使用了Oracle Enterprise Pack for Eclipse,直接用它創(chuàng)建了一個ADF項目,連帶創(chuàng)建了JPA項目,在Configuration里添加了Coherence,這樣就有了配套的jar包了。
Coherence利用多播自動組成集群,類可以不實現(xiàn)序列化接口,這是一個簡單的例子:
public class Cat {
private String name;
private int age;
private String sex;
public Cat() {
super();
}
public Cat(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
服務(wù)類:
public class CatService {
public Cat getCat(String name){
NamedCache cache = CacheFactory.getCache("AnimalCache");
Cat cat = (Cat) cache.get(name);
if(cat==null){
long age = Math.round(Math.random() * 10)+5;
cat = new Cat(name,(int) age,"male");
cache.put(name, cat);
}
return cat;
}
}
測試:
public class CatServiceTest {
CatService catService=new CatService();
@Before
public void setUp() throws Exception {
CacheFactory.ensureCluster();
}
@After
public void tearDown() throws Exception {
CacheFactory.shutdown();
}
@Test
public void test() {
Cat tomCat=catService.getCat("tom");
Cat tomCatFromCache=catService.getCat("tom");
System.out.println(tomCat);
assertEquals(tomCat, tomCatFromCache);
}
}
Coherence推薦采用pof作為Serializer,這樣不需要實現(xiàn)序列化接口,而且性能非常高,需要做以下幾件事實現(xiàn)這個:
1 創(chuàng)建Serializer類:
public class CatSerializer implements PofSerializer {
@Override
public Object deserialize(PofReader pofReader) throws IOException {
String sName=pofReader.readString(0);
Cat cat=new Cat();
cat.setName(sName);
pofReader.registerIdentity(cat);
cat.setAge(pofReader.readInt(1));
cat.setSex(pofReader.readString(2));
pofReader.readRemainder();
return cat;
}
@Override
public void serialize(PofWriter pofWriter, Object object) throws IOException {
Cat cat=(Cat)object;
pofWriter.writeString(0,cat.getName());
pofWriter.writeInt(1, cat.getAge());
pofWriter.writeString(2, cat.getSex());
pofWriter.writeRemainder(null);
}
}
2 創(chuàng)建一個coherence-config文件,指定serializer,共有三個級別的指定,針對特定service,針對所有service,針對jvm,下面是針對所有service。
<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-config http://xmlns.oracle.com/coherence/coherence-cache-config/1.1/coherence-cache-config.xsd">
<!-- The defaults element defines factory-wide default settings. -->
<defaults>
<!-- Note: This element defines the default serializer for all services
defined within this cache configuration descriptor. Valid values include
full serializer definitions, as well as named references to serializers defined
within the "serializers" element of the operational configuration. Example
values include: java, pof. Default value is java. -->
<!--<serializer system-property="tangosol.coherence.serializer" />-->
<serializer>
<instance>
<class-name>com.tangosol.io.pof.ConfigurablePofContext</class-name>
<init-params>
<init-param>
<param-type>String</param-type>
<param-value>custom-pof-config.xml</param-value>
</init-param>
</init-params>
</instance>
</serializer>
3 編寫custom-pof-config.xml,注冊serializer:
<?xml version="1.0"?>
<pof-config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/coherence/coherence-pof-config"
xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-pof-config http://xmlns.oracle.com/coherence/coherence-pof-config/1.1/coherence-pof-config.xsd">
<user-type-list>
<!-- include all "standard" Coherence POF user types -->
<include>coherence-pof-config.xml</include>
<user-type>
<type-id>1001</type-id>
<class-name>org.jport.coherence.demo.Cat</class-name>
<serializer>
<class-name>org.jport.coherence.demo.CatSerializer</class-name>
</serializer>
</user-type>
</user-type-list>
</pof-config>
4 指定這個自定義的coherence-config.xml,在jvm啟動參數(shù)里:
-Dtangosol.coherence.cacheconfig=C:\workspace\AdfprjModel\src\custom-coherence-cache-config.xml
由于我是用JUnit進(jìn)行測試,因此就是把這個寫在run junit的configuration里了。
如果屬性是引用了其他的類也沒問題:
public class Cat {
private String name;
private int age;
private String sex;
private Owner owner;
public class Owner {
private String name;
private String phoneNumber;
public Owner(String name, String phoneNumber) {
super();
this.name = name;
this.phoneNumber = phoneNumber;
}
創(chuàng)建Owner的Serializer:
public class OwnerSerializer implements PofSerializer {
@Override
public Object deserialize(PofReader pofReader) throws IOException {
String sName=pofReader.readString(0);
Owner owner=new Owner();
owner.setName(sName);
pofReader.registerIdentity(owner);
owner.setPhoneNumber(pofReader.readString(1));
pofReader.readRemainder();
return owner;
}
@Override
public void serialize(PofWriter pofWriter, Object object) throws IOException {
Owner owner=(Owner)object;
pofWriter.writeString(0,owner.getName());
pofWriter.writeString(1, owner.getPhoneNumber());
pofWriter.writeRemainder(null);
}
}
修改Cat的Serializer:
public class CatSerializer implements PofSerializer {
@Override
public Object deserialize(PofReader pofReader) throws IOException {
String sName=pofReader.readString(0);
Cat cat=new Cat();
cat.setName(sName);
pofReader.registerIdentity(cat);
cat.setAge(pofReader.readInt(1));
cat.setSex(pofReader.readString(2));
cat.setOwner((Owner) pofReader.readObject(3));
pofReader.readRemainder();
return cat;
}
@Override
public void serialize(PofWriter pofWriter, Object object) throws IOException {
Cat cat=(Cat)object;
pofWriter.writeString(0,cat.getName());
pofWriter.writeInt(1, cat.getAge());
pofWriter.writeString(2, cat.getSex());
pofWriter.writeObject(3, cat.getOwner());
pofWriter.writeRemainder(null);
}
}
然后在pof配置中新增該類型:
<user-type>
<type-id>1002</type-id>
<class-name>org.jport.coherence.demo.Owner</class-name>
<serializer>
<class-name>org.jport.coherence.demo.OwnerSerializer</class-name>
</serializer>
</user-type>
引用集合類:
public class Cat {
private String name;
private int age;
private String sex;
private Owner owner;
private List<Cat> childrenCats;
修改Cat服務(wù)類:
public Cat getCat(String name){
NamedCache cache = CacheFactory.getCache("AnimalCache");
Cat cat = (Cat) cache.get(name);
if(cat==null){
int age =(int) Math.round(Math.random() * 10)+5;
cat = new Cat(name, age,"male");
Owner owner = new Owner("sslaowan","1212554525");
cat.setOwner(owner);
List<Cat> childrenCats=new ArrayList<Cat>();
Cat child1 = new Cat("tt",age-3,"female");
child1.setOwner(owner);
Cat child2 = new Cat("mm",age-3,"female");
child2.setOwner(owner);
childrenCats.add(child1);
childrenCats.add(child2);
cat.setChildrenCats(childrenCats);
cache.put(name, cat);
}
return cat;
}
修改Serializer:
public class CatSerializer implements PofSerializer {
@Override
public Object deserialize(PofReader pofReader) throws IOException {
String sName=pofReader.readString(0);
Cat cat=new Cat();
cat.setName(sName);
pofReader.registerIdentity(cat);
cat.setAge(pofReader.readInt(1));
cat.setSex(pofReader.readString(2));
cat.setOwner((Owner) pofReader.readObject(3));
cat.setChildrenCats((List<Cat>) pofReader.readCollection(4, new ArrayList<Cat>()));
pofReader.readRemainder();
return cat;
}
@Override
public void serialize(PofWriter pofWriter, Object object) throws IOException {
Cat cat=(Cat)object;
pofWriter.writeString(0,cat.getName());
pofWriter.writeInt(1, cat.getAge());
pofWriter.writeString(2, cat.getSex());
pofWriter.writeObject(3, cat.getOwner());
pofWriter.writeCollection(4, cat.getChildrenCats(), Cat.class);
pofWriter.writeRemainder(null);
}
}
測試結(jié)果如下:
Cat [name=tom, age=6, sex=male, owner=Owner [name=sslaowan, phoneNumber=1212554525],
childrenCats=[Cat [name=tt, age=3, sex=female, owner=Owner [name=sslaowan, phoneNumber=1212554525], childrenCats=null],
Cat [name=mm, age=3, sex=female, owner=Owner [name=sslaowan, phoneNumber=1212554525], childrenCats=null]]]
運行多個節(jié)點加入集群,可以讓JUnit測試
Group{Address=224.3.7.0, Port=37000, TTL=4}
MasterMemberSet(
ThisMember=Member(Id=4, Timestamp=2012-05-23 17:44:27.749, Address=192.168.56.1:8094, MachineId=14169, Location=site:,machine:wanxing-PC,process:12444, Role=EclipseJdtRemoteTestRunner)
OldestMember=Member(Id=1, Timestamp=2012-05-23 17:35:23.01, Address=192.168.56.1:8088, MachineId=14169, Location=site:,machine:wanxing-PC,process:14536, Role=EclipseJdtRemoteTestRunner)
ActualMemberSet=MemberSet(Size=4
Member(Id=1, Timestamp=2012-05-23 17:35:23.01, Address=192.168.56.1:8088, MachineId=14169, Location=site:,machine:wanxing-PC,process:14536, Role=EclipseJdtRemoteTestRunner)
Member(Id=2, Timestamp=2012-05-23 17:35:28.781, Address=192.168.56.1:8090, MachineId=14169, Location=site:,machine:wanxing-PC,process:13692, Role=EclipseJdtRemoteTestRunner)
Member(Id=3, Timestamp=2012-05-23 17:36:06.641, Address=192.168.56.1:8092, MachineId=14169, Location=site:,machine:wanxing-PC,process:14964, Role=EclipseJdtRemoteTestRunner)
Member(Id=4, Timestamp=2012-05-23 17:44:27.749, Address=192.168.56.1:8094, MachineId=14169, Location=site:,machine:wanxing-PC,process:12444, Role=EclipseJdtRemoteTestRunner)
)
MemberId|ServiceVersion|ServiceJoined|MemberState
1|3.7.1|2012-05-23 17:35:23.01|JOINED,
2|3.7.1|2012-05-23 17:35:28.781|JOINED,
3|3.7.1|2012-05-23 17:36:06.641|JOINED,
4|3.7.1|2012-05-23 17:44:27.769|JOINED
RecycleMillis=1200000
RecycleSet=MemberSet(Size=0
)
)
TcpRing{Connections=[3]}
IpMonitor{AddressListSize=0}
關(guān)于pof的更多內(nèi)容看這個: