G
Gelöschtes Mitglied 68249
Gast
Hallo zusammen,
wir hatten den Quartz schonmal zum Laufen gebracht, meine ich, aber das ist schon lange her und wegen Problemen beim CDI hatten wir ihn dann auch wieder abgeschaltet.
Jetzt hatten wir mal wieder Zeit, aber irgendwie klappt es nicht Jobs an zu legen.
Folgende Konfiguration
JavaEE Server WLP mit Java 11 und Jakarta Featureset.
Datenbankverbindungen sind im WLP konfiguriert und funktionieren im Rest der Anwendung einwandfrei.
persistence.xml:
quartz.properties
billige implementierung
Fehlermeldung
Also Oracle-Treiber verwende ich im Classpath ojdbc8.jar. Oracle.sql.BLOB ist in der Klasse drin. Die häufigsten "Lösungen" die ich bisher gefunden habe, waren alle für andere App-Server.
Wenn ihr spontan keine Lösung für das Problem habt, aber das grundlegende Problem lösen könnt, bin ich gerne bereit etwas anderes zu versuchen.
Grundlegend war unser Problem, dass wir Timer mit @Schedule steuern. Das führt zu mehreren Problemen:
1. Wenn man einen Timer zu anderen Zeiten laufen lassen möchte, muss man neu deployen
2. Wenn man einen redundanten Server hat, dann werden bestimmte Jobs doppelt ausgeführt, d.h. wir bekommen viele Mails doppelt, weil eben zwei Server dasselbe tun.
Wenn ihr diese Probleme mit einer anderen Lösung anpacken könnt, dann gerne her damit. Ich bau gerne nochmal alles um, wenn es dann nur funktioniert.
wir hatten den Quartz schonmal zum Laufen gebracht, meine ich, aber das ist schon lange her und wegen Problemen beim CDI hatten wir ihn dann auch wieder abgeschaltet.
Jetzt hatten wir mal wieder Zeit, aber irgendwie klappt es nicht Jobs an zu legen.
Folgende Konfiguration
JavaEE Server WLP mit Java 11 und Jakarta Featureset.
Datenbankverbindungen sind im WLP konfiguriert und funktionieren im Rest der Anwendung einwandfrei.
persistence.xml:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd" version="3.0">
<persistence-unit name="atcdb" transaction-type="JTA">
<jta-data-source>jdbc/atcDataSource</jta-data-source>
<class>main.java.persistence.entities.DashboardConfig</class>
<class>main.java.persistence.entities.ActiveObject</class>
<class>main.java.persistence.entities.AmeiseAbrufDaten</class>
<class>main.java.persistence.entities.AmeiseDBObject</class>
<properties>
<property name="eclipselink.cache.shared.default" value="false" />
</properties>
</persistence-unit>
</persistence>
quartz.properties
Code:
org.quartz.scheduler.instanceName=AtcScheduler
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=5
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreCMT
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.dataSource=cmtDS
org.quartz.dataSource.cmtDS.jndiURL=jdbc/atcDataSource
org.quartz.jobStore.nonManagedTXDataSource=nonManDS
org.quartz.dataSource.nonManDS.driver=oracle.jdbc.driver.OracleDriver
org.quartz.dataSource.nonManDS.URL=URL
org.quartz.dataSource.nonManDS.user=USER
org.quartz.dataSource.nonManDS.password=PASSWORD
org.quartz.dataSource.nonManDS.maxConnections=30
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.dontSetAutoCommitFalse=true
org.quartz.jobStore.useProperties=true
billige implementierung
Java:
package main.java.timer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.ejb.DependsOn;
import jakarta.ejb.Singleton;
import jakarta.ejb.Startup;
@Startup
@Singleton
public class QuartzTimer {
private final static Logger LOG = LogManager.getLogger(QuartzTimer.class);
private static Scheduler scheduler;
@PostConstruct
public void init() {
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class).withIdentity("jobDBE", "groupDBE").build();
// Trigger the job to run now, and then repeat every 40 seconds
Trigger trigger = newTrigger().withIdentity("triggerDBE", "groupDBE").startNow()
.withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
} catch (SchedulerException se) {
LOG.error("Quartz Timer Exception beim Start:", se);
}
}
}
Fehlermeldung
Code:
[2023-06-09T15:43:33] [ERROR] [Default Executor-thread-6] main.java.timer.QuartzTimer:98 - Quartz Timer Exception beim Start:
org.quartz.JobPersistenceException: Couldn't store job: Driver's Blob representation is of an unsupported type: oracle.sql.BLOB
at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1123) ~[quartz-2.3.2.jar:?]
at org.quartz.impl.jdbcjobstore.JobStoreSupport$2.executeVoid(JobStoreSupport.java:1067) ~[quartz-2.3.2.jar:?]
at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3780) ~[quartz-2.3.2.jar:?]
at org.quartz.impl.jdbcjobstore.JobStoreSupport$VoidTransactionCallback.execute(JobStoreSupport.java:3778) ~[quartz-2.3.2.jar:?]
at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:245) ~[quartz-2.3.2.jar:?]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJobAndTrigger(JobStoreSupport.java:1063) ~[quartz-2.3.2.jar:?]
at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:855) ~[quartz-2.3.2.jar:?]
at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249) ~[quartz-2.3.2.jar:?]
at main.java.timer.QuartzTimer.init(QuartzTimer.java:44) [classes/:?]
at jdk.internal.reflect.GeneratedMethodAccessor935.invoke(Unknown Source) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
at com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:200) [com.ibm.ws.ejbcontainer.jakarta_1.0.71.jar:?]
at [internal classes]
at jdk.internal.reflect.GeneratedMethodAccessor902.invoke(Unknown Source) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
at com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:189) [com.ibm.ws.ejbcontainer.jakarta_1.0.71.jar:?]
at [internal classes]
at org.jboss.weld.module.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:81) [io.openliberty.org.jboss.weld4_1.0.71.jar:4.0.3.Final]
at com.ibm.ws.cdi.ejb.interceptor.WeldSessionBeanInterceptorWrapper.aroundInvoke(WeldSessionBeanInterceptorWrapper.java:58) [com.ibm.ws.cdi.2.0.ejb.jakarta_1.0.71.jar:?]
at [internal classes]
at jdk.internal.reflect.GeneratedMethodAccessor901.invoke(Unknown Source) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
at com.ibm.ejs.container.interceptors.InterceptorProxy.invokeInterceptor(InterceptorProxy.java:189) [com.ibm.ws.ejbcontainer.jakarta_1.0.71.jar:?]
at [internal classes]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:836) [?:?]
Caused by: java.sql.SQLException: Driver's Blob representation is of an unsupported type: oracle.sql.BLOB
at org.quartz.impl.jdbcjobstore.oracle.OracleDelegate.writeDataToBlob(OracleDelegate.java:597) ~[quartz-2.3.2.jar:?]
at org.quartz.impl.jdbcjobstore.oracle.OracleDelegate.insertJobDetail(OracleDelegate.java:183) ~[quartz-2.3.2.jar:?]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1117) ~[quartz-2.3.2.jar:?]
... 51 more
Also Oracle-Treiber verwende ich im Classpath ojdbc8.jar. Oracle.sql.BLOB ist in der Klasse drin. Die häufigsten "Lösungen" die ich bisher gefunden habe, waren alle für andere App-Server.
Wenn ihr spontan keine Lösung für das Problem habt, aber das grundlegende Problem lösen könnt, bin ich gerne bereit etwas anderes zu versuchen.
Grundlegend war unser Problem, dass wir Timer mit @Schedule steuern. Das führt zu mehreren Problemen:
1. Wenn man einen Timer zu anderen Zeiten laufen lassen möchte, muss man neu deployen
2. Wenn man einen redundanten Server hat, dann werden bestimmte Jobs doppelt ausgeführt, d.h. wir bekommen viele Mails doppelt, weil eben zwei Server dasselbe tun.
Wenn ihr diese Probleme mit einer anderen Lösung anpacken könnt, dann gerne her damit. Ich bau gerne nochmal alles um, wenn es dann nur funktioniert.