Apple M1 - Error opening store caused by RocksDBException: Column family not found when joining KStream to KTable - apache-kafka

I am trying to leftJoin events from 2 streams. Initially, I joined 2 KStreams and everything was working fine. However, when I try to convert the second stream to a KTable, I get an error. Here is the code with the 2nd stream transformed to a KTable:
#Bean
public KafkaStreams kafkaStreams() throws IOException {
final Properties props = configureKafkaStreamsProperties();
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
final StreamsBuilder builder = new StreamsBuilder();
// 1st Structured stream
KStream<String, String> firstStream = builder.stream("topic-1", Consumed.with(Serdes.String(), Serdes.String()));
KStream<String, String> firstStreamTransformed = firstStream.map((k, v) -> {
try {
InputModelOne model = mapper.readValue(v, InputModelOne.class);
return new KeyValue<>(model.getId(), v);
} catch (Exception e) {
logger.error(e.toString());
return new KeyValue<>(k, v);
}
});
// Second stream
KStream<String, String> secondStream = builder.stream("topic-2",
Consumed.with(Serdes.String(), Serdes.String()));
KStream<String, String> secondStreamTransformed = secondStream.map((k, v) -> {
try {
InputModelTwo model = mapper.readValue(v, InputModelTwo.class);
return new KeyValue<>(model.getId(), v);
} catch (Exception e) {
logger.error(e.toString());
return new KeyValue<>(k, v);
}
});
// Build KTable from second topic
KTable<String, String> secondTable = secondStreamTransformed.toTable(Materialized.as("topic-2-table"));
// Valuejoiner
ValueJoiner<String, String, String> joiner = (one, two) -> {
try {
InputModelOne modelOne = mapper.readValue(one, InputModelOne.class);
InputModelTwo modelTwo = new InputModelTwo();
// Create output object with properties
OutputModel out = new OutputModel(modelOne.getId());
out.setOneTimestamp(modelOne.getTimestamp());
out.setTwoTimestamp(modelTwo.getTimestamp());
return mapper.writeValueAsString(out);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
};
KStream<String, String> joined = firstStreamTransformed leftJoin(secondTable,
joiner);
joined.to("joined-topics", Produced.with(Serdes.String(), Serdes.String()));
Here is the error:
org.apache.kafka.streams.errors.ProcessorStateException: Error opening store joined-topics at location /var/folders/lx/dz_x9j5d7lz4mfymgzkcn7wr0000gn/T/kafka-streams/streams-pipe/2_0/rocksdb/joined-topics
at org.apache.kafka.streams.state.internals.RocksDBTimestampedStore.openRocksDB(RocksDBTimestampedStore.java:87) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.RocksDBStore.openDB(RocksDBStore.java:186) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.RocksDBStore.init(RocksDBStore.java:254) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.WrappedStateStore.init(WrappedStateStore.java:55) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.ChangeLoggingKeyValueBytesStore.init(ChangeLoggingKeyValueBytesStore.java:55) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.WrappedStateStore.init(WrappedStateStore.java:55) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.CachingKeyValueStore.init(CachingKeyValueStore.java:75) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.WrappedStateStore.init(WrappedStateStore.java:55) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.MeteredKeyValueStore.lambda$init$1(MeteredKeyValueStore.java:122) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.metrics.StreamsMetricsImpl.maybeMeasureLatency(StreamsMetricsImpl.java:884) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.state.internals.MeteredKeyValueStore.init(MeteredKeyValueStore.java:122) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.ProcessorStateManager.registerStateStores(ProcessorStateManager.java:201) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.StateManagerUtil.registerStateStores(StateManagerUtil.java:103) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.StreamTask.initializeIfNeeded(StreamTask.java:216) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.TaskManager.tryToCompleteRestoration(TaskManager.java:433) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.StreamThread.initializeAndRestorePhase(StreamThread.java:849) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:731) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:583) ~[kafka-streams-2.8.0.jar:na]
at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:556) ~[kafka-streams-2.8.0.jar:na]
Caused by: org.rocksdb.RocksDBException: Column family not found: keyValueWithTimestamp
at org.rocksdb.RocksDB.open(Native Method) ~[rocksdbjni-6.29.4.1.jar:na]
at org.rocksdb.RocksDB.open(RocksDB.java:306) ~[rocksdbjni-6.29.4.1.jar:na]
at org.apache.kafka.streams.state.internals.RocksDBTimestampedStore.openRocksDB(RocksDBTimestampedStore.java:75) ~[kafka-streams-2.8.0.jar:na]
... 18 common frames omitted
I am using Docker for Kafka and Zookeeper and the Kafka is running locally. Any help or suggestions will be greatly appreciated. I do hope I can keep on using my Mac, instead of switching to a lower quality display. Cheers guys !

