建材网站做环保类型思路,Wordpress装好只能访问,一般网站 要 加入 友情链接吗,wordpress 生成 htmldrools 决策表正如我在之前的文章中所展示的那样#xff0c; JBoss Drools是一个非常有用的规则引擎 。 唯一的问题是#xff0c;对于非技术人员而言#xff0c;以Rule语言创建规则可能会非常复杂。 这就是为什么人们可以提供一种简便的方法来创建业务规则-在电子表格中创建… drools 决策表 正如我在之前的文章中所展示的那样 JBoss Drools是一个非常有用的规则引擎 。 唯一的问题是对于非技术人员而言以Rule语言创建规则可能会非常复杂。 这就是为什么人们可以提供一种简便的方法来创建业务规则-在电子表格中创建决策表 在下面的示例中我将向您展示一个非常复杂的业务规则示例该示例已转换为电子表格中的决策表。 作为后端我们将有DroolsCamel和Spring。首先让我们看一下我们想象中的业务问题。 让我们假设我们经营一家专注于销售产品医疗或电子产品的业务。 我们将产品运输到几个国家PL美国GERSWE英国ESP并且根据国家/地区存在不同的法律法规 关于买方的年龄。 在某些国家/地区您可以比其他国家/地区年轻的时候购买产品。 更重要的是取决于购买者和产品所来自的国家/地区以及产品的数量购买者可能会获得折扣。 如您所见在这种情况下要实现全域需要大量条件想象对它进行编程所需的if数量。 另一个问题是业务方面与往常一样。 任何从事项目工作的人都知道需求变化的速度。 如果一个人在代码中输入了所有规则则每次需求更改时他都必须重新部署该软件。 因此将业务逻辑与代码本身分开是一个好习惯。 无论如何让我们回到例子。 首先让我们看一下电子表格在值得一看的JBoss网站上对决策表的外观进行精确描述之前 我们程序的入口是第一个检查电子表格的地方。如果应授予给定用户购买产品的可能性最好是下载电子表格并从Too Much Coding的Bitbucket存储库中使用电子表格 user_table.xls和product_table.xls或Github user_table.xls和product_table.xls user_table.xls表工作表 用户获得批准后他可能会获得折扣 product_table.xls表工作表 product_table.xls列出工作表 正如您在图中看到的业务问题非常复杂。 每行代表一个规则每列代表一个条件。 您还记得我最近的帖子中的rules语法吗 因此您应该了解电子表格的隐藏部分该部分在第一行可见行的正上方 从2到6的行代表一些固定的配置值例如规则集导入 您已经在最近的文章中看到了 和函数。 在第7行中您可以找到RuleTable的名称。 然后在第8行中在我们的场景中您将拥有CONDITION或ACTION –换句话说分别是LHS或rhe RHS。 行号9既表示条件中表示的类型又表示对变量的绑定。 在第10行中我们具有确切的LHS条件。 第11行显示列的标签。 从第12行开始我们有一条规则。 您可以在源代码中找到电子表格。 现在让我们看一下代码。 让我们从定义产品和用户的模式开始。 人格 ?xml version1.0 encodingUTF-8?
xsd:schema xmlns:xsdhttp://www.w3.org/2001/XMLSchemaxsd:include schemaLocationuser.xsd/xsd:element nameProductxsd:complexTypexsd:sequencexsd:element nameName typexsd:string/xsd:element nameType typeProductType/xsd:element namePrice typexsd:double/xsd:element nameCountryOfOrigin typeCountryType/xsd:element nameAdditionalInfo typexsd:string/xsd:element nameQuantity typexsd:int//xsd:sequence/xsd:complexType/xsd:elementxsd:simpleType nameProductTypexsd:restriction basexsd:stringxsd:enumeration valueMEDICAL/xsd:enumeration valueELECTRONIC//xsd:restriction/xsd:simpleType/xsd:schema User.xsd ?xml version1.0 encodingUTF-8?
xsd:schema xmlns:xsdhttp://www.w3.org/2001/XMLSchemaxsd:include schemaLocationproduct.xsd/xsd:element nameUserxsd:complexTypexsd:sequencexsd:element nameUserName typexsd:string/xsd:element nameUserAge typexsd:int/xsd:element nameUserCountry typeCountryType/xsd:element nameDecision typeDecisionType/xsd:element nameDecisionDescription typexsd:string//xsd:sequence/xsd:complexType/xsd:elementxsd:simpleType nameCountryTypexsd:restriction basexsd:stringxsd:enumeration valuePL/xsd:enumeration valueUSA/xsd:enumeration valueGER/xsd:enumeration valueSWE/xsd:enumeration valueUK/xsd:enumeration valueESP//xsd:restriction/xsd:simpleTypexsd:simpleType nameDecisionTypexsd:restriction basexsd:stringxsd:enumeration valueACCEPTED/xsd:enumeration valueREJECTED//xsd:restriction/xsd:simpleType/xsd:schema 由于我们正在使用Maven因此我们可能会使用一个将XSD转换为Java类的插件。 pom.xml的一部分 buildpluginManagementpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion2.5.1/version/plugin/plugins/pluginManagementpluginsplugingroupIdorg.codehaus.mojo/groupIdartifactIdjaxb2-maven-plugin/artifactIdversion1.5/versionexecutionsexecutionidxjc/idgoalsgoalxjc/goal/goals/execution/executionsconfigurationpackageNamepl.grzejszczak.marcin.drools.decisiontable.model/packageNameschemaDirectory${project.basedir}/src/main/resources/xsd/schemaDirectory/configuration/plugin/plugins/build 多亏了这个插件我们才可以在pl.grzejszczczak.marcin.decisiontable.model包中由JAXB类生成。 现在转到drools-context.xml文件其中我们就Drools定义了所有必需的bean ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:droolshttp://drools.org/schema/drools-springxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd!-- Grid Node identifier that is registered in the CamelContext --drools:grid-node idnode1/drools:kbase idproductsKBase nodenode1drools:resourcesdrools:resource typeDTABLE sourceclasspath:rules/product_table.xls//drools:resources/drools:kbasedrools:ksession idproductsKSession nameproductsKSession typestateless kbaseproductsKBase nodenode1/drools:kbase idusersKBase nodenode1drools:resourcesdrools:resource typeDTABLE sourceclasspath:rules/user_table.xls//drools:resources/drools:kbasedrools:ksession idusersKSession nameusersKSession typestateless kbaseusersKBase nodenode1//beans 如您所见与最近发布的应用程序上下文相比存在一些差异。 首先我们没有提供DRL文件作为知识库中的资源而是提供了决策表DTABLE。 我决定传递两个单独的文件但是您可以为一个文件提供几个工作表并访问这些工作表通过Decisiontable-conf元素。 另外还有一个名为node的附加元素。 我们必须选择Node接口执行网格…的实现以使Camel路由正常工作就像您在Spring应用程序上下文文件中看到的那样。 applicationContext.xml ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:camelhttp://camel.apache.org/schema/springxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring-2.8.0.xsdimport resourceclasspath:drools-context.xml/!-- Show Spring where to search for the beans (in which packages) --context:component-scan base-packagepl.grzejszczak.marcin.drools.decisiontable /camel:camelContext idcamelContextcamel:route idacceptanceRoutecamel:from uridirect:acceptanceRoute/camel:to uridrools:node1/usersKSession//camel:routecamel:route iddiscountRoutecamel:from uridirect:discountRoute/camel:to uridrools:node1/productsKSession//camel:route/camel:camelContext/beans 如您所见为了访问Drools Camel组件我们必须提供一个节点通过它我们可以访问适当的知识会话 。 我们定义了两条路线-第一条路线终止于Drools组件该组件访问用户知识会话而另一条产品知识会话。 我们有一个称为ProductServiceImpl的ProductService接口实现给定输入User和Product对象它们将通过Camel的Producer模板传递到两条以Drools组件结尾的Camel路由。 该产品服务背后的概念是我们首先处理用户是否可以购买该软件然后再检查他将获得什么样的折扣。 实际上从服务的角度来看我们只是将对象发送出去并等待响应。 最终我们收到了响应我们将用户和产品传递给金融服务实施部门该实施部门将根据用户购买的产品或在需要时拒绝其要约的价格向用户收费。 ProductServiceImpl.java package pl.grzejszczak.marcin.drools.decisiontable.service;import org.apache.camel.CamelContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import pl.grzejszczak.marcin.drools.decisiontable.model.Product;
import pl.grzejszczak.marcin.drools.decisiontable.model.User;import static com.google.common.collect.Lists.newArrayList;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 14.01.13*/
Component(productServiceImpl)
public class ProductServiceImpl implements ProductService {private static final Logger LOGGER LoggerFactory.getLogger(ProductServiceImpl.class);AutowiredCamelContext camelContext;AutowiredFinancialService financialService;Overridepublic void runProductLogic(User user, Product product) {LOGGER.debug(Running product logic - first acceptance Route, then discount Route);camelContext.createProducerTemplate().sendBody(direct:acceptanceRoute, newArrayList(user, product));camelContext.createProducerTemplate().sendBody(direct:discountRoute, newArrayList(user, product));financialService.processOrder(user, product);}} 要记住的另一件至关重要的事情是Camel Drools组件需要Command对象作为输入。 如您所见在主体中我们正在发送对象列表这些不是Command对象。 我这样做是有目的的因为我认为最好不要将我们的代码绑定到具体的解决方案。 如果我们发现有比Drools更好的解决方案怎么办 我们是要更改已创建的所有代码还是只是更改骆驼路线以指向我们的新解决方案 这就是骆驼拥有TypeConverters的原因。 我们在这里也有我们自己的。 首先让我们看一下实现。 ProductTypeConverter.java package pl.grzejszczak.marcin.drools.decisiontable.converter;import org.apache.camel.Converter;
import org.drools.command.Command;
import org.drools.command.CommandFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.grzejszczak.marcin.drools.decisiontable.model.Product;import java.util.List;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 30.01.13* Time: 21:42*/
Converter
public class ProductTypeConverter {private static final Logger LOGGER LoggerFactory.getLogger(ProductTypeConverter.class);Converterpublic static Command toCommandFromList(List inputList) {LOGGER.debug(Executing ProductTypeConverters toCommandFromList method);return CommandFactory.newInsertElements(inputList);}Converterpublic static Command toCommand(Product product) {LOGGER.debug(Executing ProductTypeConverters toCommand method);return CommandFactory.newInsert(product);}
} 在Camel网站上有一个关于TypeConverters的很好的教程–如果您需要一些更深入的信息。 无论如何我们正在注释我们的类和用于将不同类型相互转换的函数。 这里重要的是我们正在向骆驼展示如何将列表和单个产品转换为Commands。 由于类型擦除不管提供的类型如何该方法都将起作用这就是为什么即使我们提供了产品和用户列表toCommandFromList函数也将被执行。 除此之外为了使类型转换器正常工作我们还必须在/ META-INF / services / org / apache / came / TypeConverter文件中提供类FQN的完全准名称。 类型转换器 pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter 为了正确测试我们的功能应该编写许多测试来验证规则。 一种不错的方法是将输入文件存储在测试资源文件夹中然后将其传递给规则引擎然后将结果与经过验证的输出进行比较不幸的是要让业务部门开发这样的参考集是相当不可能的输出。 无论如何让我们看一下仅验证一些规则的单元测试以及运行这些规则所产生的日志 ProductServiceImplTest.java package pl.grzejszczak.marcin.drools.decisiontable.service.drools;import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import pl.grzejszczak.marcin.drools.decisiontable.model.*;
import pl.grzejszczak.marcin.drools.decisiontable.service.ProductService;import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;/*** Created with IntelliJ IDEA.* User: mgrzejszczak* Date: 03.02.13* Time: 16:06*/
RunWith(SpringJUnit4ClassRunner.class)
ContextConfiguration(classpath:applicationContext.xml)
public class ProductServiceImplTest {private static final Logger LOGGER LoggerFactory.getLogger(ProductServiceImplTest.class);AutowiredProductService objectUnderTest;Testpublic void testRunProductLogicUserPlUnderageElectronicCountryPL() throws Exception {int initialPrice 1000;int userAge 6;int quantity 10;User user createUser(Smith, CountryType.PL, userAge);Product product createProduct(Electronic, initialPrice, CountryType.PL, ProductType.ELECTRONIC, quantity);printInputs(user, product);objectUnderTest.runProductLogic(user, product);printInputs(user, product);assertTrue(product.getPrice() initialPrice);assertEquals(DecisionType.REJECTED, user.getDecision());}Testpublic void testRunProductLogicUserPlHighAgeElectronicCountryPLLowQuantity() throws Exception {int initialPrice 1000;int userAge 19;int quantity 1;User user createUser(Smith, CountryType.PL, userAge);Product product createProduct(Electronic, initialPrice, CountryType.PL, ProductType.ELECTRONIC, quantity);printInputs(user, product);objectUnderTest.runProductLogic(user, product);printInputs(user, product);assertTrue(product.getPrice() initialPrice);assertEquals(DecisionType.ACCEPTED, user.getDecision());}Testpublic void testRunProductLogicUserPlHighAgeElectronicCountryPLHighQuantity() throws Exception {int initialPrice 1000;int userAge 19;int quantity 8;User user createUser(Smith, CountryType.PL, userAge);Product product createProduct(Electronic, initialPrice, CountryType.PL, ProductType.ELECTRONIC, quantity);printInputs(user, product);objectUnderTest.runProductLogic(user, product);printInputs(user, product);double expectedDiscount 0.1;assertTrue(product.getPrice() initialPrice * (1 - expectedDiscount));assertEquals(DecisionType.ACCEPTED, user.getDecision());}Testpublic void testRunProductLogicUserUsaLowAgeElectronicCountryPLHighQuantity() throws Exception {int initialPrice 1000;int userAge 19;int quantity 8;User user createUser(Smith, CountryType.USA, userAge);Product product createProduct(Electronic, initialPrice, CountryType.PL, ProductType.ELECTRONIC, quantity);printInputs(user, product);objectUnderTest.runProductLogic(user, product);printInputs(user, product);assertTrue(product.getPrice() initialPrice);assertEquals(DecisionType.REJECTED, user.getDecision());}Testpublic void testRunProductLogicUserUsaHighAgeMedicalCountrySWELowQuantity() throws Exception {int initialPrice 1000;int userAge 22;int quantity 4;User user createUser(Smith, CountryType.USA, userAge);Product product createProduct(Some name, initialPrice, CountryType.SWE, ProductType.MEDICAL, quantity);printInputs(user, product);objectUnderTest.runProductLogic(user, product);printInputs(user, product);assertTrue(product.getPrice() initialPrice);assertEquals(DecisionType.ACCEPTED, user.getDecision());}Testpublic void testRunProductLogicUserUsaHighAgeMedicalCountrySWEHighQuantity() throws Exception {int initialPrice 1000;int userAge 22;int quantity 8;User user createUser(Smith, CountryType.USA, userAge);Product product createProduct(Some name, initialPrice, CountryType.SWE, ProductType.MEDICAL, quantity);printInputs(user, product);objectUnderTest.runProductLogic(user, product);printInputs(user, product);double expectedDiscount 0.25;assertTrue(product.getPrice() initialPrice * (1 - expectedDiscount));assertEquals(DecisionType.ACCEPTED, user.getDecision());}private void printInputs(User user, Product product) {LOGGER.debug(ReflectionToStringBuilder.reflectionToString(user, ToStringStyle.MULTI_LINE_STYLE));LOGGER.debug(ReflectionToStringBuilder.reflectionToString(product, ToStringStyle.MULTI_LINE_STYLE));}private User createUser(String name, CountryType countryType, int userAge){User user new User();user.setUserName(name);user.setUserCountry(countryType);user.setUserAge(userAge);return user;}private Product createProduct(String name, double price, CountryType countryOfOrigin, ProductType productType, int quantity){Product product new Product();product.setPrice(price);product.setCountryOfOrigin(countryOfOrigin);product.setName(name);product.setType(productType);product.setQuantity(quantity);return product;}} 当然测试中的log.debugs完全是多余的但是我希望您能快速看到这些规则是可行的。 很抱歉记录的长度但是我写了一些测试来显示不同的规则组合实际上最好有太多的记录而不是相反的记录 pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User1d48043[userNameSmithuserAge6userCountryPLdecisionnulldecisionDescriptionnull
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Product1e8f2a0[nameElectronictypeELECTRONICprice1000.0countryOfOriginPLadditionalInfonullquantity10
]
pl.grzejszczak.marcin.drools.decisiontable.service.ProductServiceImpl:31 Running product logic - first acceptance Route, then discount Route
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Sorry, according to your age ( 18) and country (PL) you cant buy this product
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.FinancialServiceImpl:29 Sorry, user has been rejected...
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User1d48043[userNameSmithuserAge6userCountryPLdecisionREJECTEDdecisionDescriptionSorry, according to your age ( 18) and country (PL) you cant buy this product
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Product1e8f2a0[nameElectronictypeELECTRONICprice1000.0countryOfOriginPLadditionalInfonullquantity10
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.Userb28f30[userNameSmithuserAge19userCountryPLdecisionnulldecisionDescriptionnull
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Productd6a0e0[nameElectronictypeELECTRONICprice1000.0countryOfOriginPLadditionalInfonullquantity1
]
pl.grzejszczak.marcin.drools.decisiontable.service.ProductServiceImpl:31 Running product logic - first acceptance Route, then discount Route
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Congratulations, you have successfully bought the product
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Sorry, no discount will be granted.
pl.grzejszczak.marcin.drools.decisiontable.service.FinancialServiceImpl:25 User has been approved - processing the order...
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.Userb28f30[userNameSmithuserAge19userCountryPLdecisionACCEPTEDdecisionDescriptionCongratulations, you have successfully bought the product
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Productd6a0e0[nameElectronictypeELECTRONICprice1000.0countryOfOriginPLadditionalInfoSorry, no discount will be granted.quantity1
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User14510ac[userNameSmithuserAge19userCountryPLdecisionnulldecisionDescriptionnull
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Product1499616[nameElectronictypeELECTRONICprice1000.0countryOfOriginPLadditionalInfonullquantity8
]
pl.grzejszczak.marcin.drools.decisiontable.service.ProductServiceImpl:31 Running product logic - first acceptance Route, then discount Route
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Congratulations, you have successfully bought the product
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Congratulations - youve been granted a 10% discount!
pl.grzejszczak.marcin.drools.decisiontable.service.FinancialServiceImpl:25 User has been approved - processing the order...
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User14510ac[userNameSmithuserAge19userCountryPLdecisionACCEPTEDdecisionDescriptionCongratulations, you have successfully bought the product
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Product1499616[nameElectronictypeELECTRONICprice900.0countryOfOriginPLadditionalInfoCongratulations - youve been granted a 10% discount!quantity8
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User17667bd[userNameSmithuserAge19userCountryUSAdecisionnulldecisionDescriptionnull
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Productad9f5d[nameElectronictypeELECTRONICprice1000.0countryOfOriginPLadditionalInfonullquantity8
]
pl.grzejszczak.marcin.drools.decisiontable.service.ProductServiceImpl:31 Running product logic - first acceptance Route, then discount Route
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Sorry, according to your age ( 18) and country (USA) you cant buy this product
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.FinancialServiceImpl:29 Sorry, user has been rejected...
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User17667bd[userNameSmithuserAge19userCountryUSAdecisionREJECTEDdecisionDescriptionSorry, according to your age ( 18) and country (USA) you cant buy this product
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Productad9f5d[nameElectronictypeELECTRONICprice1000.0countryOfOriginPLadditionalInfonullquantity8
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User9ff588[userNameSmithuserAge22userCountryUSAdecisionnulldecisionDescriptionnull
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Product1b0d2d0[nameSome nametypeMEDICALprice1000.0countryOfOriginSWEadditionalInfonullquantity4
]
pl.grzejszczak.marcin.drools.decisiontable.service.ProductServiceImpl:31 Running product logic - first acceptance Route, then discount Route
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Congratulations, you have successfully bought the product
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.FinancialServiceImpl:25 User has been approved - processing the order...
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User9ff588[userNameSmithuserAge22userCountryUSAdecisionACCEPTEDdecisionDescriptionCongratulations, you have successfully bought the product
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Product1b0d2d0[nameSome nametypeMEDICALprice1000.0countryOfOriginSWEadditionalInfonullquantity4
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User1b27882[userNameSmithuserAge22userCountryUSAdecisionnulldecisionDescriptionnull
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Product5b84b[nameSome nametypeMEDICALprice1000.0countryOfOriginSWEadditionalInfonullquantity8
]
pl.grzejszczak.marcin.drools.decisiontable.service.ProductServiceImpl:31 Running product logic - first acceptance Route, then discount Route
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Congratulations, you have successfully bought the product
pl.grzejszczak.marcin.drools.decisiontable.converter.ProductTypeConverter:25 Executing ProductTypeConverters toCommandFromList method
pl.grzejszczak.marcin.drools.decisiontable.service.ProductService:8 Congratulations, you are granted a discount
pl.grzejszczak.marcin.drools.decisiontable.service.FinancialServiceImpl:25 User has been approved - processing the order...
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:150 pl.grzejszczak.marcin.drools.decisiontable.model.User1b27882[userNameSmithuserAge22userCountryUSAdecisionACCEPTEDdecisionDescriptionCongratulations, you have successfully bought the product
]
pl.grzejszczak.marcin.drools.decisiontable.service.drools.ProductServiceImplTest:151 pl.grzejszczak.marcin.drools.decisiontable.model.Product5b84b[nameSome nametypeMEDICALprice750.0countryOfOriginSWEadditionalInfoCongratulations, you are granted a discountquantity8
] 在这篇文章中我介绍了如何通过给他一个他可以使用的工具电子表格中的决策表来将您的一些开发工作推向BA。 而且您现在将如何将Drools与Camel集成在一起。 希望您会看到如何简化业务规则的实现从而将实现和支持的成本降至最低同时牢记它们的更改可能性。 我希望这个示例能够比以前关于Drools的文章更好地说明用Java实现所有业务规则的难度。 如果您在决策表与Spring和Camel集成方面对Drools有任何经验请随时发表评论-让我们进行讨论。 所有代码都可以从Bitbucket和GitHub的 Too Much Coding存储库中获得。 参考来自Blog上的 JCG合作伙伴 Marcin Grzejszczak的Camel和Spring的Drools决策表 用于编码成瘾者博客。 翻译自: https://www.javacodegeeks.com/2013/04/drools-decision-tables-with-camel-and-spring.htmldrools 决策表