Spring 初始化2次的问题

标签: spring 初始化 问题 | 发表时间:2015-11-16 21:28 | 作者:geeksun
出处:http://www.iteye.com

在Spring的使用中,有时初始化一些公共类,比如数据源、常量配置等,这些方法会执行两次,导致程序执行出现异常。

 

一个解决方法是利用Spring的事件机制,事件机制需要实现ApplicationListener监听器,只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中初始化应用需要的初始化数据,并做防二次初始化的处理。

 

此处是一个jedis工厂类的代码:

public class JedisFactory implements ApplicationListener<ApplicationEvent> {
    private static Logger logger = LogHelper.LOG_CollectDataService;

    private static JedisPoolConfig jedisPoolConfig;

    private static JedisPool jedisPool;

    private static boolean isStart = false;

    @Value("${redis.maxActive}")
    private String maxActive;

    @Value("${redis.maxIdle}")
    private String maxIdle;

    @Value("${redis.maxWait}")
    private String maxWait;

    @Value("${redis.ip}")
    private String host;

    @Value("${redis.port}")
    private String port;

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (!isStart) {
            isStart = true;

            try {
                jedisPoolConfig = new JedisPoolConfig();

                // 最大连接数
                jedisPoolConfig.setMaxActive(Integer.parseInt(maxActive));
                // 最大空闲连接数
                jedisPoolConfig.setMaxIdle(Integer.parseInt(maxIdle));
                // 获取连接最大等待时间
                jedisPoolConfig.setMaxWait(Integer.parseInt(maxWait));
                // 设置获取连接前是否进行连接测试
                jedisPoolConfig.setTestOnBorrow(true);

                jedisPool = new JedisPool(jedisPoolConfig, host, Integer.parseInt(port));

                logger.info("JedisPool 已初始化, ", JSON.toJSONString(jedisPool));
            } catch (Exception e) {
                logger.error("JedisPool 初始化异常", e);
            }
        }
    }

    public static Jedis getJedis() {
        Jedis jedis = null;
        try {
            logger.info("jedisPool = ", jedisPool.toString());
            jedis = jedisPool.getResource();
            return jedis;
        } catch (Exception e) {
            logger.error("获取Jedis实例异常", e);
            jedisPool.returnBrokenResource(jedis);
            return null;
        }
    }

    /**
     * 将jedis对象释放回连接池中
     *
     * @param jedis 使用完毕的Jedis对象
     * @return true 释放成功;否则返回false
     */
    public static boolean release(Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
            return true;
        }

        return false;
    }
}

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring 初始化 问题] 推荐:

Spring 初始化2次的问题

- - 企业架构 - ITeye博客
在Spring的使用中,有时初始化一些公共类,比如数据源、常量配置等,这些方法会执行两次,导致程序执行出现异常. 一个解决方法是利用Spring的事件机制,事件机制需要实现ApplicationListener监听器,只要编写一个实现类实现该接口的onApplicationEvent方法,在方法体中初始化应用需要的初始化数据,并做防二次初始化的处理.

转: 当spring 容器初始化完成后执行某个方法

- - 企业架构 - ITeye博客
转自: http://www.cnblogs.com/rollenholt/p/3612440.html. 在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出哪个文件的xml文件使用了这个函数.

Spring MVC 3.2.4 ResponseBody 编码问题解决

- - 编程语言 - ITeye博客
首先请确保Spring版本为3.2.4. 问题1:使用@ResponseBody注解,返回对象类型时,如Map,中文字符,在客户端会显示为???. 解决办法:请检查依赖jar包,确保spring-context-support.jar的版本也是3.2.4,则可显示中文;. 问题2:使用@ResponseBody注解,返回String时,中文字符,在客户端会显示为???,并且contextType中会缺失encoding值,即为text/html但是,没有后面的encode.

spring声明事务失效问题

- - 编程语言 - ITeye博客
     在项目开发中遇到了一个spring事务失效的问题,检查配置文档,都没有问题,其他的类中的方法都能进行事务管理,而这个类中的方法却不行. [size=large]分析[/s[color=darkblue]ize][/color].      查看代码发现三个问题:. 原因1、在方法内抓了异常,但是没有往外抛.

spring @Transaction事务不生效问题

- - Java - 编程语言 - ITeye博客
如果你已经排除了以下问题:. 或是数据库本身不支持, 如MySQL的Myisam. 不防看看是不是由多数据源引起的:. 多数据源我们一般这样配置:. 这样, 其中一个数据源就是默认的数据源, 如A. 如果使用@Transaction注解开启事务, 默认使用默认数据源A来进行开启, 提交, 回滚 事务, 这个时候如果@Transaction方法里面是对com.B.dao进行的操作, 那么其实事务也是作用在A数据源上, 就会产生事务不生效的假象.

Spring并发访问的线程安全性问题

- - 寒江孤影
和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题.

spring mvc使用Servlet3异步要注意的几个问题

- - 企业架构 - ITeye博客
1、注意添加 true. 在web.xml中对DispatcherServlet添加true. 2、如果集成了shiro一定要注意在mapping中增加dispatcher项,否则会抛出org.apache.shiro.UnavailableSecurityManagerException异常.

前后端分离,spring boot跨域问题

- - 编程语言 - ITeye博客
1995年,同源政策由 Netscape 公司引入浏览器. 目前,所有浏览器都实行这个政策. 最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源". 所谓"同源"指的是"三个相同". 协议相同/域名相同/端口相同. 一句话:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域.

项目中单元测试容易出现的普遍问题归纳(Junit/Spring/Spring-test/Dubbo/RocketMQ/JAVA)

- - 编程语言 - ITeye博客
   最近公司要求项目在使用maven构建的时候不能跳过test的生命周期,也就是通过mvn test命令需要将整个项目运行起来. 因为之前项目组的成员都是在eclipse中去执行的unit test,在maven对所有模块构建的都是直接-Dmaven.test.skip=true的方式直接跳过UT的.

spring cloud灰度发布快速上下线问题解决 - 简书

- -
因为目前公司架构全部切换到spring cloud 模式,对于服务灰度方面没有dubbo zk的方便了,所以细细研究总结下留作备份. 目前业界有几种流行的发布部署策略,从网上资料可以搜索到,不是这次重点贴出来看看就行了. 蓝绿部署无需停机,并且风险较小. (1) 部署版本1的应用(一开始的状态). 所有外部请求的流量都打到这个版本上.