Your daily reminder to update all dependencies and restart your IDE 🥹
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-streams -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
<!-- <version>2.8.0</version> -->
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<!-- <version>2.8.0</version> -->
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-streams-avro-serde</artifactId>
<!-- <version>7.0.1</version> -->
<version>7.2.1</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-schema-serializer</artifactId>
<!-- <version>7.0.1</version> -->
<version>7.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.rocksdb/rocksdbjni -->
<dependency>
<groupId>org.rocksdb</groupId>
<artifactId>rocksdbjni</artifactId>
<!-- <version>6.29.4.1</version> -->
<version>7.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>

Related

No files found for KieBase defaultKieBase - Drool-8.33.0.Final

xls format`I am developing a spring boot restful service which need to use the Business Rule Management System. I have chosen the drools. Chosen the latest version.
I am using spring boot 2.7.7 version, drools version 8.33.0.Final & java 17 version.
Issue: I am not able to process the rules when I add in the .xlsx or .xls or .csv format.
I have tried with different options, but not working with .xlsx or .xls or .csv format. Any suggestion is welcome.
Warning error message in console:
No files found for KieBase defaultKieBase
POM.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.codeusingjava</groupId>
<artifactId>boot-drools</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>boot-drools</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
<drools.version>8.33.0.Final</drools.version>
<!-- <drools.version>8.15.0.Beta</drools.version> -->
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Drools Configuration:
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieModule;
import org.kie.api.runtime.KieContainer;
import org.kie.internal.io.ResourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
#Configuration
public class DroolsConfiguration {
private final KieServices kieServices = KieServices.Factory.get();
#Bean
public KieContainer kieContainer() {
KieContainer kieCont = null;
try {
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
kieFileSystem.write(ResourceFactory.newClassPathResource("rules/discount.xlsx"));
KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
kb.buildAll();
KieModule kieModule = kb.getKieModule();
kieCont = kieServices.newKieContainer(kieModule.getReleaseId());
}catch(Exception exception) {
exception.printStackTrace();
}
return kieCont;
}
}
DepositRateCalculator.java
package com.codeusingjava.bootdrools.controller;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.codeusingjava.bootdrools.model.DepositRequest;
#RestController
public class DepositRateController {
#Autowired
private KieContainer kieContainer;
#RequestMapping(value = "/getInterestRate", method = RequestMethod.GET, produces = "application/json")
public String getInterest(#RequestParam(required = true) String loanType,
#RequestParam(required = true) Integer durationInYear, #RequestParam(required = true) Integer age) {
KieSession kieSession = kieContainer.newKieSession();
DepositRequest depositRequest = new DepositRequest(loanType, durationInYear, age);
kieSession.insert(depositRequest);
kieSession.fireAllRules();
kieSession.dispose();
return "The interest rate for this application is " + depositRequest.getInterestRate();
}
}
DepositRequest.java
package com.codeusingjava.bootdrools.model;
public class DepositRequest {
private String loanType;
private Integer durationInYear;
private Integer age;
private String interestRate;
public DepositRequest(String loanType, Integer durationInYear, Integer age) {
super();
this.loanType = loanType;
this.durationInYear = durationInYear;
this.age = age;
}
public String getLoanType() {
return loanType;
}
public void setLoanType(String loanType) {
this.loanType = loanType;
}
public Integer getDurationInYear() {
return durationInYear;
}
public void setDurationInYear(Integer durationInYear) {
this.durationInYear = durationInYear;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getInterestRate() {
return interestRate;
}
public void setInterestRate(String interestRate) {
this.interestRate = interestRate;
}
}
Console:
Tomcat initialized with port(s): 8080 (http)
2023-02-17 13:20:01.551 INFO 19264 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-02-17 13:20:01.551 INFO 19264 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.70]
2023-02-17 13:20:01.955 INFO 19264 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-02-17 13:20:01.955 INFO 19264 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1006 ms
**2023-02-17 13:20:02.891 WARN 19264 --- [ restartedMain] o.d.c.kie.builder.impl.KieProject : No files found for KieBase defaultKieBase
2023-02-17 13:20:03.073 INFO 19264 --- [** restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2023-02-17 13:20:03.099 INFO 19264 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-02-17 13:20:03.105 INFO 19264 --- [ restartedMain] c.c.bootdrools.BootDroolsApplication : Started BootDroolsApplication in 2.433 seconds (JVM running for 3.26)`
Tested URL: localhost:8080/getInterestRate?loanType=Fixed&age=45&durationInYear=1

