Skip to main content

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 die Grundlage der Servlets, der Betrieb in einem JavaEE-Anwendungsserver ist daher nicht mehr möglich. Mit Spring Boot 4 wird Jakarta EE 11 vorausgesetzt.

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 jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.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;
}
}