`
longgangbai
  • 浏览: 7309124 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ActiveMQ中关于文件锁的机制的学习

阅读更多

            在ActiveMQ中提供了文件数据库机制的数据库kahadb,也即基于文件形式的数据库,文件的中操作必须采用文件锁的机制,那么是怎么实现的呢?

原理如下:

readFile = new RandomAccessFile(file, "rw"); 
FileLock lock = readFile.getChannel().tryLock(0, readFile.getChannel().size(), false);

 

具体实现代码如下:

package org.apache.kahadb.util;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;
import java.nio.channels.OverlappingFileLockException;
import java.util.Date;

/**
 * Used to lock a File.
 * 
 * @author chirino
 */
public class LockFile {
    
    private static final boolean DISABLE_FILE_LOCK = "true".equals(System.getProperty("java.nio.channels.FileLock.broken", "false"));
    final private File file;
    
    private FileLock lock;
    private RandomAccessFile readFile;
    private int lockCounter;
    private final boolean deleteOnUnlock;
    
    public LockFile(File file, boolean deleteOnUnlock) {
        this.file = file;
        this.deleteOnUnlock = deleteOnUnlock;
    }

    /**
     * @throws IOException
     */
    synchronized public void lock() throws IOException {
        if (DISABLE_FILE_LOCK) {
            return;
        }

        if( lockCounter>0 ) {
            return;
        }
        
        IOHelper.mkdirs(file.getParentFile());
        if (System.getProperty(getVmLockKey()) != null) {
            throw new IOException("File '" + file + "' could not be locked as lock is already held for this jvm.");
        }
        if (lock == null) {
            readFile = new RandomAccessFile(file, "rw");
            IOException reason = null;
            try {
                lock = readFile.getChannel().tryLock(0, readFile.getChannel().size(), false);
            } catch (OverlappingFileLockException e) {
                reason = IOExceptionSupport.create("File '" + file + "' could not be locked.",e);
            } catch (IOException ioe) {
                reason = ioe;
            }
            if (lock != null) {
                lockCounter++;
                System.setProperty(getVmLockKey(), new Date().toString());
            } else {
                // new read file for next attempt
                closeReadFile();
                if (reason != null) {
                    throw reason;
                }
                throw new IOException("File '" + file + "' could not be locked.");
            }
              
        }
    }

    /**
     */
    public void unlock() {
        if (DISABLE_FILE_LOCK) {
            return;
        }
        
        lockCounter--;
        if( lockCounter!=0 ) {
            return;
        }
        
        // release the lock..
        if (lock != null) {
            try {
                lock.release();
                System.getProperties().remove(getVmLockKey());
            } catch (Throwable ignore) {
            }
            lock = null;
        }
        closeReadFile();
        
        if( deleteOnUnlock ) {
            file.delete();
        }
    }

    private String getVmLockKey() throws IOException {
        return getClass().getName() + ".lock." + file.getCanonicalPath();
    }

    private void closeReadFile() {
        // close the file.
        if (readFile != null) {
            try {
                readFile.close();
            } catch (Throwable ignore) {
            }
            readFile = null;
        }
        
    }

}

 

分享到:
评论

相关推荐

    apache-activemq-5.18.1-bin.tar.gz

    10. **故障排查**:学习如何通过日志、监控指标和调试工具解决ActiveMQ运行过程中遇到的问题。 通过以上这些知识点,你将能够更好地理解和使用Apache ActiveMQ,构建出高效、可靠的分布式系统。不过,这只是冰山...

    ActiveMQ与Zookeeper集群测试代码

    同时,Spring配置文件(如applicationContext.xml)中会包含关于ActiveMQ和Zookeeper的连接信息,以及如何在应用程序中创建JMS模板或监听器的相关设置。 为了深入了解这个测试代码的工作原理,你需要熟悉以下概念:...

    activemq_master-slave集群安装文档

    由于ActiveMQ使用数据库锁机制确定哪个节点是Master,所以先启动的节点将成为Master。 6. 验证集群配置:可以通过发送消息到Master Broker并观察消息是否被正确复制到Slave Broker。可以使用ActiveMQ的管理控制台或...

    ActiveMQ集群

    - **错误处理**:启动过程中可能会遇到“activemqLevelDBIOExceptionhandler”错误,解决方法是在每个ActiveMQ节点下删除pax-url-aether-1.5.2.jar包,并注释掉activemq.xml中的相关日志配置。 ##### 3. 集群特性 ...

    ActiveMQ解决方案

    如果Master宕机,文件锁被释放,Slave获取锁并成为新的Master。这种方式无需修改配置文件,但需要一个分布式文件系统,可能增加在线升级的复杂性。 3. Share Database Master/Slave:类似上一种,但使用数据库锁...

    activemq-master-slave集群安装文档.doc

    在本文档中,我们关注的是ActiveMQ的Master-Slave集群配置,这是实现高可用性和容错机制的一种重要方式。 Master-Slave架构的核心思想是通过将消息复制到备用的Slave Broker,确保即使主Master Broker发生故障,...

    redis、activemq、juc、jvm、gc等知识点的脑图.rar

    通过这些资源,你可以深入理解Redis的数据结构和操作命令,掌握JVM的内存管理与调优,了解ActiveMQ的消息传递机制,以及利用JUC构建高并发应用的技巧。同时,脑图的形式使得学习过程更为直观和高效。

    p5-p7架构师学习路线.rar

    通过阅读content.json、metadata.json、manifest.json、content.xml等文件,可以进一步获取详细的学习资源和路径规划,Thumbnails可能包含了课程或者教程的预览图,帮助学习者更好地理解内容结构。在学习过程中,...

    3.1 JDBC消息存储持久化jdbc persistenceFactory高速缓存1

    - **缓存机制**:高速缓存允许ActiveMQ在写入数据库之前先将消息存储在内存中,提高性能。`<journalPersistenceAdapterFactory>`用于配置这种缓存策略。 - **配置变更**:在`<persistenceFactory>`标签内,设置`...

    Java思维导图xmind文件+导出图片

    理解通信协议传输过程中的序列化和反序列化机制 基于框架的RPC通信技术 WebService/ApacheCXF RMI/Spring RMI Hession 传统RPC技术在大型分布式架构下面临的问题 分布式架构下的RPC解决方案 Zookeeper ...

    分布式项目

    在“zheng”这个压缩包文件中,可能包含了项目的源代码、配置文件、文档和其他相关资源。你可以通过查看这些文件来了解项目的具体实现细节,例如服务的接口定义、数据库配置、日志记录等。此外,你可能还需要对项目...

    操作mq示例

    9. **性能调优**:学习如何优化MQ客户端的性能,包括批量发送、消息确认机制和连接池的使用。 10. **测试和调试**:了解如何编写单元测试和集成测试,确保MQ操作的正确性,以及如何利用调试工具定位和解决问题。 ...

    面试资源_java面试资源_

    这份名为"面试资源_java面试资源_"的压缩包文件,显然是一份专为Java Web开发者准备的面试指南,涵盖了多个核心主题,包括分布式事务、分布式锁、Redis面试题、消息队列以及MyBatis的相关知识。以下是对这些主题的...

    java 提供消息队列的使用

    在提供的"blockingQuence"文件中,可能包含关于阻塞队列(BlockingQueue)的内容。阻塞队列是Java并发包`java.util.concurrent`中的一个数据结构,它结合了队列和锁的概念,常用于构建高效的消息传递机制。在生产者-...

    微服务架构面试题系列:Dubbo+Spring Boot+Spring Cloud.zip

    本压缩包文件"微服务架构面试题系列:Dubbo+Spring Boot+Spring Cloud.zip"包含了关于微服务领域的一系列面试题目,主要涉及了Dubbo、Spring Boot、Spring Cloud等关键技术和工具。接下来,我们将深入探讨这些技术...

    字节阿里2021核心面试解读.pdf

    - JVM(Java虚拟机):涵盖了内存模型、对象头、垃圾回收机制、锁机制等。 - 数据结构:重点讲解字符串、数组、链表以及集合的原理和区别。 - 数据库与SQL优化:包含MySQL索引、SQL优化、分库分表的原理和策略。 ...

    JAVA视频下载

    10. **Java并发与多线程**:深入讨论Java的并发模型,线程安全与锁机制。 11. **JTA与事务管理**:讲解分布式事务处理,确保数据一致性。 12. **容器与部署**:如Tomcat、Jetty等应用服务器的使用,以及应用部署与...

    Java面试全方位复习攻略,详解集合框架,hashmap底层原理,多线程,消息队列,radis,spring-boot ,Spring-cloud技术,等等

    乐观锁和悲观锁是两种不同的锁机制,乐观锁假设数据更新时冲突较少,通常采用CAS(Compare-And-Swap)机制。悲观锁假设冲突较多,需要先上锁再操作,以保证数据的一致性。 消息队列:消息队列是分布式系统中常用的...

Global site tag (gtag.js) - Google Analytics