纯注解配置教程,文件在系统排障中的应用

阅读本文需要有一定的Sping基础,最起码要成功的运行过一个SpringMVC项目。

在多个进程访问同一个文件的时候,我们肯定不希望在一个进程写入或修改文件时,另外一个进程也可以修改文件内容,这样就乱了,Linux在底层通过加锁的方式来避免这种文件,我们可以通过fcntl函数来给文件上锁,锁又分为建议锁和强制锁,建议锁,顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁,但是另外的进程还可以修改文件。在一般的情况下,内核和系统都不使用建议锁。强制性的锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他进程对其进行读写操作。采取强制性的锁对性能的影响很大,每次进行读写操作都必须检查是否有锁存在,fuctl默认是建议锁,如果想用强制锁,需要重新挂载mount系统分区,我们先看看fcntl函数
函数原型
int fcntl(int fd,int cmd,struct flock *lock);
fd为文件描述符

  1. 什么是Core dump 文件?

在传统的Spring项目中,我们要写一堆的XML文件。而这些XML文件格式要求又很严格,很不便于开发。而网上所谓的0配置,并不是纯粹的0配置,还是要写一些xml配置,只是用了几个@Service,@Controller注解而已。

cmd是一些命令参数

Core Dump 又叫核心转储。在程序运行过程中发生异常时,将其内存数据保存到文件中,这个过程叫做 Core Dump。

在这里,我讲介绍一种新的配置方式,一行XML代码都不需要,什么web.xml,Application-context.xml,Beans.xml,统统去死吧!

F_GETLK 根据lock参数值,决定是否上文件锁

在开发过程中,难免会遇到程序运行过程中异常退出的情况,这时候想要定位哪里出了问题,仅仅依靠程序自身的信息打印(日志记录)往往是不够的,这个时候就需要 Core Dump 文件来帮忙了。

首先建立一个Maven项目,Packageing方式为war,项目结构为标准Maven WebApp结构。

F_SETLK 设置lock参数值的文件锁

一个完整的 Core Dump 文件实际上相当于恢复了异常现场,利用 Core Dump 文件,可以查看到程序异常时的所有信息,变量值、栈信息、内存数据,程序异常时的运行位置(甚至记录代码行号)等等,定位所需要的一切信息都可以从 Core Dump文件获取到,能够非常有效的提高定位效率。

pom文件如下(很多依赖都没用,懒得去掉了):

F_SETLKW 这是 F_GETLK的阻塞版本,在无法获取锁时,会进入睡眠状态

  1. 如何查看Core文件?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.csonezp</groupId>
    <artifactId>springdemo</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>dataplatform Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <spring.version>4.0.1.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>

        <!-- Spring dependencies -->
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm-commons</artifactId>
            <version>2.2.3</version>
        </dependency>
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>2.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2.2</version>
        </dependency>
        <!-- Servlet API, JSTL -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.8.4</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.8.4</version>
        </dependency>

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>


        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.8</version>
        </dependency>


        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20090211</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>

        <dependency>
            <groupId>spy</groupId>
            <artifactId>spymemcached</artifactId>
            <version>2.6</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.6</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>dataplatform</finalName>
    </build>
</project> 

flock是一个结构体
flock结构体的定义如下:

Core文件默认是不开启的,运行 ulimit -c 命令,如果返回的结果为0,说明Core文件的指定大小为0,即没有开启Core文件。可以通过设置

这个时候,就该进行Spring配置了。按传统方式来的话,首先要去web.xml写一堆配置,然后建立个管理beab的Beans.xml,管理spring mvc 的xml,再写一坨一坨Bean。就是先进一点的(也就是很多人说的0配置),也就是自己的业务Bean不用写进xml了,还是很麻烦。

struct flock {
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}

ulimit -c filesize 指定Core生成文件的大小,单位为KBytes. 也可以设置 ulimit -c ulimited 不限制Core文件的大小。

