`
whitesock
  • 浏览: 483817 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Terracotta in Action (2)

    博客分类:
  • EE
阅读更多

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
    …

3
1
分享到:
评论

相关推荐

    Demo - EhCache Distributed Caching With Terracotta in GlassFish v3

    Demo of ehCache distributed caching with terracotta in glassFish v3 可以参考:http://blog.csdn.net/guobin0719/archive/2011/04/25/6361940.aspx

    terracotta

    2. **故障转移**:当某个服务器出现故障时,Terracotta能够快速识别并自动将该服务器上的工作负载转移到其他健康节点,保证服务的连续性和可用性。 3. **扩展性**:随着业务增长,只需添加新的服务器节点到集群,...

    Terracotta

    ### Terracotta:分布式内存管理解决方案 #### 一、Terracotta概述 Terracotta是一种分布式内存管理和数据共享平台,其核心产品BigMemory Max旨在帮助应用程序实现数据在内存中的高效管理,尤其适用于分布式服务器...

    terracotta集群tomcat步骤

    Terracotta集群Tomcat的配置是一项复杂而关键的任务,它涉及到分布式系统中的高可用性和负载均衡。以下将详细解释这个过程中的各个步骤和相关知识点。 首先,安装Terracotta 3.2.1版本是非常基础的一步。需要注意的...

    使用terracotta进行web session 同步

    2. **配置Web应用服务器** 对于Apache Tomcat这样的Web服务器,需要配置Terracotta的连接器(如tc-server.jar)并启用Terracotta Session管理。在`server.xml`配置文件中,添加`&lt;Manager className="org.terracotta...

    terracotta-3.7.7.tar.gz

    2. **集群支持**:通过将应用程序的运行时环境扩展到多台机器,Terracotta可以实现高可用性和负载均衡。当一台服务器出现问题时,其他服务器可以接管工作,保证服务不中断。 3. **无侵入性集成**:Terracotta能够...

    通过_Terracotta实现基于Tomcat的Web应用集群

    2. **安装Terracotta** - 选择一台机器作为Terracotta服务器。 - 在所有运行Tomcat的机器上安装Terracotta客户端。 3. **安装Tomcat** - 在所有计划部署Tomcat的节点上安装Tomcat。 - 将需要集群化的Web应用...

    Terracotta+tomcat集群配置详细说明(写了一晚上。。)

    2. ** Terracotta 优化 session 同步** 在传统的 Tomcat 集群中,session 复制通常有两种策略:一是通过负载均衡器实现 session 粘性,但无法处理节点故障;二是全量复制 session,但会因大量序列化操作而增加网络...

    terracotta-ee-4.1.2.jar,terracotta-license.key

    2. **无锁数据一致性**:通过其独特的无锁数据一致性模型,Terracotta确保了在高并发环境下的数据完整性,避免了死锁和其他并发问题。 3. **热备与故障切换**:在集群中,如果一台服务器出现故障,Terracotta能自动...

    Terracotta 3.2.1 英文文档(CHM)

    Terracotta 3.2.1 英文文档

    terracotta-ee-3.5.2

    terracotta-ee-3.5.2破解版

    terracotta license.key

    terracotta license.key ,

    ehcache-terracotta代码配置

    2. Terracotta集成 Terracotta是Ehcache的一个扩展,它将Ehcache实例转变为分布式缓存,允许在多台服务器之间共享缓存数据。Terracotta通过一个中心节点管理所有缓存实例,确保数据的一致性和同步。 3. 配置Ehcache...

    使用terracotta实现session共享的证实实验

    2. **测试过程**:重复未使用Terracotta时的测试流程,但这次在多个窗口和不同服务器上进行操作时,Session信息保持了完整性和一致性,即使在某台Tomcat服务器宕机或重启的情况下,Session信息也没有丢失。...

    terracotta 集群设置说明(中文)

    记载了terracotta如何与tomcat、jetty等服务器的集群,解释了tc-config.xml中各个配置的作用

    terracotta-eclipse-plugin-3.7.7(terracotta的Eclipse插件)

    terracotta-eclipse-plugin-3.7.7-2013-08-19_16-03-48.tar(terracotta的Eclipse插件) 发现官网挺卡的,有时候下不了,先传上来吧,供国内用户下载,这个算最新的吧。2014-02-17下载的。

    terracotta-toolkit-1.3-runtime-3.2.0.jar

    terracotta-toolkit-1.3-runtime-3.2.0.jar 集群实现JAR

Global site tag (gtag.js) - Google Analytics