如何解决规则已关闭
我写这篇文章来描述我的问题。我提出了一个(Kie服务器7.40和业务中心(工作台)7.44)。问题是,在一段时间不活动之后,如果我返回使用规则,则会在Java中抛出一个空指针异常,说它找不到端点。
我设法配置了服务器,并部署了规则项目。由于其KieSessions在kmodule.xml中设置为无状态,因此其执行策略设置为BY REQUEST。
然后,我编写了一个客户端来调用此服务器,它可以正常工作几分钟。在那之后(我认为将是10分钟),其他所有请求都将引发ClassCast异常,无论如何。如果我重新启动人机界面,它将再次工作10分钟。
我想知道是否存在配置文件或某种方式来“打开”规则。非常感谢。
这是例外:
java.lang.classCastException: java.util.LinkedHashMap cannot be cast to org.kie.api.command.Command
at org.kie.server.services.drools.DroolsKieContainerCommandServiceImpl.callContainer(DroolsKieContainerCommandServiceImpl.java:60)
at org.kie.server.remote.rest.drools.CommandResource.manageContainer(CommandResource.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:138)
at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:543)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:432)
at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:393)
at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:395)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:364)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:337)
at org.jboss.resteasy.core.Synchronousdispatcher.invoke(Synchronousdispatcher.java:440)
at org.jboss.resteasy.core.Synchronousdispatcher.lambda$invoke$4(Synchronousdispatcher.java:229)
at org.jboss.resteasy.core.Synchronousdispatcher.lambda$preprocess$0(Synchronousdispatcher.java:135)
at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358)
at org.jboss.resteasy.core.Synchronousdispatcher.preprocess(Synchronousdispatcher.java:138)
at org.jboss.resteasy.core.Synchronousdispatcher.invoke(Synchronousdispatcher.java:215)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerdispatcher.service(ServletContainerdispatcher.java:245)
at org.jboss.resteasy.plugins.server.servlet.HttpServletdispatcher.service(HttpServletdispatcher.java:61)
at org.jboss.resteasy.plugins.server.servlet.HttpServletdispatcher.service(HttpServletdispatcher.java:56)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:590)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
at io.opentracing.contrib.jaxrs2.server.SpanFinishingFilter.doFilter(SpanFinishingFilter.java:52)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet.handlers.ServletdispatchingHandler.handleRequest(ServletdispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
at io.undertow.servlet.handlers.security.SSLinformationAssociationHandler.handleRequest(SSLinformationAssociationHandler.java:132)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.disableCacheHandler.handleRequest(disableCacheHandler.java:33)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletinitialHandler.handleFirstRequest(ServletinitialHandler.java:269)
at io.undertow.servlet.handlers.ServletinitialHandler.access$100(ServletinitialHandler.java:78)
at io.undertow.servlet.handlers.ServletinitialHandler$2.call(ServletinitialHandler.java:133)
at io.undertow.servlet.handlers.ServletinitialHandler$2.call(ServletinitialHandler.java:130)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
at io.undertow.servlet.handlers.ServletinitialHandler.dispatchRequest(ServletinitialHandler.java:249)
at io.undertow.servlet.handlers.ServletinitialHandler.access$000(ServletinitialHandler.java:78)
at io.undertow.servlet.handlers.ServletinitialHandler$1.handleRequest(ServletinitialHandler.java:99)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:370)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at java.lang.Thread.run(Thread.java:748)
这是我的客户:
public class DroolsGenericclient {
private static final String URL = "http://localhost:8080/kie-server/services/rest/server";
private static final String USER = "kieserver";
private static final String PASSWORD = "kieserver1!";
private static Marshaller xStreamXml;
private static KieServicesConfiguration conf;
private static KieServicesClient client;
private static RuleServicesClient ruleClient;
//private static ProcessServicesClient processClient;
private static Set<Class<?>> allClasses;
/**
* Registra una clase (usualmente una clase DTO) en el cliente
* @param className la clase DTO a registrar en el cliente de ejecucion de reglas
*/
public static void registerClass(Class<?> className) {
if(allClasses == null) {
allClasses = new HashSet<Class<?>>();
}
allClasses.add(className);
}
/**
* Inicializa el cliente de ejecucion de reglas.<br/>
* Se deben registrar las clases DTO usando {@link com.uxorit.KieRestConfiguration#registerClass(Class) registerClass}
* <br/>Setea y deja disponible el servicio:<br/>
* <ul>
* <li><b>RuleServicesClient</b> como {@link com.uxorit.KieRestConfiguration#ruleClient ruleClient}</li>
* </ul>
*/
public static void initialize() {
Properties serverProperties = readPropertiesFile("server-config.properties");
conf = KieServicesFactory.newRestConfiguration(
serverProperties.getProperty("server.url.host") + ":" +
serverProperties.getProperty("server.url.port") +
serverProperties.getProperty("server.url.context"),serverProperties.getProperty("server.user"),serverProperties.getProperty("server.password"),Long.valueOf(serverProperties.getProperty("server.timeout"))
);
conf.setMarshallingFormat(MarshallingFormat.JSON);
if(allClasses != null && !allClasses.isEmpty()) {
conf.addExtraClasses(allClasses);
}
try {
xStreamXml = MarshallerFactory.getMarshaller(allClasses,MarshallingFormat.JSON,DroolsGenericclient.class.getClassLoader());
} catch (Exception e) {
e.printstacktrace();
}
client = KieServicesFactory.newKieServicesClient(conf);
ruleClient = client.getServicesClient(RuleServicesClient.class);
//processClient = client.getServicesClient(ProcessServicesClient.class);
}
//Para la version 7.36
/**
* Realiza una llamada al servidor remoto,ejecutando las reglas con los parametros ingresados
* @param parameters Elementos a insertar
* @param containerId Nombre del Contenedor (Proyecto de reglas)
* @param sessionId Nombre de la KieSession para acceder al paquete de reglas
* @return Devuelve la lista de parametros con las modificaciones realizadas por la regla
*/
public static List executeRules(List parameters,String containerId,String sessionId) {
InsertElementsCommand insertElementsCommand = new InsertElementsCommand(parameters);
insertElementsCommand.setoutIdentifier("outIdentifier");
FireAllRulesCommand fireAllRulesCommand = new FireAllRulesCommand();
GetobjectsCommand getobjectsCommand = new GetobjectsCommand();
//dispose session
//disposeCommand disposeCommand = new disposeCommand();
KieCommands commandsFactory = KieServices.Factory.get().getCommands();
List<Command<?>> commands = new ArrayList<Command<?>>();
BatchExecutionCommand executionCommand = commandsFactory.newBatchExecution(commands,sessionId);
commands.add(insertElementsCommand);
commands.add(fireAllRulesCommand);
commands.add(getobjectsCommand);
//commands.add(disposeCommand);
ServiceResponse<ExecutionResults> response = ruleClient.executeCommandsWithResults(containerId,xStreamXml.marshall(executionCommand));
return (List)response.getResult().getValue("outIdentifier");
}
//Para la version 7.36
/**
* Realiza una llamada al servidor remoto,ejecutando las reglas con los parametros ingresados
* @param parameters Elementos a insertar
* @param containerId Nombre del Contenedor (Proyecto de reglas)
* @param sessionId Nombre de la KieSession para acceder al paquete de reglas
* @return Devuelve la lista de parametros con las modificaciones realizadas por la regla
*/
public static Object executeRules(Object parameter,String sessionId) {
InsertObjectCommand insertObjectCommand = new InsertObjectCommand(parameter);
insertObjectCommand.setoutIdentifier("outIdentifier");
FireAllRulesCommand fireAllRulesCommand = new FireAllRulesCommand();
GetobjectsCommand getobjectsCommand = new GetobjectsCommand();
//dispose session
//disposeCommand disposeCommand = new disposeCommand();
KieCommands commandsFactory = KieServices.Factory.get().getCommands();
List<Command<?>> commands = new ArrayList<Command<?>>();
BatchExecutionCommand executionCommand = commandsFactory.newBatchExecution(commands,sessionId);
commands.add(insertObjectCommand);
commands.add(fireAllRulesCommand);
commands.add(getobjectsCommand);
//commands.add(disposeCommand);
ServiceResponse<ExecutionResults> response = ruleClient.executeCommandsWithResults(containerId,xStreamXml.marshall(executionCommand));
return response.getResult().getValue("outIdentifier");
}
//Para la version 7.36
/**
* Realiza una llamada al servidor remoto,ejecutando las reglas con los parametros ingresados
* @param parameters Elementos a insertar
* @param containerId Nombre del Contenedor (Proyecto de reglas)
* @param sessionId Nombre de la KieSession para acceder al paquete de reglas
* @param processName Nombre del proceso a ejecutar
* @return Devuelve la lista de parametros con las modificaciones realizadas por la regla
*/
public static List executeProcess(List parameters,String sessionId,String processName) {
InsertElementsCommand insertElementsCommand = new InsertElementsCommand(parameters);
insertElementsCommand.setoutIdentifier("outIdentifier");
StartProcessCommand startProcessCommand = new StartProcessCommand(processName);
startProcessCommand.setData(parameters);
GetobjectsCommand getobjectsCommand = new GetobjectsCommand();
//dispose session
//disposeCommand disposeCommand = new disposeCommand();
KieCommands commandsFactory = KieServices.Factory.get().getCommands();
List<Command<?>> commands = new ArrayList<Command<?>>();
BatchExecutionCommand executionCommand = commandsFactory.newBatchExecution(commands,sessionId);
commands.add(insertElementsCommand);
commands.add(startProcessCommand);
commands.add(getobjectsCommand);
//commands.add(disposeCommand);
ServiceResponse<ExecutionResults> response = ruleClient.executeCommandsWithResults(containerId,xStreamXml.marshall(executionCommand));
return (List)response.getResult().getValue("outIdentifier");
}
//Para la version 7.36
/**
* Realiza una llamada al servidor remoto,ejecutando las reglas con los parametros ingresados
* @param parameters Elementos a insertar
* @param containerId Nombre del Contenedor (Proyecto de reglas)
* @param sessionId Nombre de la KieSession para acceder al paquete de reglas
* @param processName Nombre del proceso a ejecutar
* @return Devuelve la lista de parametros con las modificaciones realizadas por la regla
*/
public static Object executeProcess(Object parameter,String processName) {
InsertObjectCommand insertObjectCommand = new InsertObjectCommand(parameter);
insertObjectCommand.setoutIdentifier("outIdentifier");
StartProcessCommand startProcessCommand = new StartProcessCommand(processName);
startProcessCommand.setData(Arrays.asList(parameter));
GetobjectsCommand getobjectsCommand = new GetobjectsCommand();
//dispose session
//disposeCommand disposeCommand = new disposeCommand();
KieCommands commandsFactory = KieServices.Factory.get().getCommands();
List<Command<?>> commands = new ArrayList<Command<?>>();
BatchExecutionCommand executionCommand = commandsFactory.newBatchExecution(commands,sessionId);
commands.add(insertObjectCommand);
commands.add(startProcessCommand);
commands.add(getobjectsCommand);
//commands.add(disposeCommand);
ServiceResponse<ExecutionResults> response = ruleClient.executeCommandsWithResults(containerId,xStreamXml.marshall(executionCommand));
return response.getResult().getValue("outIdentifier");
}
private static Properties readPropertiesFile(String fileName) {
FileInputStream fis = null;
Properties prop = null;
try {
fis = new FileInputStream(new java.io.File(".").getCanonicalPath() + "/" + "properties" + "/"
+ fileName);
prop = new Properties();
prop.load(fis);
} catch (FileNotFoundException fnfe) {
fnfe.printstacktrace();
} catch (IOException ioe) {
ioe.printstacktrace();
} finally {
try {
fis.close();
} catch (IOException ioe) {
ioe.printstacktrace();
}
}
return prop;
}
}
P.S。 :null将其抛出到executeProcess方法的ServiceResponse<ExecutionResults> response = ruleClient.executeCommandsWithResults(containerId,xStreamXml.marshall(executionCommand));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。