而我这里讲的方式,则是完全不修改任何web.xml代码,不写一行XML代码的方式。

l_type有三个选项:
F_RDLCK : 共享锁,只读用
F_WRLCK : 独占锁(写操作锁)
F_UNLCK : 解除锁定
l_start 为相对位移量
l_whence 必须是以下几个值之一( 在 unistd.h 中定义):
SEEK_SET : 文件开始位置
SEEK_CUR: 文件当前位置
SEEK_END: 文件末尾位置

3.2 Core Dump 文件名设置

Core Dump 文件默认的名字为core,而且新的Core文件会把老的覆盖,这样我们只能看到最后一次的 Core Dump 信息,可以通过设置Core文件名称模板,使每次生成的 Core Dump 文件区分开来。

Core Dump 文件的命名规则定义在/proc/sys/kernel/core_pattern文件中,规则中还可以加入预设的变量来更好的区分Core文件,支持的变量列表如下:

变量 说明
%% %字符
%p 进程ID(PID)
%u 用户ID(UID)
%g 用户组ID
%s 触发 Core Dump 的信号
%t 触发 Core Dump 的时间(单位为秒,从 1970-01-01 00:00:00 开始计算)
%h 主机名称(主机名可以通过uname命令来查看)
%e 程序名称(无路径信息)
%E 程序的路径名称(路径中的/会被!替代)
%c Core文件的限制大小值(Linux 2.6.24版本后开始支持)

注:Core Dump 文件名的最大长度为128字节(在 Linux 2.6.19 版本前,最大长度为64字节)。

例如:可以通过下面的命令,生成文件名为core-程序名称-进程ID-时间的 Core Dump 文件:

echo "core-%e-%p-%t" > /proc/sys/kernel/core_pattern

从 Linux 2.4 版本开始,提供了一种比较原始的Core文件名设置方式,直接设置/proc/sys/kernel/core_uses_pid文件中的值为1,生成的Core文件名中便会自动加上.PID后缀,即生成的文件名为core.PID这种形式。执行下面的命令可以设置该值:

echo "1" > /proc/sys/kernel/core_uses_pid

首先,在项目立建立一个Config.java文件:

l_len 加锁的长度 0 为到文件末尾
l_pid当前文件操作的进程id号

4 如何使用 Core Dump

有了 Core Dump 文件后,可以使用GDB来加载分析,执行如下命令(假设可执行程序名称及路径为/home/hutaow/test_dump,生成的Core文件名为core):

gdb /home/hutaow/test_dump -c core

加载完成后,即可以在GDB中查看程序异常时的各种运行信息了(查看变量值、线程信息、调用栈、反汇编等等)。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/137653.htm

图片 1

**
 * Created by zhangpeng on 16-3-22.
 * 取代Beans.xml,纯注解配置各种BEAN
 */
@Configuration
@ComponentScan("com.csonezp")
@EnableWebMvc
public class Config {
    /**
     * jsp视图解析器的bean
     * @return
     */
    @Bean
    public UrlBasedViewResolver setupViewResolver() {
        UrlBasedViewResolver resolver = new UrlBasedViewResolver();
        resolver.setPrefix("/WEB-INF/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }

    /**
     * 配置数据源
     * @return
     */
    @Bean(name = "dataSource")
    public ComboPooledDataSource getDataSource() {
        try {

            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mfdb");
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setUser("root");
            dataSource.setPassword("zp1228");
            dataSource.setMaxPoolSize(75);
            return dataSource;
        } catch (Exception e) {
            return null;
        }
    }
} 

好了,下面来看一个例子:
图片 2

@Configuration注解就是告诉Spring这个是一个配置文件类,这里配置的Bean要交给Spring去管理。这个就是用来取代Beans.xml这种文件的。

我们用一个死循环来防止这个进程死掉
图片 3

本文由ca88手机版登录发布于ca88手机版,转载请注明出处:纯注解配置教程,文件在系统排障中的应用

TAG标签: ca88手机版登录
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。