Durch die Umstellung des jadice web toolkit auf Spring Boot ist das Java-EE-Integrationsmodul seit Version 5.11 entfallen. Seit Version 5.12 des jadice web toolkit ist JakartaEE 9 die Grundlage der Servlets, der Betrieb in einem JavaEE-Anwendungsserver ist daher nicht mehr möglich.
Die Enterprise-Demo zeigt beispielhaft, wie die Anwendung auf einem JakartaEE-Anwendungsserver betrieben werden kann.
Executor Service
Parallel zu den vom App-Server verwalteten Threads, benötigt das jadice web toolkit eigene Threads für die Abarbeitung von asynchronen Tasks. Dazu wird ein ExecutorService verwendet.
In einer JavaEE/JakartaEE-Umgebung, kann ein ManagedExecutorService
verwendet werden. Dieser wird dann ebenfalls vom
App-Server gemanaged. Der Vorteil dabei ist, dass der Thread-Context erhalten bleibt. Wird also zum Beispiel eine
JAAS-Anmeldung am App-Server durchgeführt und diese soll im DocumentDataProvider
zur Verfügung stehen, wird dazu ein
ManagedExecutorService
benötigt, da das JAAS-Subject bei einem gewöhnlichen ExecutorService
verloren geht.
Weitere Informationen zum ManagedExecutorService
finden Sie hier.
Verwenden eines ManagedExecutorService
Das jadice web toolkit verwendet Spring Framework für das interne Management von Abhängigkeiten (Dependency Injection).
JavaEE/JakartaEE verwendet einen eigenen Lifecycle für Dependency Injection.
Die Schwierigkeit besteht nun darin, über JakartaEE-Mechanismen einen ManagedExecutorService
zu erhalten und diesen
an die Spring gemanagten Klassen zu übergeben.
Anbei eine beispielhafte Implementierung:
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.concurrent.ManagedExecutorService;
@ApplicationScoped
public class ExecutorEEBridge {
@Resource(lookup = "java:comp/DefaultManagedExecutorService")
ManagedExecutorService managedExecutorService;
@PostConstruct
protected void init() {
SpringEEBridge.getInstance().setExecutorService(managedExecutorService);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import com.levigo.jadice.web.server.internal.JWTServerContext;
@Component
public class ServerContextEEBridge {
@Autowired
JWTServerContext serverContext;
@Bean
protected void initExecutorService(){
SpringEEBridge.getInstance().setServerContext(serverContext);
}
}
import java.util.concurrent.ExecutorService;
import com.levigo.jadice.web.server.internal.JWTServerContext;
public class SpringEEBridge {
private static final SpringEEBridge instance = new SpringEEBridge();
private JWTServerContext serverContext;
private ExecutorService executorService;
public static SpringEEBridge getInstance() {
return instance;
}
private SpringEEBridge(){
}
public void setServerContext(JWTServerContext serverContext) {
this.serverContext = serverContext;
serverContext.setExecutorServiceProvider(() -> executorService);
}
public void setExecutorService(ExecutorService executorService) {
this.executorService = executorService;
}
}