SimpleDateFormat

最近写的一个程序中一个地址处理的方法一直在获取registryTime 的时候莫名其妙的报错DataSource isclosed。

后发现SimpleDateFormat不是线程安全的,多线程时会报错很奇怪。甚至会直接停止了应用。

开始代码是这样的

@Async("addressTaskAsyncPool")
    public void add2MetaAddress(List<Map> listMaps) {
        log.debug("开始进入地址处理方法:");
        //获取当前系统的地址模型
        Model addressModel = modelMapper.selectByModelTypeAppId(ModelEnum.ADDRESSMODEL.ordinal(), appid);
        String modelName = addressModel == null ? null : addressModel.getModelName();
        if (!CollectionUtils.isEmpty(listMaps)) {
            for (int i = 0; i < listMaps.size(); i++) {
                Map map = listMaps.get(i);
                Object obj = map.get(EsDataStructDefine.ES_REGISTRY_TIME);
                Date registryTime = null;
                if (obj != null) {
                    Long date = (Long) obj;
                    registryTime = DateUtil.formatDate(DateFormatUtils.format(date,FORMAT));
                }
                if (map.get(EsDataStructDefine.ES_STORE_ID) != null) {
                    Long id = Long.parseLong(map.get(EsDataStructDefine.ES_STORE_ID).toString());
                    String content = map.get(EsDataStructDefine.ES_CONTENT) == null ? "" : map.get(EsDataStructDefine.ES_CONTENT).toString();
                    if (content.isEmpty()) {
                        log.info("诉求内容为空,跳过当前诉求");
                        continue;
                    }
                    //保存地址和诉求内容作为训练样本
                    addAppealAddress(id, content, modelName, registryTime);
                }
            }
        }
    } 
这里的时间转化就是因为这个方法是多线程,多以程序运行时到这里有会直接closed。
解决的方式有及每次使用时new 一个SimpleDateFormat,就不会在报错了。

 @Async("addressTaskAsyncPool")
    public void add2MetaAddress(List<Map> listMaps) {
        log.debug("开始进入地址处理方法:");

        //获取当前系统的地址模型
        Model addressModel = modelMapper.selectByModelTypeAppId(ModelEnum.ADDRESSMODEL.ordinal(), appid);
        String modelName = addressModel == null ? null : addressModel.getModelName();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (!CollectionUtils.isEmpty(listMaps)) {
            for (int i = 0; i < listMaps.size(); i++) {
                Map map = listMaps.get(i);
                Object obj = map.get(EsDataStructDefine.ES_REGISTRY_TIME);
                Date registryTime = null;
                if (obj != null) {
                    Long date = (Long) obj;
                    String d = sdf.format(date);
                    registryTime = DateUtil.formatDate(d);
                }
                if (map.get(EsDataStructDefine.ES_STORE_ID) != null) {
                    Long id = Long.parseLong(map.get(EsDataStructDefine.ES_STORE_ID).toString());
                    String content = map.get(EsDataStructDefine.ES_CONTENT) == null ? "" : map.get(EsDataStructDefine.ES_CONTENT).toString();
                    if (content.isEmpty()) {
                        log.info("诉求内容为空,跳过当前诉求");
                        continue;
                    }
                    //保存地址和诉求内容作为训练样本
                    addAppealAddress(id, content, modelName, registryTime);
                }
            }
        }
    } 
但是资源耗费厉害。
后来发现,java有比较成熟的处理日期各种格式转化的joda-time库,接口简单并且是线程安全的;

配置pom.xml

<dependency>        
    <groupId>joda-time</groupId>        
    <artifactId>joda-time</artifactId>        
    <version>2.9.4</version>
</dependency>
 
long startTime = System.currentTimeMillis();
DateTime dt=new DateTime().withMillis(startTime);
Date dd = dt.toDate();


官网连接

http://www.joda.org/joda-time/userguide.html




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值