java外部命令mysqldump;项目中多个包时的跨包引用方法;线程池

一.java外部命令mysqldump 条件导出数据问题

Runtime.getRuntime().exec()参数问题 java导出mysql数据

Process process = Runtime.getRuntime().exec(execCMD);

int processComplete = process.waitFor();

if (processComplete == 0) {

logger.info("*************************备份成功**************************");

vehicleRTLSService.deleteExtraInfo(); //删除过期 数据

} else {

throw new RuntimeException("备份数据库失败.");

}

java执行Runtime.getRuntime().exec()调用外部的程序或命令 (win调用cmd,linux调用控制台)

exec()有多个重载方法,这里只提两种exec(String) / exec(String[])

记得尽量调用exec(String[])方法

这里解释下原因,为何不用String字符串方式;

例如: String exportCMD = “mysqldump " + “-u**”+ " -p**” + “-h” + mysqlServer + “-P”+mysqlPort+" --databases **"–quick > " + savePath;

这种字符串经过exec(String) 后方法内会将String转换成String[]参数,但是转化时对于“ ”空格比较 管道符等敏感,造成解析后参数会出现问题,导出结果不准确,或者命令错误,不予执行等;

exec(String[])方法可以避免以上问题,但是当我按条件导出时出现了条件不予执行,只导出表结构的问题。

更改前

String[] execCMD = new String[] {
"mysqldump", "-u**", "-p**", "-h" + mysqlServer ,"-P"+mysqlPort,"**","**","--where= ' TO_DAYS(NOW())-TO_DAYS(datetime)>31 ' " ,"-r" + savePath,"--quick","--single-transaction","-t"
};

注意此where条件里条件两边带’'单引号,查询很多资料都说必须加。但是当执行的时候无论加单引号(‘’)与双引号(“”)都会造成只导出表结构,无表数据的问题;最后改成无符号后成功;

 String[] execCMD = new String[] {
"mysqldump", "-u**", "-p**", "-h" + mysqlServer ,"-P"+mysqlPort,"**","**","--where=TO_DAYS(NOW())-TO_DAYS(datetime)>31" ,"-r" + savePath,"--quick","--single-transaction","-t"
};

二.项目中多个包,跨包引用方法

在当前包中添加对应的对象(由跨包方法的参数决定),添加对应引用的接口方法

@FeignClient(value = "system-docking")                             //添加引用方法所在包
@Service
public interface SysDockingFeign {

    @RequestMapping(value = "/warning/insertVideo",method = RequestMethod.POST)              //采用重定向将该方法引向所跨包的方法
    public Result<?> insertVideo(@RequestBody TbFcAutoWarning tbFcAutoWarning );
}

三.线程池

@Bean(name = "peopleThreadPoolExecutor")                //实例化,利用注解将其放置到对应方法中,一般写在开始加在的主类中         
public ThreadPoolExecutor threadPool(){
        return new ThreadPoolExecutor(50, 100, 20, TimeUnit.MINUTES, new LinkedBlockingQueue<>(6000),
                new ThreadPoolExecutor.CallerRunsPolicy());
    }

@Resource(name = "peopleThreadPoolExecutor")             //对应方法配置,写在定时器等任务中
    ThreadPoolExecutor threadPoolExecutor;
public void topic_test1(){
        threadPoolExecutor.execute(()->{......});
}

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue);

corePoolSize:核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;

maximumPoolSize:线程池最大线程数,这个参数也是一个非常重要的参数,它表示在线程池中最多能创建多少个线程;

keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;

unit:参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性:

TimeUnit.DAYS; //天

TimeUnit.HOURS; //小时

TimeUnit.MINUTES; //分钟

TimeUnit.SECONDS; //秒

TimeUnit.MILLISECONDS; //毫秒

TimeUnit.MICROSECONDS; //微妙

TimeUnit.NANOSECONDS; //纳秒

workQueue:一个阻塞队列,用来存储等待执行的任务,ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。线程池的排队策略与BlockingQueue有关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值