Flink程序SimpleDateFormat线程不安全

SimpleDateFormat 线程不安全,使用 joda-time 实现的DateTime工具类

参考链接:https://blog.csdn.net/lingeio/article/details/107307924

1.原因

private val sdf1: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
private val sdf2: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
private val sdf3: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm")
val currentTime = sdf1.format(new Date)
val minuteTimestamp = (sdf2.parse(currentTime).getTime/1000).toString

2.异常:

java.lang.NumberFormatException: For input string: ".22022220022222E4.3E1.3E1"
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) ~[?:1.8.0_151]
	at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) ~[?:1.8.0_151]
	at java.lang.Double.parseDouble(Double.java:538) ~[?:1.8.0_151]
	at java.text.DigitList.getDouble(DigitList.java:169) ~[?:1.8.0_151]
	at java.text.DecimalFormat.parse(DecimalFormat.java:2056) ~[?:1.8.0_151]
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1869) ~[?:1.8.0_151]
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) ~[?:1.8.0_151]
	at java.text.DateFormat.parse(DateFormat.java:364) ~[?:1.8.0_151]
	at com.leadeon.service.login_realtime.LoginAnalysis$$anonfun$3.apply(LoginAnalysis.scala:109) ~[LD_Spark_ETL-assembly-2.01.jar:2.01]
	at com.leadeon.service.login_realtime.LoginAnalysis$$anonfun$3.apply(LoginAnalysis.scala:89) ~[LD_Spark_ETL-assembly-2.01.jar:2.01]

java.lang.NumberFormatException: For input string: "49."
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[?:1.8.0_151]
	at java.lang.Long.parseLong(Long.java:589) ~[?:1.8.0_151]
	at java.lang.Long.parseLong(Long.java:631) ~[?:1.8.0_151]
	at java.text.DigitList.getLong(DigitList.java:195) ~[?:1.8.0_151]
	at java.text.DecimalFormat.parse(DecimalFormat.java:2051) ~[?:1.8.0_151]
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2162) ~[?:1.8.0_151]
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514) ~[?:1.8.0_151]
	at java.text.DateFormat.parse(DateFormat.java:364) ~[?:1.8.0_151]
	at com.leadeon.service.login_realtime.LoginAnalysis$$anonfun$3.apply(LoginAnalysis.scala:109) ~[LD_Spark_ETL-assembly-2.01.jar:2.01]
	at com.leadeon.service.login_realtime.LoginAnalysis$$anonfun$3.apply(LoginAnalysis.scala:89) ~[LD_Spark_ETL-assembly-2.01.jar:2.01]

3.解决方法:

val dtf1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.SSS")
val dtf2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
val dtf3 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm")
val date = new Date()
val currentTime= new DateTime(date).toString(dtf1)
val minutes = new DateTime(date).toString(dtf3)
val timestamp = dtf1.parseDateTime(currentTime).getMillis
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink中,每个算子都可以并行执行。并行度定义了算子并行处理元素的最大数量。当并行度大于1时,每个算子实例都将在其自己的线程上运行。 如果您想在算子内部进行多线程计算,可以使用Java线程池。您可以创建一个线程池,然后将其传递给算子函数。算子函数可以将任务提交到线程池中,以便并行执行。 以下是一个简单的示例,展示如何在Flink中使用线程池: ```java public class MyMapFunction extends RichMapFunction<String, String> { private transient ExecutorService executorService; @Override public void open(Configuration parameters) throws Exception { super.open(parameters); executorService = Executors.newFixedThreadPool(4); // 创建一个大小为4的线程池 } @Override public String map(String value) throws Exception { executorService.submit(new MyTask(value)); // 将任务提交到线程池中 return value; } @Override public void close() throws Exception { super.close(); executorService.shutdown(); // 关闭线程池 } private static class MyTask implements Runnable { private final String value; public MyTask(String value) { this.value = value; } @Override public void run() { // 在这里执行具体的多线程计算任务 } } } ``` 在这个例子中,我们在open方法中创建了一个大小为4的线程池,并在map函数中将任务提交到线程池中。在close方法中,我们关闭了线程池。这个例子只是一个简单的示例,您可以根据自己的需求来调整线程池的大小和其他参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值