Junit 4 测试中使用定时任务操作
难度:测试中执行线程操作
1 package com.hfepc.job.dataCollection.test; 2 3 import java.util.Date; 4 import java.util.List; 5 import java.util.Map; 6 import java.util.Timer; 7 import java.util.TimerTask; 8 import java.util.concurrent.CountDownLatch; 9 10 import javax.annotation.Resource; 11 12 import org.junit.Test; 13 import org.junit.runner.RunWith; 14 import org.pentaho.di.job.Job; 15 import org.slf4j.Logger; 16 import org.slf4j.LoggerFactory; 17 import org.springframework.test.context.ActiveProfiles; 18 import org.springframework.test.context.ContextConfiguration; 19 import org.springframework.test.context.transaction.TransactionConfiguration; 20 import org.springframework.transaction.annotation.Transactional; 21 22 import com.hfepc.service.dataCollection.IDataCollectionService; 23 import com.hfepc.service.zkinsp.MySpringJUnit4ClassRunner; 24 25 @SuppressWarnings("unused") 26 @RunWith(MySpringJUnit4ClassRunner.class) 27 @ContextConfiguration(locations = { "classpath*:spring-context.xml", 28 "classpath*:spring-servlet.xml", "classpath*:cxf-client.xml" }) 29 @ActiveProfiles("development") 30 @Transactional 31 @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) 32 public class DataCollectionTest extends Job { 33 34 private final Logger log = LoggerFactory 35 .getLogger(DataCollectionTest.class); 36 37 @Resource(name = "IDataCollectionService") 38 private IDataCollectionService IDataCollectionService; 39 40 private final int i = 3; 41 /* 42 * 线程计数器 43 * 将线程数量初始化 44 * 每执行完成一条线程,调用countDown()使计数器减1 45 * 主线程调用方法await()使其等待,当计数器为0时才被执行 46 */ 47 private final CountDownLatch latch = new CountDownLatch(i); 48 49 @Test 50 public void createTest() { 51 Timer timer; 52 timer = new Timer(); 53 timer.schedule(new TimerTaskTest03(), 0, 60000); 54 //三个参数 55 //第一个执行内容:内容是定时任务的执行内容,通过实现抽象类来完成这个动作 56 //第二个参数内容:是在第多少时间之后开始执行定时任务内容,该参数不能小于0 57 //第三个参数内容:是在两个任务之间的执行时间间隔,该参数不能小于等于0 58 try { 59 latch.await(); // 主线程等待 60 } catch (InterruptedException e) { 61 e.printStackTrace(); 62 }
70 91 private class TimerTaskTest03 extends TimerTask { 92 93 @Override 94 public void run() { 95 Date date1 = new Date(this.scheduledExecutionTime()); 96 String date = DateUtils.format(DateUtils.getCurDate(), 97 "yyyy/MM/dd");
99 log.error("本次执行该线程的时间为:" + date1); 100 log.info("时间:" + date); 101 String sql = "SELECT A.[Date] AS 'date_sta',A.barcode1 AS 'barcode1_sta',A.barcode2 AS 'barcode2_sta',A.HeightNum1Range AS 'HeightNum1Range',A.HeightNum2Range AS 'HeightNum2Range',A.HeightNum3Range AS 'HeightNum3Range',A.HeightData AS 'HeightData',A.HeightDL AS 'HeightDL',A.Num AS 'Num',A.CCDFlag AS 'CCDFlag',A.barcode3 AS 'barcode3',A.PressData AS 'PressData',B.SpurtData AS 'SpurtData',B.[Date] AS 'date_glu',B.CCDODRange AS 'CCDODRange',B.CCDODValue AS 'CCDODValue',B.CCDODFlag AS 'CCDODFlag',B.CCDConcentricityRange AS 'CCDConcentricityRange',B.CCDConcentricityValue AS 'CCDConcentricityValue',B.CCDConcentricityFlag AS 'CCDConcentricityFlag',B.barcode2 AS 'barcode2_glu',B.Static AS 'Static',B.SheetIron AS 'SheetIron',B.VerticalityFlag AS 'VerticalityFlag',B.TorsionData AS 'TorsionData' FROM[dbo].[StaticComponentsProductionData] A LEFT JOIN [dbo].[GlueDispenserProductionData] B ON A.barcode1 = B.barcode1 WHERE A.[Date] LIKE '" 102 + date + "%'"; 103 List<Map<String, Object>> rows = IDataCollectionService 104 .readSQLData(sql); 105 log.info("返回标签:" + rows.size()); 106 log.info("返回标签:" + (String) rows.get(0).get("barcode2_sta")); 108 } 109 } 110 111 }
小破防今天尚未破防! :痛苦预示着超脱
本文来自博客园,作者:小破防今天尚未破防!,转载请注明原文链接:https://www.cnblogs.com/supperlhg/p/8084516.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架