- 浏览: 478756 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
龘龘龘:
TrueBrian 写道有个问题,Sample 1中,为了控制 ...
What's New on Java 7 Phaser -
龘龘龘:
楼主总结的不错。
What's New on Java 7 Phaser -
TrueBrian:
有个问题,Sample 1中,为了控制线程的启动时机,博主实际 ...
What's New on Java 7 Phaser -
liguanqun811:
不知道楼主是否对zookeeper实现的分布式锁进行过性能测试 ...
Distributed Lock -
hobitton:
mysql的get lock有版本限制,否则get lock可 ...
Distributed Lock
2. Terracotta Eclipse Plugin
开发基于Terracotta的应用程序的最便捷的方法就是使用TerracottaEclipse Plugin。http://www.terracotta.org/web/display/docs/Eclipse+Plugin+Guide上有详细的安装说明。安装完毕后,通过Terracotta->Add Terracotta Nature可以给已有的工程增加Terracotta Nature。此外也可以通过File->New->Project->Java->Terracotta Projects->Terracotta DSO Project创建一个Terracotta工程。Terracotta工程创建完毕后,工程的根目录下会创建tc-config.xml、terracotta目录和一个Boot jar。tc-config.xml包含了所有Terracotta相关的配置信息,例如需要进行字节码加强的类、Lock相关的配置,共享对象的root、分布式方法的配置等。Terracotta目录用于保存Terracotta客户端的日志和统计信息等。Boot jar的作用会在稍后的章节里介绍。接下来通过两个例子介绍一下Terracotta Eclipse Plugin的使用。
2.1 wait/notify
设想某个线程A调用了某个对象obj的wait方法后被阻塞,接下来另一个线程B调用了obj的notify方法从而唤醒了线程A。这在单个JVM中是司空见惯的场景了。但是有没有设想过B线程可以在一个不同于线程A所在的JVM中调用obj的notify方法从而唤醒线程A呢?这在Terracotta的世界里也是司空见惯的场景。
首先建立一个Terracotta工程,然后创建以下两个普通的Java类:
package tcinaction; public class A { public static final Object OBJECT = new Object(); public static void main(String args[]) throws InterruptedException { System.out.println("A is waiting on OBJECT..."); synchronized(OBJECT) { OBJECT.wait(); } System.out.println("A was woken up"); } } package tcinaction; public class B { public static void main(String args[]) throws InterruptedException { System.out.println("B is calling A.OBJECT.notify()..."); synchronized(A.OBJECT) { A.OBJECT.notify(); } } }
然后在Package Explorer中选中A,单击右键选中Terracotta->Module A.java->Instrumented,也就是令Terracotta对A类进行字节码加强。对B类也执行同样操作。接下来在A类的OBJECT静态成员变量上单击右键,选中Terracotta->Field OBJECT->Shared root,这样A类的OBJECT就成了在Terracotta中共享的对象。再接下来在A类的main方法上单击右键,选中Terracotta->Method main->Autolock,在弹出的Specify Autolock Attributes对话框中选中Write。对B类的main方法也执行相同的操作。经过了以上操作之后,tc-config.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <con:tc-config xmlns:con="http://www.terracotta.org/config"> <servers> <server host="%i" name="localhost"> <dso-port>9510</dso-port> <jmx-port>9520</jmx-port> <data>terracotta/server-data</data> <logs>terracotta/server-logs</logs> <statistics>terracotta/cluster-statistics</statistics> </server> </servers> <clients> <logs>terracotta/client-logs</logs> <statistics>terracotta/client-statistics/%D</statistics> </clients> <application> <dso> <instrumented-classes> <include> <class-expression>tcinaction.A</class-expression> </include> <include> <class-expression>tcinaction.B</class-expression> </include> </instrumented-classes> <roots> <root> <field-name>tcinaction.A.OBJECT</field-name> </root> </roots> <locks> <autolock auto-synchronized="false"> <method-expression>void tcinaction.B.main(java.lang.String[])</method-expression> <lock-level>write</lock-level> </autolock> <autolock auto-synchronized="false"> <method-expression>void tcinaction.A.main(java.lang.String[])</method-expression> <lock-level>write</lock-level> </autolock> </locks> </dso> </application> </con:tc-config>
最后我们来验证一下程序的运行结果。首先选中A类,单击右键Run As->Terracotta DSO Application。此时首先会启动Terracotta server,然后会启动另外一个JVM,运行A类的main方法。输出如下:
A is waiting on OBJECT...
接下来选中B类,单击右键Run As->Terracotta DSO Application。此时会再启动一个JVM,执行B类的main方法,相关控制台的输出如下:
B is calling A.OBJECT.notify()...
回到A的控制台,发现其主线程已被唤醒并执行完毕,输出如下:
A is waiting on OBJECT...
A was woken up
2.2 Simple Messaging
在这个例子中介绍一个通过LinkedBlockingQueue在不同JVM中传递数据的方法。首先创建以下两个类:
package tcinaction; import java.util.concurrent.LinkedBlockingQueue; public class MessageProducer { public static final LinkedBlockingQueue<String> PIPE = new LinkedBlockingQueue<String>(); public static void main(String args[]) throws InterruptedException { for(int i = 0; i < 100; i++) { PIPE.offer("message-" + i); Thread.sleep(1000); } } } package tcinaction; public class MessageConsumer { public static void main(String args[]) throws InterruptedException { while(true) { String message = MessageProducer.PIPE.take(); System.out.println(message); } } }
然后将MessageProducer 和 MessageConsumer配置为instrumented;各自的main方法配置为Autolock(Write);MessageProducer的PIPE静态成员变量配置为Shared root。此时tc-config.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <con:tc-config xmlns:con="http://www.terracotta.org/config"> <servers> <server host="%i" name="localhost"> <dso-port>9510</dso-port> <jmx-port>9520</jmx-port> <data>terracotta/server-data</data> <logs>terracotta/server-logs</logs> <statistics>terracotta/cluster-statistics</statistics> </server> </servers> <clients> <logs>terracotta/client-logs</logs> <statistics>terracotta/client-statistics/%D</statistics> </clients> <application> <dso> <instrumented-classes> <include> <class-expression>tcinaction.MessageProducer</class-expression> </include> <include> <class-expression>tcinaction.MessageConsumer</class-expression> </include> </instrumented-classes> <locks> <autolock auto-synchronized="false"> <method-expression>void tcinaction.MessageConsumer.main(java.lang.String[])</method-expression> <lock-level>write</lock-level> </autolock> <autolock auto-synchronized="false"> <method-expression>void tcinaction.MessageProducer.main(java.lang.String[])</method-expression> <lock-level>write</lock-level> </autolock> </locks> <roots> <root> <field-name>tcinaction.MessageProducer.PIPE</field-name> </root> </roots> </dso> </application> </con:tc-config>
最后我们来验证一下程序的运行结果。首先启动MessageConsumer,单击右键Run As->Terracotta DSO Application。然后启动MessageProducer。MessageConsumer的控制台上会显示出接收到的消息:
message-0
message-1
message-2
…
发表评论
-
Terracotta in Action (3)
2009-03-25 09:20 50903 Inside Terracotta 3.1 Core T ... -
Terracotta in Action (1)
2009-03-19 21:52 62441. Introduction Terraco ... -
OpenEJB (4)
2008-05-11 09:05 3136本文部分内容节选自Enterprise JavaBeans 3 ... -
OpenEJB (3)
2008-05-11 09:04 2691本文部分内容节选自Enterprise JavaBeans 3 ... -
OpenEJB (2)
2008-05-11 09:03 3284本文部分内容节选自Enterprise JavaBeans 3 ... -
OpenEJB (1)
2008-05-10 22:39 5069本文部分内容节选自Enterprise JavaBeans 3 ... -
OpenJPA (7)
2008-03-25 21:56 351610 Miscellaneous Features 10 ... -
OpenJPA (6)
2008-03-23 21:33 62558 Object Locking 8.1 Configu ... -
OpenJPA (5)
2008-03-18 22:38 49607 Inheritance 对象使用引用以便关联到其 ... -
OpenJPA (4)
2008-03-11 23:27 70406 Query 6.1 JPQL Queries 6.1. ... -
OpenJPA (3)
2008-03-09 23:09 51944 EntityManagerFactory 4.1 Ove ... -
OpenJPA (2)
2008-03-05 23:59 72513 Metadata 通过javax.persist ... -
OpenJPA (1)
2008-03-04 23:11 68301 Overview Apache OpenJPA是 ... -
ActiveMQ in Action (7)
2008-02-27 14:33 126332.6.7 Wildcards Wil ... -
ActiveMQ in Action (6)
2008-02-26 15:22 137332.6 Features ActiveMQ包含了很多 ... -
ActiveMQ in Action (5)
2008-02-26 00:35 135312.5 Clustering ActiveMQ从多种 ... -
ActiveMQ in Action (4)
2008-02-26 00:21 112122.4 Security ActiveMQ ... -
ActiveMQ in Action (3)
2008-02-26 00:16 105912.3 Persistence 2.3.1 AMQ Mess ... -
ActiveMQ in Action (2)
2008-02-25 23:58 132172.2 Transport ActiveMQ目前支持 ... -
ActiveMQ in Action (1)
2008-02-25 23:18 237831 JMS 在介绍ActiveMQ ...
相关推荐
Demo of ehCache distributed caching with terracotta in glassFish v3 可以参考:http://blog.csdn.net/guobin0719/archive/2011/04/25/6361940.aspx
Terracotta
java ehcache terracotta 集群, 分布式缓存配置
terracotta集群负载,是个好东西
Terracotta 3.2.1 英文文档
terracotta-ee-3.5.2破解版
terracotta license.key ,
其实terracotta集群tomcat这方面的资料也算不少了··但还是会很容易出现错误·· 希望我这个文档能帮助大家!
Terracotta实现基于Tomcat的Web应用集群
ehcache的terracotta方案的比较.docx
记载了terracotta如何与tomcat、jetty等服务器的集群,解释了tc-config.xml中各个配置的作用
terracotta-eclipse-plugin-3.7.7-2013-08-19_16-03-48.tar(terracotta的Eclipse插件) 发现官网挺卡的,有时候下不了,先传上来吧,供国内用户下载,这个算最新的吧。2014-02-17下载的。
2014年05月12日最新版本, Windows版本 terracotta-ee-4.1.2.jar,terracotta-license.key
通过_Terracotta实现基于Tomcat的Web应用集群
terracotta-3.7.7.tar.gz 官方网站卡得要死,有时候不一定能下载,把最近自己用的,算最新版吧,提供在国内网站下载吧。 2014-02-17下载的。
terracotta完整开发插件,可以作为eclipse的插件,也可以单独使用,功能齐全;
terracotta-toolkit-1.3-runtime-3.2.0.jar 集群实现JAR
使用terracotta实现session共享的证实实验