-
Notifications
You must be signed in to change notification settings - Fork 467
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
98f280e
commit 892e5cb
Showing
10 changed files
with
702 additions
and
6 deletions.
There are no files selected for viewing
54 changes: 54 additions & 0 deletions
54
dotCMS/src/main/java/com/dotcms/jobs/business/api/JobProcessorScanner.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
package com.dotcms.jobs.business.api; | ||
|
||
import com.dotcms.jobs.business.processor.JobProcessor; | ||
import com.dotmarketing.util.Logger; | ||
import java.io.IOException; | ||
import java.io.InputStream; | ||
import java.util.ArrayList; | ||
import java.util.Collection; | ||
import java.util.List; | ||
import javax.enterprise.context.ApplicationScoped; | ||
import org.jboss.jandex.ClassInfo; | ||
import org.jboss.jandex.DotName; | ||
import org.jboss.jandex.Index; | ||
import org.jboss.jandex.IndexReader; | ||
|
||
@ApplicationScoped | ||
public class JobProcessorScanner { | ||
|
||
|
||
public List<Class<? extends JobProcessor>> discoverJobProcessors() { | ||
List<Class<? extends JobProcessor>> jobProcessors = new ArrayList<>(); | ||
try { | ||
|
||
Index index = getJandexIndex(); | ||
DotName jobProcessorInterface = DotName.createSimple(JobProcessor.class.getName()); | ||
|
||
Collection<ClassInfo> implementors = index.getAllKnownImplementors(jobProcessorInterface); | ||
|
||
for (ClassInfo classInfo : implementors) { | ||
String className = classInfo.name().toString(); | ||
|
||
Class<?> clazz = Class.forName(className); | ||
if (JobProcessor.class.isAssignableFrom(clazz)) { | ||
jobProcessors.add((Class<? extends JobProcessor>) clazz); | ||
} | ||
} | ||
|
||
} catch (IOException | ClassNotFoundException e) { | ||
Logger.error(JobProcessorScanner.class, "Error discovering JobProcessors", e); | ||
|
||
} | ||
return jobProcessors; | ||
} | ||
|
||
private Index getJandexIndex() throws IOException { | ||
InputStream input = getClass().getClassLoader().getResourceAsStream("META-INF/jandex.idx"); | ||
if (input == null) { | ||
throw new IOException("Jandex index not found"); | ||
} | ||
IndexReader reader = new IndexReader(input); | ||
return reader.read(); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
14 changes: 14 additions & 0 deletions
14
dotCMS/src/main/java/com/dotcms/jobs/business/processor/Queue.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package com.dotcms.jobs.business.processor; | ||
|
||
import java.lang.annotation.Documented; | ||
import java.lang.annotation.ElementType; | ||
import java.lang.annotation.Retention; | ||
import java.lang.annotation.RetentionPolicy; | ||
import java.lang.annotation.Target; | ||
|
||
@Documented | ||
@Retention(RetentionPolicy.RUNTIME) | ||
@Target({ElementType.TYPE, ElementType.METHOD}) | ||
public @interface Queue { | ||
String value(); | ||
} |
105 changes: 105 additions & 0 deletions
105
dotCMS/src/main/java/com/dotcms/jobs/business/processor/impl/FileReaderJob.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
package com.dotcms.jobs.business.processor.impl; | ||
|
||
import com.dotcms.api.web.HttpServletRequestThreadLocal; | ||
import com.dotcms.jobs.business.error.JobCancellationException; | ||
import com.dotcms.jobs.business.job.Job; | ||
import com.dotcms.jobs.business.processor.Cancellable; | ||
import com.dotcms.jobs.business.processor.JobProcessor; | ||
import com.dotcms.jobs.business.processor.Queue; | ||
import com.dotcms.mock.request.MockHeaderRequest; | ||
import com.dotcms.mock.request.MockSessionRequest; | ||
import com.dotcms.rest.api.v1.temp.DotTempFile; | ||
import com.dotcms.rest.api.v1.temp.TempFileAPI; | ||
import com.dotmarketing.business.APILocator; | ||
import com.dotmarketing.util.Logger; | ||
import java.io.BufferedReader; | ||
import java.io.FileReader; | ||
import java.io.IOException; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Optional; | ||
import javax.servlet.http.HttpServletRequest; | ||
|
||
@Queue("FileReader") | ||
public class FileReaderJob implements JobProcessor, Cancellable { | ||
|
||
boolean working = true; | ||
|
||
@Override | ||
public void process(Job job) { | ||
// Retrieve job parameters | ||
working = true; | ||
Logger.info(this.getClass(), "Processing job: " + job.id()); | ||
Map<String, Object> params = job.parameters(); | ||
String tempFileId = (String) params.get("tempFileId"); | ||
final Object nLinesRaw = params.get("nLines"); | ||
if(!(nLinesRaw instanceof String)) { | ||
Logger.error(this.getClass(), "Parameter 'nLines' is required."); | ||
return; | ||
} | ||
|
||
final Object requestFingerPrintRaw = params.get("requestFingerPrint"); | ||
if(!(requestFingerPrintRaw instanceof String)) { | ||
Logger.error(this.getClass(), "Parameter 'requestFingerPrint' is required."); | ||
return; | ||
} | ||
final String requestFingerPrint = (String) requestFingerPrintRaw; | ||
|
||
int nLines = Integer.parseInt((String) nLinesRaw); | ||
// Validate required parameters | ||
if (tempFileId == null || nLines <= 0) { | ||
Logger.error(this.getClass(), "Parameters 'tempFileId' and 'nLines' (greater than zero) are required."); | ||
return; | ||
} | ||
|
||
|
||
final TempFileAPI tempFileAPI = APILocator.getTempFileAPI(); | ||
final Optional<DotTempFile> tempFile = tempFileAPI.getTempFile(List.of(requestFingerPrint), tempFileId); | ||
if (tempFile.isEmpty()) { | ||
Logger.error(this.getClass(), "Temporary file not found: " + tempFileId); | ||
return; | ||
} | ||
final DotTempFile dotTempFile = tempFile.get(); | ||
try (BufferedReader reader = new BufferedReader(new FileReader(dotTempFile.file))) { | ||
String line; | ||
int lineCount = 0; | ||
int totalLines = 0; | ||
|
||
Logger.info(this.getClass(), "Starting to read the file: " + dotTempFile.file.getName()); | ||
|
||
while (working && (line = reader.readLine()) != null) { | ||
lineCount++; | ||
totalLines++; | ||
|
||
// Print the line when the counter reaches nLines | ||
if (lineCount == nLines) { | ||
Logger.info(this.getClass(), "Line " + totalLines + ": " + line); | ||
lineCount = 0; // Reset the counter | ||
} | ||
Thread.sleep(1000); // Simulate processing time | ||
} | ||
|
||
Logger.info(this.getClass(), "Reading completed. Total lines read: " + totalLines); | ||
|
||
} catch (IOException e) { | ||
Logger.error(this.getClass(), "Error reading the file: " + e.getMessage()); | ||
} catch (Exception e) { | ||
Logger.error(this.getClass(), "Unexpected error during processing: " + e.getMessage()); | ||
} | ||
} | ||
|
||
@Override | ||
public Map<String, Object> getResultMetadata(Job job) { | ||
return Map.of(); | ||
} | ||
|
||
@Override | ||
public void cancel(Job job) throws JobCancellationException { | ||
Logger.info(this.getClass(), "Job cancelled: " + job.id()); | ||
|
||
working = false; | ||
} | ||
|
||
|
||
|
||
} |
Oops, something went wrong.