Lucidworks自定义Java连接器获取上次任务运行时间技术问询
在自定义Java连接器中获取上次任务运行时间的方案
好问题!在构建Fusion自定义Java连接器时,除了你已经尝试的History API调用,还有几种更原生、更高效的方式来获取或存储上次任务的运行时间,我来逐一说明:
1. 利用连接器内置的状态存储机制
Fusion的Connector SDK提供了内置的状态管理能力,你可以直接通过ConnectorContext对象来存储和读取上次任务的运行时间。这种方式不需要额外调用外部API,完全在连接器内部完成,是最推荐的方案。
实现示例:
import java.time.Instant; import com.lucidworks.fusion.connector.api.ConnectorContext; // 当任务成功运行后,存储当前启动时间 public void onTaskSuccess(ConnectorContext context) { Instant lastRunStart = Instant.now(); // 将时间序列化为字符串存储 context.setState(lastRunStart.toString()); } // 下次任务启动时,读取存储的上次运行时间 public void onTaskStart(ConnectorContext context) { String storedState = context.getState(); if (storedState != null) { Instant lastRunStart = Instant.parse(storedState); // 在这里基于上次运行时间执行你的业务逻辑,比如增量同步 System.out.println("上次任务启动时间:" + lastRunStart); } else { // 首次运行的处理逻辑 System.out.println("首次执行任务"); } }
2. 通过Job Context直接获取任务历史
如果你的连接器是基于Fusion的Job框架开发的,可以通过JobContext直接获取任务的历史执行记录,包括上次成功运行的时间。这种方式不需要手动存储状态,直接从Fusion的任务历史服务中读取。
实现示例:
import com.lucidworks.fusion.job.api.JobContext; import com.lucidworks.fusion.job.api.JobExecution; import com.lucidworks.fusion.job.api.JobStatus; import java.util.Comparator; import java.util.Optional; public void getLastRunTime(JobContext jobContext) { // 获取任务历史服务 JobHistoryService historyService = jobContext.getJobHistoryService(); // 获取上次成功执行的记录 Optional<JobExecution> lastSuccessExecution = historyService.getLastSuccessfulExecution(jobContext.getJobId()); lastSuccessExecution.ifPresent(execution -> { Instant lastRunStart = execution.getStartTime(); System.out.println("上次成功任务启动时间:" + lastRunStart); }); }
3. 优化你当前的History API调用方式
你之前用curl调用History API的方式是可行的,但在Java代码中直接执行shell命令并不优雅,也存在安全和稳定性隐患。建议改用Fusion官方的Java客户端来调用API:
实现示例:
import com.lucidworks.fusion.client.FusionClient; import com.lucidworks.fusion.client.FusionConfig; import com.lucidworks.fusion.client.JobHistoryClient; import com.lucidworks.fusion.job.api.JobExecution; import com.lucidworks.fusion.job.api.JobStatus; import java.util.Comparator; import java.util.List; import java.util.Optional; public void fetchLastRunTimeViaApi() { // 初始化Fusion客户端配置 FusionConfig config = new FusionConfig.Builder() .setHost("fusion-host") .setPort(6764) .setUsername("user") .setPassword("pass") .build(); try (FusionClient fusionClient = FusionClient.builder(config).build()) { JobHistoryClient historyClient = fusionClient.jobHistory(); // 获取指定任务的历史记录 List<JobExecution> jobHistory = historyClient.getJobHistory("datasource:movies-db"); // 筛选出成功的记录,并找到最近的一条 Optional<JobExecution> lastSuccess = jobHistory.stream() .filter(exec -> JobStatus.SUCCESS.equals(exec.getStatus())) .max(Comparator.comparing(JobExecution::getStartTime)); lastSuccess.ifPresent(exec -> System.out.println("上次成功任务启动时间:" + exec.getStartTime())); } catch (Exception e) { e.printStackTrace(); } }
方案对比总结
- 优先选择内置状态存储:实现简单,性能最优,状态与任务直接绑定,适合只需要记录上次运行时间的场景。
- 若需要完整的任务历史信息:选择Job Context获取历史,无需手动维护状态,直接从Fusion内部服务读取。
- 必须使用API调用时:改用Java客户端调用,替代shell命令,提升代码的可维护性和安全性。
内容的提问来源于stack exchange,提问作者Sharavanakumaar Murugesan
相关产品推荐
相关产品推荐