vlcj video runs in IDE but not externally

I am using vlcj-4.7.1 and IntelliJ.
I am using the code from https://www.tutorialspoint.com/vlcj/vlcj_play.htm
The code runs and plays the video when I run it inside the IDE, but when I run it using Windows Terminal, I receive:
Error: Unable to initialize main class alan.bartlett.videotester.App
Caused by: java.lang.NoClassDefFoundError: uk/co/caprica/vlcj/player/component/EmbeddedMediaPlayerComponent
Any ideas how to fix this ClassNotFoundError? I have installed VLC 3.0.17.4 if that info is useful.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>alan.bartlett.videotester</groupId>
<artifactId>video-test-project</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>uk.co.caprica</groupId>
<artifactId>vlcj</artifactId>
<version>4.7.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.28</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
<build>
<finalName>VideoPlayer</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.7.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>spring-boot</classifier>
<mainClass>alan.bartlett.videotester.App</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
App.java
package alan.bartlett.videotester;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.net.URISyntaxException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import uk.co.caprica.vlcj.factory.discovery.NativeDiscovery;
import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent;
/**
* This example will open a window with a play button.
* pressing play will play the hardcoded mp4 video.
*/
public class App extends JFrame {
private static final long serialVersionUID = 1L;
private static final String TITLE = "My First Media Player";
// private static final String VIDEO_PATH = "C:\\Als-data\\asb.mp4";
private static String VIDEO_PATH = getAppPath() + "media\\asb.mp4";
private final EmbeddedMediaPlayerComponent mediaPlayerComponent;
private JButton playButton;
public App(String title) {
super(title);
mediaPlayerComponent = new EmbeddedMediaPlayerComponent();
System.out.println("Media Path: " + VIDEO_PATH);
}
public void initialize() {
this.setBounds(100, 100, 600, 400);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
#Override
public void windowClosing(WindowEvent e) {
mediaPlayerComponent.release();
System.exit(0);
}
});
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
contentPane.add(mediaPlayerComponent, BorderLayout.CENTER);
JPanel controlsPane = new JPanel();
playButton = new JButton("Play");
controlsPane.add(playButton);
contentPane.add(controlsPane, BorderLayout.SOUTH);
playButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
mediaPlayerComponent.mediaPlayer().controls().play();
}
});
this.setContentPane(contentPane);
this.setVisible(true);
}
public void loadVideo(String path) {
mediaPlayerComponent.mediaPlayer().media().startPaused(path);
}
public static String getAppPath() {
File pto = null;
String str = "";
try {
// pto = new File(App.class.getProtectionDomain().getCodeSource().getLocation().toURI());
pto = new File(App.class.getProtectionDomain().getCodeSource().getLocation().toURI());
if(pto.getAbsolutePath().contains("classes")) {
str = pto.getAbsolutePath();
String toRemove = "classes";
int x = str.indexOf(toRemove);
str = str.substring(0,x) + str.substring(x+toRemove.length(),str.length());
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
System.out.println("Absolute Path: " + pto.getAbsolutePath());
System.out.println("Path : " + pto.getPath());
System.out.println("getName: " + pto.getName());
System.out.println("str: " + str);
// return pto.getAbsolutePath();
return str;
}
public static void main( String[] args ){
boolean found = new NativeDiscovery().discover();
System.out.println(found);
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
}
catch (Exception e) {
System.out.println(e);
}
App application = new App(TITLE);
application.initialize();
application.setVisible(true);
application.loadVideo(VIDEO_PATH);
}
}

