| <instrumented-classes>
<include>
<class-expression>simpleparallel.Main</class-expression>
</include>
</instrumented-classes>
<roots>
<root>
<field-name>simpleparallel.Main.inst</field-name>
</root>
</roots>
<locks>
<autolock>
<method-expression>void simpleparallel.Main.run()</method-expression>
<lock-level>write</lock-level>
</autolock>
</locks>
</dso>
</application>
</con:tc-config>
Details
5、启动Terracotta服务器:
$TC_HOME/bin/start-tc-server.sh
or
%TC_HOME%\bin\start-tc-server.bat
6、打开两个或者更多的Terminal或DOS窗口,分别启动一个测试程序:
$TC_HOME/bin/dso-java.sh -cp . simpleparallel.Main
or
%TC_HOME%\bin\dso-java.bat -cp . simpleparallel.Main
下图是同时执行三个程序的屏幕截图:

可见计数器已经在集群中被3个Java程序实例所共享。每个程序有两个线程访问计数器。这样整个集群中实际上有6个线程在同时累加计数器。
从上面的启动顺序看,整个Java代码没有作任何改动。只是增加了一个tc-config.xml文件,并且用Terracotta的dso-java启动程序启动这个Java程序就可以了。
tc-config.xml文件是使用Terracotta时最重要的配置文件。
这里面最重要的几个配置为:
1、roots:用来制定集群中要共享的数据。
<roots>
<root>
<field-name>simpleparallel.Main.inst</field-name>
</root>
</roots>
我们的例子制定共享Main类的inst对象,它包含的count和lock对象也就随之被整个集群共享了。
2、locks:
用来制定对共享数据操作的时候采用的加锁机制。
<locks>
<autolock>
<method-expression>void simpleparallel.Main.run()</method-expression>
<lock-level>write</lock-level>
</autolock>
</locks>
这个例子中给Main.run()方法定义了自动锁(autolock)。他告诉Teraccotta当这个方法对共享的数据加锁的时候(注意:Main.lock对象是共享的),使得这个锁在整个集群范围内生效。这样一来集群中任何一个线程锁住这个对象的时候,其它任何线程都要等这个锁解除后才能访问被保护的数据(Main.count)。这样计数器的访问也就在整个集群中得到了保护。
总结
Terracotta是唯一一个在JVM层实现Java集群的平台。开发团队可以在对已有的Java程序作最小修改的情况下,把系统移植到集群中。在开发新的Java代码时,也只需要按照正常的Java代码开发方式编写代码即可,无需学习任何新的API。
Terracotta通过配置文件指定集群中要共享的数据和对该数据进行访问的方法的加锁方式。这也保证了代码跟平台的松散耦合。
今天介绍的主要还是Terracotta的基本原理。实际开发的Java应用大部分都是基于Web的应用,并且有很多系统使用了Hibernate, Tomcat, Spring等工具和平台。在以后的文章中我会陆续介绍Terracotta是如何支持这些工具的。 |
发表评论