我在Spring Boot应用程序中使用以下drools配置文件从DataBase加载/执行规则,该数据库在本地运行正常但是当我尝试将应用程序部署到服务器时,我收到错误,说没有找到KieModule Bean.我将丢失的KieModule Bean添加到我的配置文件中,现在我又收到了另一个错误Failed to instantiate [org.kie.api.runtime.KieContainer]: Factory method 'kieContainer' threw exception; nested exception is java.lang.RuntimeException: Cannot find KieModule: org.default:artifact:1.0.0-SNAPSHOT.我的问题是1)为什么我需要这个Bean和2)为什么应用程序在没有缺少Bean的情况下在本地构建/运行?
如果它是部署应用程序所需的必需Bean,我是否需要通过向我的应用程序/ POM添加一些属性来专门为我的环境配置它?
public class DroolsDataBaseConfig {
@Autowired
private DataService dataService;
@PostConstruct
public void loadResourcesFromDatabase() {
try {
KieHelper helper = getKieHelper();
List<Rule> rulesFromDB = dataService.findAllRules();
for (Rule rule : rulesFromDB){
String ruleAsStr = rule.getRule();
helper.addContent(ruleAsStr, ResourceType.DRL);
}
helper.build(getKieServices().newKieBaseConfiguration());
} catch (Exception ex) {
log.error("Exception occured loading rules from Database. Exception is : " + ex);
}
}
@Bean …Run Code Online (Sandbox Code Playgroud) 我使用 Spring Boot、JPA、Oracle 12C 和下面的类型化查询来选择要处理的“新”项目。选择“新”项目后,我会更新其状态,使其不再符合选择条件,但我发现选取相同项目时存在并发问题。
我在这里读到,我需要在查询上设置“LockModeType.PESSIMISTIC_WRITE”,以防止其他线程选择同一行,但它似乎不起作用。
我是否错过了下面的内容,或者我是否需要其他配置来防止并发线程从我的表中检索相同的行?问题是否与锁定级别或实体管理器未更新/刷新有关?
我的@Transactional服务:
@Override
@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor=RuntimeException.class)
public MyObject retrieveItemByStatus(StatusEnum status) {
return myRepository.retrieveItemByStatus(status);
}
Run Code Online (Sandbox Code Playgroud)
我的存储库层中的查询:
@Override
public MyObject retrieveItemByStatus(StatusEnum status) {
String sql = "SELECT t FROM myTable t WHERE status = :status ORDER BY id ASC";
try {
TypedQuery<MyObject> query = em.createQuery(sql, MyObject.class).setParameter("status", status);
query.setLockMode(LockModeType.PESSIMISTIC_WRITE);
query.setFirstResult(0);
query.setMaxResults(1);
MyObject myObject = (MyObject) query.getSingleResult();
if (myObject != null) {
myObject.setStatus(StatusEnum.IN_PROGRESS);
MyObject myUpdatedObject = em.merge(myObject);
return myUpdatedObject;
}
} catch (IllegalArgumentException …Run Code Online (Sandbox Code Playgroud) 我已经使用Java 2.1.2(BUM-SNAPSHOT)和Java 11(下面的POM)创建了一个Spring Boot应用程序:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.BUILD-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mycompany</groupId>
<artifactId>Eureka-Service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Eureka-Service</name>
<description>Spring Boot Eureka Service</description>
<properties>
<java.version>11</java.version>
<spring-cloud.version>Greenwich.BUILD-SNAPSHOT</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下 JSON 字符串创建一个带有另一个值映射的映射:
"{\"conditionField\":\"myFieldName\",\"conditionValue\":\"myFieldValue\",\"concatenationValues\":[\"fieldValue1\",\"fieldValue2\",\"fieldValue3\"]}"
Run Code Online (Sandbox Code Playgroud)
并在我尝试将其转换为 POJO 时获得以下 JsonMappingException:
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of JSONConcatination: no String-argument constructor/factory method to deserialize from String value ('{"conditionField":"myFieldName","conditionValue":"myFieldValue","concatenationValues":["fieldValue1","fieldValue2","fieldValue3"]}')
at [Source: "{\"conditionField\":\"myFieldName\",\"conditionValue\":\"myFieldValue\",\"concatenationValues\":[\"fieldValue1\",\"fieldValue2\",\"fieldValue3\"]}"; line: 1, column: 1]
Run Code Online (Sandbox Code Playgroud)
使用以下代码:
private final Map<String, Map<String, List<String>>> jsonResources = new HashMap<String, Map<String, List<String>>>();
ObjectMapper mapper = new ObjectMapper();
JSONConcatination jsonConcatination = mapper.readValue(json, JSONConcatination.class);
Map<String, List<String>> values = new HashMap<String, List<String>>();
values.put(jsonConcatination.getConditionValue(), jsonConcatination.getConcatenationValues());
jsonResources.put(jsonConcatination.getConditionField(), values);
@Data
public class JSONConcatination {
private String conditionField;
private String conditionValue;
private List<String> concatenationValues;
}
Run Code Online (Sandbox Code Playgroud)