Keycloak ThemeSelectorProviderFactory not a subtype error while adding custom user storage SPI

I’m trying to add a simple custom user storage SPI in keycloak 17.0.0. I have followed the keycloak documentation for creation of custom user storage SPI, But when I try to build kc I’m getting error:
ERROR: Failed to run 'build' command.
ERROR: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step org.keycloak.quarkus.deployment.KeycloakProcessor#configureProviders threw an exception: java.util.ServiceConfigurationError: org.keycloak.theme.ThemeSelectorProviderFactory: keycloak.spi.test.file.PropertyFileUserStorageProviderFactory not a subtype
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:589)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1237)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1265)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1300)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1385)
at org.keycloak.provider.DefaultProviderLoader.load(DefaultProviderLoader.java:60)
at org.keycloak.provider.ProviderManager.load(ProviderManager.java:94)
at org.keycloak.quarkus.deployment.KeycloakProcessor.loadFactories(KeycloakProcessor.java:456)
at org.keycloak.quarkus.deployment.KeycloakProcessor.configureProviders(KeycloakProcessor.java:254)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:882)
at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:829)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
ERROR: Build failure: Build failed due to errors
[error]: Build step org.keycloak.quarkus.deployment.KeycloakProcessor#configureProviders threw an exception: java.util.ServiceConfigurationError: org.keycloak.theme.ThemeSelectorProviderFactory: keycloak.spi.test.file.PropertyFileUserStorageProviderFactory not a subtype
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:589)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1237)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1265)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1300)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1385)
at org.keycloak.provider.DefaultProviderLoader.load(DefaultProviderLoader.java:60)
at org.keycloak.provider.ProviderManager.load(ProviderManager.java:94)
at org.keycloak.quarkus.deployment.KeycloakProcessor.loadFactories(KeycloakProcessor.java:456)
at org.keycloak.quarkus.deployment.KeycloakProcessor.configureProviders(KeycloakProcessor.java:254)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:882)
at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:829)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
ERROR: org.keycloak.theme.ThemeSelectorProviderFactory: keycloak.spi.test.file.PropertyFileUserStorageProviderFactory not a subtype
For more details run the same command passing the '--verbose' option. Also you can use '--help' to see the details about the usage of the particular command.
POM.xml content is:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>keycloack-SPI-Demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-core</artifactId>
<version>17.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-server-spi</artifactId>
<version>17.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<finalName>my-user-provider</finalName>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
</plugin>
</plugins>
</build>
</project>
I’m creating jar with mvn command mvn clean compile assembly:single and placing that jar in providers directory.
Content of my UserStorageFactory class is given below:
public class PropertyFileUserStorageProviderFactory implements UserStorageProviderFactory<PropertyFileUserStorageProvider> {
private static final String PROVIDER_NAME = "property-file";
protected Properties properties = new Properties();
private static final Logger logger = Logger.getLogger(PropertyFileUserStorageProviderFactory.class.getName());
#Override
public PropertyFileUserStorageProvider create(KeycloakSession keycloakSession, ComponentModel componentModel) {
return new PropertyFileUserStorageProvider(keycloakSession, componentModel, properties);
}
#Override
public String getId() {
return PROVIDER_NAME;
}
#Override
public void init(Config.Scope config) {
String path = config.get("path");
InputStream is = getClass().getClassLoader().getResourceAsStream(path);
if (is == null) {
logger.severe("Could not find users.properties in classpath");
} else {
try {
properties.load(is);
} catch (IOException ex) {
logger.severe("Failed to load users.properties file" + ex);
}
}
}
#Override
public void close() {
UserStorageProviderFactory.super.close();
}
#Override
public void postInit(KeycloakSessionFactory factory) {
UserStorageProviderFactory.super.postInit(factory);
}
#Override
public UserStorageProvider create(KeycloakSession session) {
return UserStorageProviderFactory.super.create(session);
}
#Override
public List<ProviderConfigProperty> getConfigProperties() {
return UserStorageProviderFactory.super.getConfigProperties();
}
#Override
public String getHelpText() {
return UserStorageProviderFactory.super.getHelpText();
}
#Override
public void validateConfiguration(KeycloakSession session, RealmModel realm, ComponentModel config) throws ComponentValidationException {
UserStorageProviderFactory.super.validateConfiguration(session, realm, config);
}
#Override
public void onCreate(KeycloakSession session, RealmModel realm, ComponentModel model) {
UserStorageProviderFactory.super.onCreate(session, realm, model);
}
#Override
public List<ProviderConfigProperty> getCommonProviderConfigProperties() {
return UserStorageProviderFactory.super.getCommonProviderConfigProperties();
}
#Override
public Map<String, Object> getTypeMetadata() {
return UserStorageProviderFactory.super.getTypeMetadata();
}
I'm not sure what I'm doing wrong.
Resolved it.
Just found that my file in META-INF file was name for ThemeSelectorProviderFactory instead of UserStorageProviderFactory.

Spring data gemfire error

I am new to spring data gemfire/apache geode. I am getting the following error. Can anyone explain what is wrong with my configuration?
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'gemfireCache' defined in
org.springframework.data.gemfire.config.annotation.ClientCacheConfiguration:
Invocation of init method failed; nested exception is
java.lang.ExceptionInInitializerError at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1710)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:583)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:741)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
~[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE] at
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE] at
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:388)
[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE] at
org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE] at
org.springframework.boot.SpringApplication.run(SpringApplication.java:1246)
[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE] at
org.springframework.boot.SpringApplication.run(SpringApplication.java:1234)
[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE] at
com.oreedoo.restful.RestfulGemFireApplication.main(RestfulGemFireApplication.java:32)
[main/:na] Caused by: java.lang.ExceptionInInitializerError: null at
org.apache.geode.distributed.internal.InternalDistributedSystem.(InternalDistributedSystem.java:126)
~[geode-core-1.2.1.jar:na] at
org.springframework.data.gemfire.util.DistributedSystemUtils.getDistributedSystem(DistributedSystemUtils.java:86)
~[spring-data-geode-2.0.5.RELEASE.jar:2.0.5.RELEASE] at
org.springframework.data.gemfire.client.ClientCacheFactoryBean.getDistributedSystem(ClientCacheFactoryBean.java:218)
~[spring-data-geode-2.0.5.RELEASE.jar:2.0.5.RELEASE] at
org.springframework.data.gemfire.client.ClientCacheFactoryBean.resolveProperties(ClientCacheFactoryBean.java:197)
~[spring-data-geode-2.0.5.RELEASE.jar:2.0.5.RELEASE] at
org.springframework.data.gemfire.CacheFactoryBean.afterPropertiesSet(CacheFactoryBean.java:174)
~[spring-data-geode-2.0.5.RELEASE.jar:2.0.5.RELEASE] at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1769)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1706)
~[spring-beans-5.0.4.RELEASE.jar:5.0.4.RELEASE] ... 16 common frames
omitted Caused by: java.lang.ClassCastException:
org.apache.logging.slf4j.SLF4JLogger cannot be cast to
org.apache.logging.log4j.core.Logger at
org.apache.geode.internal.logging.LogService.init(LogService.java:81)
~[geode-core-1.2.1.jar:na] at
org.apache.geode.internal.logging.LogService.(LogService.java:72)
~[geode-core-1.2.1.jar:na] ... 23 common frames omitted
Here is my configuration:
#SpringBootApplication
#ClientCacheApplication(name = "ClientGemFireApplication", logLevel =
"config")
#EnableEntityDefinedRegions(basePackageClasses = Subscription.class,
clientRegionShortcut = ClientRegionShortcut.LOCAL)
#EnableGemfireRepositories
#Import(GemFireConfiguration.class)
public class RestfulGemFireApplication {
public static void main(String[] args) {
SpringApplication.run(RestfulGemFireApplication.class, args);
}
#Bean
ApplicationRunner run(SubscriptionRepository subscriptionRepository) {
return args -> {
Subscription sub1 = new Subscription("Sub1", null, null, null, null, null, null, null, null, null, null);
Subscription sub2 = new Subscription("Sub2", null, null, null, null, null, null, null, null, null, null);
Subscription sub3 = new Subscription("Sub3", null, null, null, null, null, null, null, null, null, null);
System.out.println("Before accessing data in GemFire...");
asList(sub1, sub2, sub3).forEach(subscription -> System.out.println("\t" + subscription));
System.out.println("Saving Sub1, Sub2 and Sub3 to GemFire...");
subscriptionRepository.save(sub1);
subscriptionRepository.save(sub2);
subscriptionRepository.save(sub3);
System.out.println("Lookup each subscription by accessId...");
asList(sub1.getAccessMethodId(), sub2.getAccessMethodId(),
sub3.getAccessMethodId())
.forEach(accessMethodId -> System.out.println("\t" +
subscriptionRepository.findSubscriptionByAccessMethodId(accessMethodId)));
};
}
}
#Configuration
public class GemFireConfiguration {
public Properties gemfireProperties() {
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty("name",
RestfulGemFireApplication.class.getSimpleName());
gemfireProperties.setProperty("mcast-port", "0");
gemfireProperties.setProperty("log-level", "config");
return gemfireProperties;
}
#Bean
public CacheFactoryBean gemfireCache() {
CacheFactoryBean gemfireCache = new CacheFactoryBean();
gemfireCache.setClose(true);
gemfireCache.setProperties(gemfireProperties());
return gemfireCache;
}
#Bean
ClientRegionFactoryBean<String, Subscription> subscriptionRegion(final
GemFireCache cache) {
ClientRegionFactoryBean<String, Subscription> subscriptionRegion = new
ClientRegionFactoryBean<>();
subscriptionRegion.setCache(cache);
subscriptionRegion.setName("Subscription");
subscriptionRegion.setClose(false);
subscriptionRegion.setShortcut(ClientRegionShortcut.PROXY);
subscriptionRegion.setPersistent(false);
return subscriptionRegion;
}
}
#Region("Subscription")
#Data
public class Subscription {
#Id #NonNull//FIXME primary key
String accessMethodId;
String activationDttm;
String customerAverage;
String customerId;
String marketSegmentation;
String subscriptionOffering;
String subscriberNum;
String subscriptionStatus;
String subscriptionType;
String terminatedDttm;
String usageSegmentation;
#PersistenceConstructor
public Subscription(String accessMethodId, String activationDttm, String
customerAverage, String customerId,
String marketSegmentation, String subscriptionOffering, String
subscriberNum, String subscriptionStatus,
String subscriptionType, String terminatedDttm, String
usageSegmentation) {
super();
this.accessMethodId = accessMethodId;
this.activationDttm = activationDttm;
this.customerAverage = customerAverage;
this.customerId = customerId;
this.marketSegmentation = marketSegmentation;
this.subscriptionOffering = subscriptionOffering;
this.subscriberNum = subscriberNum;
this.subscriptionStatus = subscriptionStatus;
this.subscriptionType = subscriptionType;
this.terminatedDttm = terminatedDttm;
this.usageSegmentation = usageSegmentation;
}
}
Spring Data GemFire is tightly coupled with log4j2.
I've fixed the classcast exception with the following configuration:
pom.xml
Exclude the spring-boot-starter-logging from spring-boot-starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
(Optional) Add a log4j2.xml file under the src/maini/resources/folder
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} - [%15.15t] %-40.40c{1.} : %m%n%ex
</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="ConsoleAppender" />
</Root>
</Loggers>
</Configuration>
Placing one (and only one) of slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar dependendcy
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
i had the similar issue with
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'gemfireCache' defined in .....
java.lang.ClassCastException: org.apache.logging.slf4j.SLF4JLogger cannot be cast to org.apache.logging.log4j.core.Logger at ..
i had this dependency in my build gradle
compile 'org.springframework.data:spring-data-geode:2.0.10.RELEASE'
Fixed issue after adding this ->
configurations.all {
exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j'
}

