Spring boot 集成drools jar包运行加载不到内部资源解决方案

问题:

           楼主最近做了一个规则比较多的项目,甲方爸爸非得让用drools这个开源框架.所以楼主就在网上搜索了一个demo.然后照demo将项目给敲完了.但是到最后打包上测试的时候发现一个严重的问题,就是spring boot项目在package后.然后部署上测试运行包资源路径下的文件加载不到的问题..

   demo地址:Sample-Drools: 规则引擎Drools示例 

思考:

     因为考虑到drools的性能,决定将资源路径下的规则文件配置在spring bean容器中,当时采用的是资源路径加载的方式.代码如下:

    /**
     *获取资源路径下的文件
     */
    private Resource[] getRuleFiles() throws IOException {
      ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
      Resource[] resources = resourcePatternResolver.getResources( RULES_PATH +"*.*");
      return resources;
    }

    

RULES_PATH 表示资源文件下的文件夹名;

然后将加载资源的文件配置在KnowledgeBuilder的容器中,是直接进行加载的  代码:

    @Bean
    public KnowledgeBuilder getKnowledgeBuilder() throws IOException{
        KnowledgeBuilder builder=KnowledgeBuilderFactory.newKnowledgeBuilder();
        for (Resource file : getRuleFiles() ){
            builder.add(ResourceFactory.newClassPathResource(RULES_PATH+"/**/*.drl"), ResourceType.DRL);
        }
       
        return builder;
    }
将资源路径下文件加载进drools专用的资源路径下.然后就是这个在本地没有问题,但是打成jar包后就出现的资源路径加载不到的问题

解决:

   查询官方Api的Drools   ResourceFactory 类方法的newByteArrayResource(Byte[] byte);    想到先将资源文件下的文件通过流的方式转换为字符串.然后通过上面的方法将字符串转换为字节数组.加载进drools容器中.  解决代码如下:

 @Bean
    public KnowledgeBuilder getKnowledgeBuilder() throws IOException{
        KnowledgeBuilder builder=KnowledgeBuilderFactory.newKnowledgeBuilder();
        for (Resource file : getRuleFiles() ){
            logger.info("已加载资源文件名 :" +file.getFilename());
            InputStream is = file.getInputStream();
            StringBuffer buffer = new StringBuffer();
            int by = 0;
            while ((by=is.read())!=-1){
                buffer.append((char)by);
            }
            String rulesStr = buffer.toString();
           
            builder.add(ResourceFactory.newByteArrayResource(rulesStr.getBytes()), ResourceType.DRL);
        }
        return builder;
    }
流加载还可以外面封装一层BufferInputStream ,因为楼主项目资源文件较少就少写了一些,后续可以再进行优化.

好的,下面是一个简单的Spring Boot使用Drools的示例: 1. 添加Drools依赖 在pom.xml文件中添加Drools的依赖: ```xml <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>7.53.0.Final</version> </dependency> ``` 2. 创建Drools规则文件resources目录下创建一个名为"rules.drl"的文件,并添加以下规则: ```drools package com.example.demo.rules import com.example.demo.model.Message rule "Hello World" when m : Message( status == Message.HELLO, message : message ) then System.out.println( message ); m.setMessage( "Goodbye cruel world" ); m.setStatus( Message.GOODBYE ); update( m ); end ``` 3. 创建模型类 创建一个名为Message的Java类,它将用于在规则文件中定义条件和操作。 ```java public class Message { public static final int HELLO = 0; public static final int GOODBYE = 1; private String message; private int status; public String getMessage() { return this.message; } public void setMessage(String message) { this.message = message; } public int getStatus() { return this.status; } public void setStatus(int status) { this.status = status; } } ``` 4. 创建规则执行器 创建一个名为"RuleExecutor"的Java类,它将用于加载规则文件并执行规则。 ```java @Service public class RuleExecutor { private KieSession kieSession; @Autowired public RuleExecutor(KieContainer kieContainer) { kieSession = kieContainer.newKieSession(); } public void executeRules(Message message) { kieSession.insert(message); kieSession.fireAllRules(); } } ``` 5. 创建控制器 创建一个名为"DemoController"的Java类,它将用于处理HTTP请求并调用规则执行器。 ```java @RestController public class DemoController { @Autowired private RuleExecutor ruleExecutor; @GetMapping("/hello") public String hello() { Message message = new Message(); message.setStatus(Message.HELLO); message.setMessage("Hello World"); ruleExecutor.executeRules(message); return message.getMessage(); } } ``` 6. 运行应用程序 现在,您可以运行Spring Boot应用程序并访问"http://localhost:8080/hello",该应用程序将打印“Hello World”并将消息更新为“Goodbye cruel world”。 请注意,这只是一个简单的示例。在实际应用程序中,您可能需要为规则文件定义更复杂的条件和操作,并使用更复杂的模型类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值