Search in sources :

Example 1 with Exchange

use of org.drools.model.impl.Exchange in project drools by kiegroup.

the class SendReceiveTest method testAsync.

@Test
public void testAsync() {
    Global<List> messages = globalOf(List.class, "defaultpkg", "messages");
    Variable<Integer> length = declarationOf(Integer.class);
    Exchange<String> exchange = exchangeOf(String.class);
    Rule send = rule("send").build(send(exchange).message(() -> {
        try {
            Thread.sleep(1_000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "Hello World!";
    }));
    Rule receive = rule("receive").build(pattern(length), receive(exchange).expr(length, (s, l) -> s.length() > l), on(exchange, length, messages).execute((s, l, m) -> m.add("received message '" + s + "' longer than " + l)));
    Model model = new ModelImpl().addRule(send).addRule(receive).addGlobal(messages);
    KieBase kieBase = KieBaseBuilder.createKieBaseFromModel(model);
    KieSession ksession = kieBase.newKieSession();
    List<String> list = new ArrayList<>();
    ksession.setGlobal("messages", list);
    assertEquals(1, AsyncMessagesCoordinator.get().getListeners().size());
    ksession.insert(10);
    new Thread(() -> ksession.fireUntilHalt()).start();
    try {
        Thread.sleep(2_000L);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    ksession.halt();
    ksession.dispose();
    assertEquals(1, list.size());
    assertEquals("received message 'Hello World!' longer than 10", list.get(0));
    assertEquals(0, AsyncMessagesCoordinator.get().getListeners().size());
}
Also used : PatternDSL.receive(org.drools.model.PatternDSL.receive) PatternDSL.rule(org.drools.model.PatternDSL.rule) Variable(org.drools.model.Variable) DSL.exchangeOf(org.drools.model.DSL.exchangeOf) DSL.globalOf(org.drools.model.DSL.globalOf) Global(org.drools.model.Global) Test(org.junit.Test) DSL.on(org.drools.model.DSL.on) Exchange(org.drools.model.impl.Exchange) PatternDSL.pattern(org.drools.model.PatternDSL.pattern) ArrayList(java.util.ArrayList) KieBaseBuilder(org.drools.modelcompiler.builder.KieBaseBuilder) List(java.util.List) AsyncMessagesCoordinator(org.drools.core.reteoo.AsyncMessagesCoordinator) Rule(org.drools.model.Rule) KieBase(org.kie.api.KieBase) KieSession(org.kie.api.runtime.KieSession) DSL.declarationOf(org.drools.model.DSL.declarationOf) PatternDSL.send(org.drools.model.PatternDSL.send) Model(org.drools.model.Model) Assert.assertEquals(org.junit.Assert.assertEquals) ModelImpl(org.drools.model.impl.ModelImpl) ArrayList(java.util.ArrayList) KieBase(org.kie.api.KieBase) Model(org.drools.model.Model) ArrayList(java.util.ArrayList) List(java.util.List) KieSession(org.kie.api.runtime.KieSession) Rule(org.drools.model.Rule) ModelImpl(org.drools.model.impl.ModelImpl) Test(org.junit.Test)

Example 2 with Exchange

use of org.drools.model.impl.Exchange in project drools by kiegroup.

the class SendReceiveTest method testAsyncWith2KBase.

@Test
public void testAsyncWith2KBase() {
    Exchange<String> exchange = exchangeOf(String.class);
    Rule send = rule("send").build(send(exchange).message(() -> {
        try {
            Thread.sleep(1_000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return "Hello World!";
    }));
    Variable<Integer> length = declarationOf(Integer.class);
    Global<List> messages = globalOf(List.class, "defaultpkg", "messages");
    Rule receive = rule("receive").build(pattern(length), receive(exchange).expr(length, (s, l) -> s.length() > l), on(exchange, length, messages).execute((s, l, m) -> m.add("received message '" + s + "' longer than " + l)));
    Model model1 = new ModelImpl().addRule(send);
    KieBase kieBase1 = KieBaseBuilder.createKieBaseFromModel(model1);
    KieSession ksession1 = kieBase1.newKieSession();
    Model model2 = new ModelImpl().addRule(receive).addGlobal(messages);
    KieBase kieBase2 = KieBaseBuilder.createKieBaseFromModel(model2);
    KieSession ksession2 = kieBase2.newKieSession();
    List<String> list = new ArrayList<>();
    ksession2.setGlobal("messages", list);
    ksession2.insert(10);
    new Thread(() -> ksession2.fireUntilHalt()).start();
    new Thread(() -> ksession1.fireUntilHalt()).start();
    try {
        Thread.sleep(2_000L);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    ksession1.halt();
    ksession1.dispose();
    ksession2.halt();
    ksession2.dispose();
    assertEquals(1, list.size());
    assertEquals("received message 'Hello World!' longer than 10", list.get(0));
}
Also used : PatternDSL.receive(org.drools.model.PatternDSL.receive) PatternDSL.rule(org.drools.model.PatternDSL.rule) Variable(org.drools.model.Variable) DSL.exchangeOf(org.drools.model.DSL.exchangeOf) DSL.globalOf(org.drools.model.DSL.globalOf) Global(org.drools.model.Global) Test(org.junit.Test) DSL.on(org.drools.model.DSL.on) Exchange(org.drools.model.impl.Exchange) PatternDSL.pattern(org.drools.model.PatternDSL.pattern) ArrayList(java.util.ArrayList) KieBaseBuilder(org.drools.modelcompiler.builder.KieBaseBuilder) List(java.util.List) AsyncMessagesCoordinator(org.drools.core.reteoo.AsyncMessagesCoordinator) Rule(org.drools.model.Rule) KieBase(org.kie.api.KieBase) KieSession(org.kie.api.runtime.KieSession) DSL.declarationOf(org.drools.model.DSL.declarationOf) PatternDSL.send(org.drools.model.PatternDSL.send) Model(org.drools.model.Model) Assert.assertEquals(org.junit.Assert.assertEquals) ModelImpl(org.drools.model.impl.ModelImpl) ArrayList(java.util.ArrayList) KieBase(org.kie.api.KieBase) Model(org.drools.model.Model) ArrayList(java.util.ArrayList) List(java.util.List) KieSession(org.kie.api.runtime.KieSession) Rule(org.drools.model.Rule) ModelImpl(org.drools.model.impl.ModelImpl) Test(org.junit.Test)

Example 3 with Exchange

use of org.drools.model.impl.Exchange in project drools by kiegroup.

the class KiePackagesBuilder method addPatternForVariable.

private Pattern addPatternForVariable(RuleContext ctx, GroupElement group, Variable patternVariable, Condition.Type type) {
    Pattern pattern = null;
    // If the variable is already bound to the result of previous accumulate result pattern, then find it.
    if (patternVariable instanceof org.drools.model.Declaration) {
        org.drools.model.Declaration decl = (org.drools.model.Declaration) patternVariable;
        if (decl.getSource() == null) {
            Accumulate accSource = ctx.getAccumulateSource(patternVariable);
            if (accSource != null) {
                for (RuleConditionElement element : group.getChildren()) {
                    if (element instanceof Pattern && ((Pattern) element).getSource() == accSource) {
                        pattern = (Pattern) element;
                        break;
                    }
                }
            }
        }
    }
    PatternSource priorSource = null;
    if (pattern != null && type == Condition.Type.ACCUMULATE) {
        // so it would be potentially tricky if this was a multi var, with multiple bindings.
        if (pattern.getSource() instanceof SingleAccumulate) {
            group.getChildren().remove(pattern);
            priorSource = pattern.getSource();
            pattern = null;
        }
    }
    if (pattern == null) {
        pattern = new Pattern(ctx.getNextPatternIndex(), // tupleIndex will be set by ReteooBuilder
        0, // tupleIndex will be set by ReteooBuilder
        0, getObjectType(patternVariable), patternVariable.getName(), true);
        pattern.setSource(priorSource);
    }
    if (patternVariable instanceof org.drools.model.Declaration) {
        org.drools.model.Declaration decl = (org.drools.model.Declaration) patternVariable;
        if (decl.getSource() != null) {
            if (decl.getSource() instanceof EntryPoint) {
                pattern.setSource(new EntryPointId(((EntryPoint) decl.getSource()).getName()));
            } else if (decl.getSource() instanceof WindowReference) {
                WindowReference<?> window = (WindowReference) decl.getSource();
                if (!ctx.getPkg().getWindowDeclarations().containsKey(window.getName())) {
                    createWindowReference(ctx, window);
                }
                pattern.setSource(new org.drools.core.rule.WindowReference(window.getName()));
            } else if (decl.getSource() instanceof From) {
                pattern.setSource(buildFrom(ctx, pattern, (From) decl.getSource()));
            } else if (decl.getSource() instanceof UnitData) {
                UnitData unitData = (UnitData) decl.getSource();
                pattern.setSource(new EntryPointId(ctx.getRule().getRuleUnitClassName() + "." + unitData.getName()));
            } else {
                throw new UnsupportedOperationException("Unknown source: " + decl.getSource());
            }
        }
        if (decl.getWindow() != null) {
            pattern.addBehavior(createWindow(decl.getWindow()));
            ctx.setNeedStreamMode();
        }
    } else if (patternVariable instanceof Exchange) {
        if (type == Condition.Type.SENDER) {
            Function0 supplier = ((Exchange) patternVariable).getMessageSupplier();
            DataProvider provider = new LambdaDataProvider(x -> supplier.apply(), false);
            pattern.setSource(new AsyncSend(pattern, patternVariable.getName(), provider));
        } else if (type == Condition.Type.RECEIVER) {
            pattern.setSource(new AsyncReceive(pattern, patternVariable.getName()));
        } else {
            throw new UnsupportedOperationException();
        }
    }
    ctx.registerPattern(patternVariable, pattern);
    return pattern;
}
Also used : GroupByPatternImpl(org.drools.model.patterns.GroupByPatternImpl) Arrays(java.util.Arrays) AsyncReceive(org.drools.core.rule.AsyncReceive) FunctionUtils.toFunctionN(org.drools.model.functions.FunctionUtils.toFunctionN) Binding(org.drools.model.Binding) CoreComponentFactory(org.drools.core.reteoo.CoreComponentFactory) SingleConstraint(org.drools.model.SingleConstraint) QueryCallPattern(org.drools.model.patterns.QueryCallPattern) PatternImpl(org.drools.model.patterns.PatternImpl) PatternSource(org.drools.core.rule.PatternSource) Map(java.util.Map) Declaration(org.drools.core.rule.Declaration) NamesGenerator.generateName(org.drools.model.impl.NamesGenerator.generateName) LambdaGroupByAccumulate(org.drools.modelcompiler.constraints.LambdaGroupByAccumulate) QueryNameConstraint(org.drools.core.rule.constraint.QueryNameConstraint) ConditionalElement(org.drools.core.rule.ConditionalElement) QueryImpl(org.drools.core.rule.QueryImpl) LambdaConstraint(org.drools.modelcompiler.constraints.LambdaConstraint) Direct(org.kie.api.definition.rule.Direct) EvaluationUtil.adaptBitMask(org.drools.modelcompiler.util.EvaluationUtil.adaptBitMask) TimerUtil.buildTimerExpression(org.drools.modelcompiler.util.TimerUtil.buildTimerExpression) CompositePatterns(org.drools.model.patterns.CompositePatterns) Set(java.util.Set) Predicate1(org.drools.model.functions.Predicate1) Exchange(org.drools.model.impl.Exchange) Query(org.drools.model.Query) Stream(java.util.stream.Stream) RuleImpl(org.drools.core.definitions.rule.impl.RuleImpl) FactTemplateObjectType(org.drools.core.facttemplates.FactTemplateObjectType) LambdaAccumulator(org.drools.modelcompiler.constraints.LambdaAccumulator) CountAccumulateFunction(org.drools.core.base.accumulators.CountAccumulateFunction) AccumulatePattern(org.drools.model.AccumulatePattern) DomainClassMetadata(org.drools.model.DomainClassMetadata) LambdaDataProvider(org.drools.modelcompiler.constraints.LambdaDataProvider) SelfPatternBiding(org.drools.model.view.SelfPatternBiding) Enabled(org.drools.core.spi.Enabled) ObjectType(org.drools.core.spi.ObjectType) EntryPointId(org.drools.core.rule.EntryPointId) All(org.kie.api.definition.rule.All) TypeMetaData(org.drools.model.TypeMetaData) ArrayList(java.util.ArrayList) UnificationConstraint(org.drools.modelcompiler.constraints.UnificationConstraint) BitMaskUtil.calculatePatternMask(org.drools.model.bitmask.BitMaskUtil.calculatePatternMask) RuleUnitUtil(org.kie.internal.ruleunit.RuleUnitUtil) LinkedHashSet(java.util.LinkedHashSet) EntryPoint(org.drools.model.EntryPoint) QueryElement(org.drools.core.rule.QueryElement) RuleConditionElement(org.drools.core.rule.RuleConditionElement) WindowDeclaration(org.drools.core.rule.WindowDeclaration) SelfReferenceClassFieldReader(org.drools.core.base.extractors.SelfReferenceClassFieldReader) LambdaConsequence(org.drools.modelcompiler.consequence.LambdaConsequence) PatternExtractor(org.drools.core.spi.PatternExtractor) NamedConsequenceImpl(org.drools.model.consequences.NamedConsequenceImpl) TemporalConstraintEvaluator(org.drools.modelcompiler.constraints.TemporalConstraintEvaluator) Rule(org.drools.model.Rule) DataProvider(org.drools.core.spi.DataProvider) PropertySpecificOption(org.kie.internal.builder.conf.PropertySpecificOption) BindingEvaluator(org.drools.modelcompiler.constraints.BindingEvaluator) EvalCondition(org.drools.core.rule.EvalCondition) TypeDeclarationUtil.createTypeDeclaration(org.drools.modelcompiler.util.TypeDeclarationUtil.createTypeDeclaration) EnabledBoolean(org.drools.core.base.EnabledBoolean) TypeDeclaration(org.drools.core.rule.TypeDeclaration) Accumulator(org.drools.core.spi.Accumulator) PrototypeVariable(org.drools.model.PrototypeVariable) Consequence(org.drools.model.Consequence) Global(org.drools.model.Global) WindowReference(org.drools.model.WindowReference) DroolsQuery(org.drools.core.base.DroolsQuery) UnitData(org.drools.model.UnitData) DynamicValueSupplier(org.drools.model.DynamicValueSupplier) ExistentialPatternImpl(org.drools.model.patterns.ExistentialPatternImpl) NamedConsequence(org.drools.core.rule.NamedConsequence) AbstractConstraint(org.drools.modelcompiler.constraints.AbstractConstraint) InternalKnowledgePackage(org.drools.core.definitions.InternalKnowledgePackage) Value(org.drools.model.Value) FactFactory.prototypeToFactTemplate(org.drools.modelcompiler.facttemplate.FactFactory.prototypeToFactTemplate) Condition(org.drools.model.Condition) Constraint(org.drools.model.Constraint) Collection(java.util.Collection) Forall(org.drools.core.rule.Forall) SlidingTimeWindow(org.drools.core.rule.SlidingTimeWindow) Index(org.drools.model.Index) LambdaEvalExpression(org.drools.modelcompiler.constraints.LambdaEvalExpression) Collectors(java.util.stream.Collectors) RuleBuilder.buildTimer(org.drools.compiler.rule.builder.RuleBuilder.buildTimer) List(java.util.List) SingleConstraint1(org.drools.model.constraints.SingleConstraint1) Entry(java.util.Map.Entry) Optional(java.util.Optional) BindingInnerObjectEvaluator(org.drools.modelcompiler.constraints.BindingInnerObjectEvaluator) SlidingLengthWindow(org.drools.core.rule.SlidingLengthWindow) Role(org.kie.api.definition.type.Role) ConstraintEvaluator(org.drools.modelcompiler.constraints.ConstraintEvaluator) OR(org.drools.core.rule.GroupElement.OR) LambdaSalience(org.drools.modelcompiler.attributes.LambdaSalience) CombinedConstraint(org.drools.modelcompiler.constraints.CombinedConstraint) KieBaseConfiguration(org.kie.api.KieBaseConfiguration) ClassObjectType(org.drools.core.base.ClassObjectType) Prototype(org.drools.model.Prototype) ClassFieldAccessorCache(org.drools.core.base.ClassFieldAccessorCache) Pattern(org.drools.core.rule.Pattern) InternalReadAccessor(org.drools.core.spi.InternalReadAccessor) HashMap(java.util.HashMap) AsyncSend(org.drools.core.rule.AsyncSend) Behavior(org.drools.core.rule.Behavior) AbstractSingleConstraint(org.drools.model.constraints.AbstractSingleConstraint) AND(org.drools.core.rule.GroupElement.AND) GroupByPattern(org.drools.model.GroupByPattern) View(org.drools.model.View) Function0(org.drools.model.functions.Function0) EvalImpl(org.drools.model.patterns.EvalImpl) LambdaReadAccessor(org.drools.modelcompiler.constraints.LambdaReadAccessor) Function1(org.drools.model.functions.Function1) KnowledgeBuilderConfigurationImpl(org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl) WindowDefinition(org.drools.model.WindowDefinition) RuleBaseConfiguration(org.drools.core.RuleBaseConfiguration) From0(org.drools.model.From0) From1(org.drools.model.From1) EvalExpression(org.drools.core.spi.EvalExpression) KnowledgePackageImpl(org.drools.core.definitions.impl.KnowledgePackageImpl) From(org.drools.model.From) From4(org.drools.model.From4) From2(org.drools.model.From2) Model(org.drools.model.Model) From3(org.drools.model.From3) MultiAccumulate(org.drools.core.rule.MultiAccumulate) Salience(org.drools.core.spi.Salience) Variable(org.drools.model.Variable) ArrayElementReader(org.drools.core.base.extractors.ArrayElementReader) KnowledgeBuilderConfiguration(org.kie.internal.builder.KnowledgeBuilderConfiguration) Propagation(org.kie.api.definition.rule.Propagation) Consumer(java.util.function.Consumer) DSL.entryPoint(org.drools.model.DSL.entryPoint) QueryArgument(org.drools.core.rule.QueryArgument) Collectors.toList(java.util.stream.Collectors.toList) SingleAccumulate(org.drools.core.rule.SingleAccumulate) SalienceInteger(org.drools.core.base.SalienceInteger) Accumulate(org.drools.core.rule.Accumulate) ConditionalNamedConsequenceImpl(org.drools.model.consequences.ConditionalNamedConsequenceImpl) Collections(java.util.Collections) DSL.declarationOf(org.drools.model.DSL.declarationOf) ConditionalBranch(org.drools.core.rule.ConditionalBranch) AccumulateFunction(org.drools.model.functions.accumulate.AccumulateFunction) LambdaEnabled(org.drools.modelcompiler.attributes.LambdaEnabled) GroupElement(org.drools.core.rule.GroupElement) Argument(org.drools.model.Argument) DeclarationImpl(org.drools.model.impl.DeclarationImpl) QueryCallPattern(org.drools.model.patterns.QueryCallPattern) AccumulatePattern(org.drools.model.AccumulatePattern) Pattern(org.drools.core.rule.Pattern) GroupByPattern(org.drools.model.GroupByPattern) AsyncReceive(org.drools.core.rule.AsyncReceive) EntryPoint(org.drools.model.EntryPoint) Function0(org.drools.model.functions.Function0) RuleConditionElement(org.drools.core.rule.RuleConditionElement) From(org.drools.model.From) AsyncSend(org.drools.core.rule.AsyncSend) SingleAccumulate(org.drools.core.rule.SingleAccumulate) LambdaGroupByAccumulate(org.drools.modelcompiler.constraints.LambdaGroupByAccumulate) MultiAccumulate(org.drools.core.rule.MultiAccumulate) SingleAccumulate(org.drools.core.rule.SingleAccumulate) Accumulate(org.drools.core.rule.Accumulate) WindowReference(org.drools.model.WindowReference) UnitData(org.drools.model.UnitData) Exchange(org.drools.model.impl.Exchange) LambdaDataProvider(org.drools.modelcompiler.constraints.LambdaDataProvider) DataProvider(org.drools.core.spi.DataProvider) EntryPointId(org.drools.core.rule.EntryPointId) LambdaDataProvider(org.drools.modelcompiler.constraints.LambdaDataProvider) PatternSource(org.drools.core.rule.PatternSource) Declaration(org.drools.core.rule.Declaration) WindowDeclaration(org.drools.core.rule.WindowDeclaration) TypeDeclarationUtil.createTypeDeclaration(org.drools.modelcompiler.util.TypeDeclarationUtil.createTypeDeclaration) TypeDeclaration(org.drools.core.rule.TypeDeclaration)

Aggregations

ArrayList (java.util.ArrayList)3 List (java.util.List)3 AsyncMessagesCoordinator (org.drools.core.reteoo.AsyncMessagesCoordinator)2 DSL.declarationOf (org.drools.model.DSL.declarationOf)2 DSL.exchangeOf (org.drools.model.DSL.exchangeOf)2 DSL.globalOf (org.drools.model.DSL.globalOf)2 DSL.on (org.drools.model.DSL.on)2 Global (org.drools.model.Global)2 Model (org.drools.model.Model)2 PatternDSL.pattern (org.drools.model.PatternDSL.pattern)2 PatternDSL.receive (org.drools.model.PatternDSL.receive)2 PatternDSL.rule (org.drools.model.PatternDSL.rule)2 PatternDSL.send (org.drools.model.PatternDSL.send)2 Rule (org.drools.model.Rule)2 Variable (org.drools.model.Variable)2 Exchange (org.drools.model.impl.Exchange)2 ModelImpl (org.drools.model.impl.ModelImpl)2 KieBaseBuilder (org.drools.modelcompiler.builder.KieBaseBuilder)2 Assert.assertEquals (org.junit.Assert.assertEquals)2 Test (org.junit.Test)2