How to test jersey restful api using jetty?

When I run test using grizzly2 follow steps here . Everything works fine. Then I tried jersey-test-framework-provider-jetty, exception happend:
MessageBodyReader not found for media type=text/html;charset=iso-8859-1, type=class com.example.resource.GenericPair, genericType=com.example.resource.GenericPair<java.lang.Integer, java.lang.String>.
HTTP 500 Server Error.
Response is:
<head>
<meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/>
<title>Error 500 </title>
</head>
<body>
<h2>HTTP ERROR: 500</h2>
<p>Problem accessing /test. Reason:
<pre> java.lang.NoSuchMethodError: org.eclipse.jetty.server.Response.getResponse(Ljavax/servlet/http/HttpServletResponse;)Lorg/eclipse/jetty/server/Response;</pre></p>
<hr />Powered by Jetty:// 9.3.10.v20160621<hr/>
</body>
</html>
May be It need some more configure using jetty. Here is my configure
#Override
protected Application configure() {
return new ResourceConfig(TestApi.class)
.register(JacksonFeature.class)
.register(JacksonJsonProvider.class)
.packages("com.example.api");
}
UPDATE
--------pom.xml---------
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-jetty</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<jersey.version>2.23.1</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jetty.version>9.3.10.v20160621</jetty.version>
</properties>
-------TestApiTest.java--------
public class TestApiTest extends JerseyTest {
#Override
protected Application configure() {
return new ResourceConfig(TestApi.class)
.register(JacksonFeature.class)
.register(JacksonJsonProvider.class)
.packages("com.example.api");
}
#Override
protected URI getBaseUri() {
return URI.create(super.getBaseUri().toString() + "");
}
#Override
protected void configureClient(ClientConfig config) {
super.configureClient(config);
}
#Test
public void testIndex() throws Exception {
Response response = target().path("test").request().get();
String responseMsg = response.readEntity(String.class);
assertEquals("this is test api", responseMsg);
}
#Test
public void testList() throws Exception {
Response response = target().path("test/list").request().get();
List<Pair> pairs = response.readEntity(new GenericType<List<Pair>>(){});//从response中读取泛型集合
assertEquals(3, pairs.size());
}
}
-----------ApiTest.java------------
#Path("test")
public class TestApi {
#GET
#Produces(MediaType.TEXT_PLAIN)
public String index() {
System.out.println("-------------");
return "this is test api";
}
#GET
#Path("/list")
#Produces(MediaType.APPLICATION_JSON)
public List<Pair> list() {
List<Pair> pairs = new ArrayList<Pair>();
pairs.add(new Pair(1, "pair1"));
pairs.add(new Pair(2, "pair2"));
pairs.add(new Pair(3, "pair3"));
return pairs;
}
}