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 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;
}
}