[JBoss JIRA] Created: (JBRULES-2258) count in sliding time
by Francesco Chiarelli (JIRA)
count in sliding time
---------------------
Key: JBRULES-2258
URL: https://jira.jboss.org/jira/browse/JBRULES-2258
Project: Drools
Issue Type: CTS Challenge
Security Level: Public (Everyone can see)
Components: drools-core (fusion)
Affects Versions: 5.0.1.FINAL
Environment: Mac os 10.5, Eclipse Galileo, Jboss 5,
Reporter: Francesco Chiarelli
Assignee: Mark Proctor
I'm trying to use a sliding time fro count a facts with a condition.
I'have set a stream mode.
In test, with pseudo clock active, set this to current Time (it's
correct?), declare a fact type in drl with
declare MyFact (i've a javabean)
@role(event)
@timestamp(myTimestamp)
end
attribute type of myTimestamp must be long or Date? I've tried with both
but nothing, engine count all fact
ex: n fact in x days ago from now, the statement over window:time(1s)
result always n fact. why?
in when:
// $o : Order(<condition>)
$nRic : Number(intValue<maxRic) from accumulate($n: Order(this==$o)
over window:time(1s),count($n))
ps. if i set a real clock altough a pseudo, in runTime i've a ClassCastExc. to JdkTimerService
There is a test suite about count?
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2254) Webdav plugin creates hidden file with colon (":") in filename when copying resources from Guvnor - Causes issues on Windows
by Tihomir Surdilovic (JIRA)
Webdav plugin creates hidden file with colon (":") in filename when copying resources from Guvnor - Causes issues on Windows
----------------------------------------------------------------------------------------------------------------------------
Key: JBRULES-2254
URL: https://jira.jboss.org/jira/browse/JBRULES-2254
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: drools-eclipse
Affects Versions: 5.0.1.FINAL
Reporter: Tihomir Surdilovic
Assignee: Mark Proctor
***
When trying to create rule flow in Jboss Developer Studio
1.) Dragging a file from the Guvnor Repositories view to the Eclipse Navigator
view (i.e. to create a local copy linked to the Guvnor) throws an error
indication that a directory could not be created. This directory name has colons in it (i.e. :), which will never be allowed under Windows XP.
Here is the error:
Could not create directory C:Documents and Settings539578My Documentsworkspace.metadata.pluginsorg.guvnor.tools-2edc6539:1232df2fb51:-7ff6
Could not create directory C:Documents and Settings539578My Documentsworkspace.metadata.pluginsorg.guvnor.tools-2edc6539:1232df2fb51:-7ff6
2.) Trying to use the "Resources from Guvnor" wizard also produces an error, and the wizard does not let you browse the Guvnor repository to choose resources to copy over to eclipse.
Error Reason:
3 entries found for http://localhost:8080/jboss-brms/org.drools.guvnor.Guvnor/webdav
***
The hidden file created by Guvnor plugin uses Webdav to create a hidden file which includes colons in filename which is not allowed by Windows XP.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2319) When using from (CE) the objects loaded are not available to RHS if the objects are events
by Richard Ambridge (JIRA)
When using from (CE) the objects loaded are not available to RHS if the objects are events
------------------------------------------------------------------------------------------
Key: JBRULES-2319
URL: https://jira.jboss.org/jira/browse/JBRULES-2319
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: drools-core
Affects Versions: 5.0.1.FINAL
Environment: Ubuntu, Eclipse
Reporter: Richard Ambridge
Assignee: Mark Proctor
If I create the sample project from Eclipse, and modify DroolsTest to contain:
ArrayList<Message> a=new ArrayList<Message>();
Message a1=new Message(); a1.setId(1); a1.setMessage("mesC:7"); a1.setStatus(Message.HELLO); a.add(a1);
Message a2=new Message(); a2.setId(2);a2.setMessage("mesC:8"); a2.setStatus(Message.HELLO);a.add(a2);
ksession.setGlobal("data", a);
And set the environment as STREAM,
conf.setOption( EventProcessingOption.STREAM );
and then have a rule:
package com.sample
import com.sample.DroolsTest.Message;
global java.util.ArrayList data;
declare Message
@role( event )
end
rule "Hello World"
when
a : Message(id==4)
m : Message(id!=a.id, message==a.message) from data
then
System.out.println( "a is:"+a+" m is:"+m );
end
The result is:
a is:Message:[4] msg:mesC:7 m is:null
Notice, m is NULL
if you change this to fact based, m will contain the correct value.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2381) NPE during usage after serialize/deserialize
by Justin Waugh (JIRA)
NPE during usage after serialize/deserialize
--------------------------------------------
Key: JBRULES-2381
URL: https://jira.jboss.org/jira/browse/JBRULES-2381
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: drools-core
Affects Versions: 5.0.1.FINAL
Environment: Windows XP / Server 2003, JDK 1.6
Reporter: Justin Waugh
Assignee: Mark Proctor
Attachments: test.zip
In our application we are often removing and adding new rules. We also have a requirement to serialize state so that we can continue across restarts. We've seen a few problems related to the state of the knowledgebase after serializing/deserializing related to removing rules. Both are NPE's, and from debugging into Drools, both seem to be a case of a deserialized transient value not being wired up correctly. In one case the reader field of ClassFieldReader is not wired, so the InternalReadAccessor is null, and in the other the expression field of EvalCondition is left null. I have not been able to reproduce in a simple test case the first problem, though it is easily reproduceable in our live system, but I was able to reproduce the second, and I've attached a test case to demonstrate it. Both only happen with the combination of removing rules and serialization/deserialization. If the rules are never removed, the problems do not exhibit themselves. Here are the 2 stack traces:
java.lang.NullPointerException
at org.drools.base.ClassFieldReader.getValueType(ClassFieldReader.java:96)
at org.drools.reteoo.CompositeObjectSinkAdapter.addObjectSink(CompositeObjectSinkAdapter.java:98)
at org.drools.reteoo.ObjectSource.addObjectSink(ObjectSource.java:143)
at org.drools.reteoo.AlphaNode.attach(AlphaNode.java:116)
at org.drools.reteoo.AlphaNode.attach(AlphaNode.java:120)
at org.drools.reteoo.builder.BuildUtils.attachNode(BuildUtils.java:160)
at org.drools.reteoo.builder.PatternBuilder.attachAlphaNodes(PatternBuilder.java:295)
at org.drools.reteoo.builder.PatternBuilder.attachPattern(PatternBuilder.java:117)
at org.drools.reteoo.builder.PatternBuilder.build(PatternBuilder.java:70)
at org.drools.reteoo.builder.GroupElementBuilder$AndBuilder.build(GroupElementBuilder.java:126)
at org.drools.reteoo.builder.GroupElementBuilder.build(GroupElementBuilder.java:73)
at org.drools.reteoo.builder.ReteooRuleBuilder.addSubRule(ReteooRuleBuilder.java:153)
at org.drools.reteoo.builder.ReteooRuleBuilder.addRule(ReteooRuleBuilder.java:126)
at org.drools.reteoo.ReteooBuilder.addRule(ReteooBuilder.java:118)
at org.drools.reteoo.ReteooRuleBase.addRule(ReteooRuleBase.java:362)
at org.drools.common.AbstractRuleBase.addRule(AbstractRuleBase.java:618)
at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:662)
at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:290)
at org.drools.compiler.PackageBuilder.addKnowledgeResource(PackageBuilder.java:488)
at org.drools.builder.impl.KnowledgeBuilderImpl.add(KnowledgeBuilderImpl.java:25)
java.lang.NullPointerException
at org.drools.rule.EvalCondition.createContext(EvalCondition.java:110)
at org.drools.reteoo.EvalConditionNode.createMemory(EvalConditionNode.java:231)
at org.drools.common.ConcurrentNodeMemories.createNodeMemory(ConcurrentNodeMemories.java:96)
at org.drools.common.ConcurrentNodeMemories.getNodeMemory(ConcurrentNodeMemories.java:75)
at org.drools.common.AbstractWorkingMemory.getNodeMemory(AbstractWorkingMemory.java:1534)
at org.drools.reteoo.EvalConditionNode.doRemove(EvalConditionNode.java:263)
at org.drools.common.BaseNode.remove(BaseNode.java:95)
at org.drools.reteoo.RuleTerminalNode.doRemove(RuleTerminalNode.java:360)
at org.drools.common.BaseNode.remove(BaseNode.java:95)
at org.drools.reteoo.ReteooBuilder.removeRule(ReteooBuilder.java:248)
at org.drools.reteoo.ReteooRuleBase.removeRule(ReteooRuleBase.java:366)
at org.drools.common.AbstractRuleBase.removeRule(AbstractRuleBase.java:712)
at org.drools.common.AbstractRuleBase.removePackage(AbstractRuleBase.java:640)
at org.drools.impl.KnowledgeBaseImpl.removeKnowledgePackage(KnowledgeBaseImpl.java:166)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2358) ClassNotFoundException when using "mvel" as a dialect
by stephane Brossier (JIRA)
ClassNotFoundException when using "mvel" as a dialect
-----------------------------------------------------
Key: JBRULES-2358
URL: https://jira.jboss.org/jira/browse/JBRULES-2358
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Affects Versions: 5.0.1.FINAL
Environment: OS: Macos X and Linux
JVM 1.6.0_15 from sun
Reporter: stephane Brossier
Assignee: Mark Proctor
I get a ClassNotFoundexception when using a very simple rule and test. The test dowloads a binary package from guvnor, containing one trivial rule. Then it creates a StatefulKnowledgeSession and insert 500 facts. The drl file uploaded on guvnor is:
--------------------------
package mytest.debug.rules
declare PerUserCount
num : long
profile : String
end
rule "Event"
dialect "java"
when
e: PerUserCount()
then
System.out.println("Possible spammer [p=" + e.getProfile() + "] : count = " + e.getNum());
end
----------------------------
When calling fireAll, i get an exception. Note that:
1) The exception does not show up right away-- it only comes after some of those facts got processed
2) If i change the dialect from default 'mvel" to "java" it works fine:
Exception in thread "main" java.lang.NoClassDefFoundError: mytest/debug/rules/PerUserCount
at ASMAccessorImpl_7377369041259611028980.getValue(Unknown Source)
at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:66)
at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:99)
at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:102)
at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:102)
at org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:102)
at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:41)
at ASMAccessorImpl_7157329411259611028970.getValue(Unknown Source)
at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:66)
at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:99)
at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:107)
at org.mvel2.MVEL.executeExpression(MVEL.java:978)
at org.drools.base.mvel.MVELConsequence.evaluate(MVELConsequence.java:87)
at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:934)
at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:885)
at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1086)
at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:660)
at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:627)
at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:183)
at com.drools.debug.Test.runIteration(Test.java:132)
at com.drools.debug.Test.startTest(Test.java:73)
at com.drools.debug.Test.main(Test.java:196)
Caused by: java.lang.ClassNotFoundException: mytest.debug.rules.PerUserCount
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:319)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330)
at java.lang.ClassLoader.loadClass(ClassLoader.java:254)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:402)
... 23 more
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2423) "from" does not work correctly with events in STREAM mode
by Davide Sottara (JIRA)
"from" does not work correctly with events in STREAM mode
---------------------------------------------------------
Key: JBRULES-2423
URL: https://jira.jboss.org/jira/browse/JBRULES-2423
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: drools-core (fusion)
Affects Versions: 5.0.0.M1
Environment: Drools Fusion 5.0+ with engine in STREAM mode
Reporter: Davide Sottara
Assignee: Mark Proctor
Priority: Critical
In the simple test case below, Message is an instantaneous event (i.e. duration = 0) with a list of destinations.
--------------------------------------------------------------------------------------------------------------------------------------
declare Message
@role( event )
@timestamp(start)
@duration(duration)
end
rule "Hello World"
when
m : Message( status == Message.HELLO, $myMessage : message, $destinations : dest)
$s : String() from $destinations
then
System.out.println( "Dear " + $s + " : >>> " + $myMessage );
end
--------------------------------------------------------------------------------------------------------------------------------------
if the engine is configured to work in STREAM mode, the output is
Dear NULL :>>> Hello World
...
since the Strings extracted from the Collection "dest" have already been retracted by
the time the rule is fired, following the retraction of the Message event.
The problem does not show in CLOUD mode.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2402) Null Pointer exception while loading and executing two serialized rules which are in same package
by Nagarajan Santhanam (JIRA)
Null Pointer exception while loading and executing two serialized rules which are in same package
-------------------------------------------------------------------------------------------------
Key: JBRULES-2402
URL: https://jira.jboss.org/jira/browse/JBRULES-2402
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: drools-core (expert)
Affects Versions: 5.0.1.FINAL
Environment: OS : Ubuntu ( 2.6.28-13-server )
Sun Jdk 1.3
Reporter: Nagarajan Santhanam
Assignee: Mark Proctor
Priority: Critical
Hi,
I'm trying to load drts in a serialized fashion and executing it. During execution, I get the error as mentioned below.
But if I keep the package name different for both the drts, the same code works fine.
Find below the errors and code snippets :
Files Used :
1. Main.java
2. SchemeEngine.java
3. PurchaseOrder.java
4. PurchaseOrderImpl.java
5. SchemeHelper.java
6. ON_PO_PROD_PACK_PER_DISC.drt
7. ON_PO_PROD_DIS.drt
Main.java
*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package test;
import app.PurchaseOrder;
import app.PurchaseOrderImpl;
import java.util.ArrayList;
import java.util.List;
import scheme.SchemeEngine;
/**
*
* @author msuser1
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void testCrazyBug() throws Exception {
// String[] drts = new String[]{"/ON_PO_PROD_DIS.drt", "/ON_PO_PROD_PACK_PER_DISC.drt", "/ON_PO_PROD_PACK_PER_DISC_using_function.drt"};
// String[] xls = new String[]{"/ON_PO_PROD_DISC_1.xls", "/ON_PO_PROD_PACK_PER_DISC.xls", "/ON_PO_PROD_PACK_PER_DISC_using_function.xls"};
String[] drts = new String[]{"/ON_PO_PROD_DIS.drt", "/ON_PO_PROD_PACK_PER_DISC.drt"};
String[] xls = new String[]{"/ON_PO_PROD_DISC_1.xls", "/ON_PO_PROD_PACK_PER_DISC.xls"};
PurchaseOrder po = new PurchaseOrderImpl();
System.out.println("length of drt " + drts.length);
SchemeEngine engineDirect = new SchemeEngine(PurchaseOrderImpl.class.getClassLoader());
for (int i = 0; i < drts.length; i++) {
engineDirect.loadSchemeFromDRT(drts[i], xls[i]);
}
System.out.println("Applying Schemes in normal mode");
engineDirect.applyOnPurchaseOrder(po);
List serializedList = new ArrayList();
for (int i = 0; i < drts.length; i++) {
SchemeEngine engineLocal = new SchemeEngine(PurchaseOrderImpl.class.getClassLoader());
engineLocal.loadSchemeFromDRT(drts[i], xls[i]);
byte[] blobBytes = engineLocal.serializeDefinition();
serializedList.add(blobBytes);
}
SchemeEngine engineOptimized = new SchemeEngine(PurchaseOrderImpl.class.getClassLoader());
for (int i = 0; i < drts.length; i++) {
engineOptimized.loadSerializedDefinition((byte[]) serializedList.get(i));
}
try {
System.out.println("Applying Schemes in optmized mode");
engineOptimized.applyOnPurchaseOrder(po);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws Exception {
testCrazyBug();
}
}
SchemeEngine.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package scheme;
import app.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.DecisionTableConfiguration;
import org.drools.builder.DecisionTableInputType;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.common.DroolsObjectInputStream;
import org.drools.common.DroolsObjectOutputStream;
import org.drools.decisiontable.ExternalSpreadsheetCompiler;
import org.drools.decisiontable.InputType;
import org.drools.definition.KnowledgePackage;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatelessKnowledgeSession;
import org.drools.template.parser.DataListener;
import org.drools.template.parser.TemplateDataListener;
/**
*
* @author msuser1
*/
public class SchemeEngine {
private KnowledgeBase kbase = null;
private ClassLoader classLoader = null;
public SchemeEngine(ClassLoader cl) {
this.classLoader = cl;
KnowledgeBaseConfiguration kbc = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(new Properties(), this.classLoader);
kbase = KnowledgeBaseFactory.newKnowledgeBase(kbc);
}
public void loadSchemeFromDRL(String drlFileName) {
DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory.newDecisionTableConfiguration();
dtableconfiguration.setInputType(DecisionTableInputType.XLS);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource(drlFileName, SchemeEngine.class),
ResourceType.DRL);
if (kbuilder.hasErrors()) {
System.err.println(kbuilder.getErrors().toString());
}
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
}
public void loadSchemeFromXLS(String xlsFileName) {
DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory.newDecisionTableConfiguration();
dtableconfiguration.setInputType(DecisionTableInputType.XLS);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource(xlsFileName, SchemeEngine.class),
ResourceType.DTABLE, dtableconfiguration);
if (kbuilder.hasErrors()) {
System.err.println(kbuilder.getErrors().toString());
}
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
}
public void loadSchemeFromDRT(String drtFileName, String xlsFileName) throws Exception {
loadSchemeFromDRT(drtFileName, xlsFileName, 1, 1);
}
public void loadSchemeFromDRT(String drtFileName, String xlsFileName, int startingRow, int startingColumn) throws Exception {
InputStream drtInput = SchemeEngine.class.getResourceAsStream(drtFileName);
ByteArrayOutputStream drtOut = new ByteArrayOutputStream();
writeToStream(drtInput, drtOut);
InputStream xlsInput = SchemeEngine.class.getResourceAsStream(xlsFileName);
ByteArrayOutputStream xlsOut = new ByteArrayOutputStream();
writeToStream(xlsInput, xlsOut);
loadSchemeFromDRT(drtOut.toByteArray(), xlsOut.toByteArray(), startingRow, startingColumn);
}
private void writeToStream(InputStream in, OutputStream out) throws IOException {
byte[] buf = new byte[4 * 1024];
int numRead = 0;
while ((numRead = in.read(buf)) >= 0) {
out.write(buf, 0, numRead);
}
}
public void loadSchemeFromDRT(byte[] drtContent, byte[] xlsContent) {
loadSchemeFromDRT(drtContent, xlsContent, 1, 1);
}
public void loadSchemeFromDRT(byte[] drtContent, byte[] xlsContent, int startingRow, int startingColumn) {
final ExternalSpreadsheetCompiler converter = new ExternalSpreadsheetCompiler();
final List<DataListener> listeners = new ArrayList<DataListener>();
InputStream in = new ByteArrayInputStream(drtContent);
TemplateDataListener listener = new TemplateDataListener(3, 1, in);
listeners.add(listener);
converter.compile(new ByteArrayInputStream(xlsContent), InputType.XLS, listeners);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newByteArrayResource(listener.renderDRL().getBytes()),
ResourceType.DRL);
if (kbuilder.hasErrors()) {
System.err.println(kbuilder.getErrors().toString());
}
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
}
public byte[] serializeDefinition() {
DroolsObjectOutputStream dos = null;
ByteArrayOutputStream bos = null;
try {
bos = new ByteArrayOutputStream();
dos = new DroolsObjectOutputStream(bos);
dos.writeObject(kbase.getKnowledgePackages());
return bos.toByteArray();
} catch (IOException ex) {
Logger.getLogger(SchemeEngine.class.getName()).log(Level.SEVERE, null, ex);
return null;
} finally {
try {
dos.close();
bos.close();
} catch (IOException ex) {
Logger.getLogger(SchemeEngine.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void loadSerializedDefinition(byte[] serializedContent) {
try {
DroolsObjectInputStream dis = null;
ByteArrayInputStream bis = null;
bis = new ByteArrayInputStream(serializedContent);
dis = new DroolsObjectInputStream(bis);
Collection<KnowledgePackage> defn = (Collection<KnowledgePackage>)dis.readObject();
kbase.addKnowledgePackages(defn);
} catch (ClassNotFoundException ex) {
Logger.getLogger(SchemeEngine.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(SchemeEngine.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void applyOnPurchaseOrder(PurchaseOrder purchaseOrder) {
if (kbase.getKnowledgePackages().size() == 0) {
throw new RuntimeException("No Schemes are loaded.");
}
List objects = new ArrayList();
objects.add(purchaseOrder);
if (purchaseOrder.orderDetails() != null && purchaseOrder.orderDetails().size() > 0) {
Iterator iter = purchaseOrder.orderDetails().iterator();
while (iter.hasNext()) {
PurchaseOrderDetail detail = (PurchaseOrderDetail) iter.next();
objects.add(detail);
}
}
StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
session.execute(Arrays.asList(objects.toArray()));
}
public void applyRule(Object[] objects) {
if (kbase.getKnowledgePackages().size() == 0) {
throw new RuntimeException("No Schemes are loaded.");
}
StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
session.execute(Arrays.asList(objects));
}
public static void main(String[] args) {
}
}
PurchaseOrder.java
package app;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.util.Date;
import java.util.List;
/**
*
* @author msuser1
*/
public interface PurchaseOrder {
public Float orderAmount();
public Date orderDate();
public Integer orderDay();
public List orderDetails();
public boolean belongsToGeoHierarchy(String nodeName);
public void addFreeItem(String schemeId, String skuId, int qty);
public void addFlatDiscount(String SchemeId, Float discountAmt);
public void addPercentageDiscount(String SchemeId, Float discountPercent);
public void addFlatDiscountForItem(String SchemeId, String skuId, Float discountAmt);
public void addPercentageDiscountForItem(String SchemeId, String skuId, Float discountPercent);
public void addPercentageDiscountPerUomForItem(String SchemeId, String skuId, Float discountPercent);
public void addInternalGiftVoucher(String SchemeId, Float voucherAmt);
public void addExternalGiftVoucher(String SchemeId, Float voucherAmt, String externalVendorId);
public void addInternalGiftVoucherForItem(String SchemeId, String skuId, Float voucherAmt);
public void addExternalGiftVoucherForItem(String SchemeId, String skuId, Float voucherAmt, String externalVendorId);
public void addRewardPoint(String SchemeId, int rewardPoint);
public void addRewardPointForItem(String SchemeId, String skuId, int rewardPoint);
public void addWeightBasedFlatDiscountPerUomForItem(String SchemeId, String skuId, Float discount_amt, String uomId);
public Boolean immediatePayment();
public Boolean regularPurchase();
public Boolean consignmentPurchase();
public Boolean cat2ConsignmentPurchase();
public Boolean cat3ConsignmentPurchase();
public Boolean intransitPurchase();
public Boolean skuPresent(String skuId);
public Integer materialQuantityForItem(String skuId);
public Boolean schemeApplied(String schemeDefinitionId);
public void addDetail(PurchaseOrderDetail prd);
}
=========================================================================================================================
PurchaseOrderImpl.java
package app;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author msuser1
*/
public class PurchaseOrderImpl implements PurchaseOrder {
private List details = new ArrayList();
public Date orderDate() {
try {
DateFormat fmt = new SimpleDateFormat("yyyy-dd-MM");
Date dt = fmt.parse("2009-06-23");
return dt;
} catch (ParseException ex) {
Logger.getLogger(PurchaseOrderImpl.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
public Integer orderDay(){
return 10;
}
public List orderDetails() {
return details;
}
public boolean belongsToGeoHierarchy(String nodeName) {
return true;
}
public void addFreeItem(String schemeId, String skuId, int qty) {
System.out.println("Add Free Item");
}
public void addFlatDiscount(String SchemeId, Long discountAmt) {
System.out.println("Add Flat Discount");
}
public void addPercentageDiscount(String SchemeId, int discountPercent) {
System.out.println("Add Percentage Discount");
}
public void addFlatDiscountForItem(String SchemeId, String skuId, Long discountAmt) {
System.out.println("Add Flat Discount For Item");
}
public void addPercentageDiscountForItem(String SchemeId, String skuId, int discountPercent) {
System.out.println("Add Percentage Discount For Item");
}
public void addPercentageDiscountPerUomForItem(String SchemeId, String skuId, int discountPercent) {
System.out.println("Add Percentage Discount For Uom For Item");
}
public void addInternalGiftVoucher(String SchemeId, Long voucherAmt) {
System.out.println("Add Internal Gift Voucher");
}
public void addExternalGiftVoucher(String SchemeId, Long voucherAmt, String externalVendorId) {
System.out.println("Add External Gift Voucher");
}
public void addInternalGiftVoucherForItem(String SchemeId, String skuId, Long voucherAmt) {
System.out.println("Add Internal Gift Voucher For Item");
}
public void addExternalGiftVoucherForItem(String SchemeId, String skuId, Long voucherAmt, String externalVendorId) {
System.out.println("Add External Gift Voucher For Item");
}
public void addRewardPoint(String SchemeId, int rewardPoint) {
System.out.println("Add Reward Point");
}
public void addRewardPointForItem(String SchemeId, String skuId, int rewardPoint) {
System.out.println("Add Reward Point For Item");
}
public Boolean immediatePayment(){
return true;
}
public Boolean regularPurchase() {
return true;
}
public Boolean consignmentPurchase() {
return false;
}
public Boolean cat2ConsignmentPurchase() {
return false;
}
public Boolean cat3ConsignmentPurchase() {
return false;
}
public Boolean commissionPurchase() {
return false;
}
public Boolean intransitPurchase() {
return false;
}
public Boolean skuPresent(String skuId) {
return false;
}
public Integer materialQuantityForItem(String skuId) {
return 10;
}
public Boolean schemeApplied(String schemeDefinitionId) {
return false;
}
public void addWeightBasedFlatDiscountPerUomForItem(String SchemeId, String skuId, Long discount_amt, String uomId) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addDetail(PurchaseOrderDetail pod)
{
details.add(pod);
}
public void addFlatDiscount(String SchemeId, Float discountAmt) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addFlatDiscountForItem(String SchemeId, String skuId, Float discountAmt) {
throw new UnsupportedOperationException("Not supported yet.");
}
public Float orderAmount() {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addPercentageDiscount(String SchemeId, Float discountPercent) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addPercentageDiscountForItem(String SchemeId, String skuId, Float discountPercent) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addPercentageDiscountPerUomForItem(String SchemeId, String skuId, Float discountPercent) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addInternalGiftVoucher(String SchemeId, Float voucherAmt) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addExternalGiftVoucher(String SchemeId, Float voucherAmt, String externalVendorId) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addInternalGiftVoucherForItem(String SchemeId, String skuId, Float voucherAmt) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addExternalGiftVoucherForItem(String SchemeId, String skuId, Float voucherAmt, String externalVendorId) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void addWeightBasedFlatDiscountPerUomForItem(String SchemeId, String skuId, Float discount_amt, String uomId) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
SchemeHelper.java
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package helper;
import app.PurchaseOrder;
import app.PurchaseOrderDetail;
import java.lang.Float;
/**
*
* @author msuser1
*/
public class SchemeHelper {
public static boolean belongsToProductHierarchy(String skuId, String nodeName) {
return false; //Sku.belongsToProductHierarchy(nodeName);
}
public static Integer materialQuantityForItem(PurchaseOrder po, String skuId) {
return po.materialQuantityForItem(skuId);
}
public static boolean productIdOrProductAncestorMatching(PurchaseOrderDetail poDetail, String productId) {
System.out.println("Inside the method......................################################");
boolean result = false;
try {
result = poDetail.productId().compareTo(productId) == 0 || poDetail.belongsToAncestorProduct(productId).booleanValue();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static boolean complexMethod(PurchaseOrderDetail poDetail, String productId, String packId) {
boolean result = false;
try {
result = (poDetail.packId().compareTo(packId) == 0 || poDetail.belongsToAncestorPack(packId).booleanValue()) && (poDetail.productId().compareTo(productId) == 0 || poDetail.belongsToAncestorProduct(productId).booleanValue());
} catch (Exception ex) {
ex.printStackTrace();
}
return result;
}
}
ON_PO_PROD_DIS.drt
template header
SchemeID
ProductID
Discount
package app;
import function helper.SchemeHelper.*
template "Scheme"
rule "po_@{SchemeID}_(a){row.rowNumber}"
when
$order : PurchaseOrder()
$orderDetail : PurchaseOrderDetail($det : this,eval($det.productId().compareTo("@{ProductID}") == 0 || $det.belongsToAncestorProduct("@{ProductID}") == true), purchaseOrder == $order)
then
float disAmt=0;
disAmt = $orderDetail.saleableQty() * @{Discount}F;
System.out.println("Discount amount = @{Discount}..XXXX..........." + disAmt);
$order.addFlatDiscountForItem("@{SchemeID}",$orderDetail.skuId(), disAmt);
end
end template
ON_PO_PROD_PACK_PER_DISC.drt
template header
SchemeID
ProductID
PackID
Discount
package app;
import app.*;
import function helper.SchemeHelper.*
template "Scheme"
rule "ON_PO_PROD_PACK_PER_DISC_(a){row.rowNumber}"
when
$order: PurchaseOrder()
$orderDetail : PurchaseOrderDetail($det : this, eval(
($det.belongsToAncestorPack("@{PackID}") == true || $det.packId().compareTo("@{PackID}") == 0)
&&
($det.productId().compareTo("@{ProductID}") == 0 || $det.belongsToAncestorProduct("@{ProductID}") == true)
) , purchaseOrder == $order)
then
float disAmt=0;
disAmt = ($orderDetail.materialPrice() * $orderDetail.saleableQty()) * @{Discount}F/100;
System.out.println("Discount amount = XXXX..........." + disAmt);
$order.addFlatDiscountForItem("@{SchemeID}",$orderDetail.skuId(), disAmt);
end
end template
Error :
java.lang.NullPointerException
at org.drools.base.ClassFieldReader.getIndex(ClassFieldReader.java:78)
at org.drools.util.LeftTupleIndexHashTable.<init>(LeftTupleIndexHashTable.java:48)
at org.drools.util.LeftTupleIndexHashTable.<init>(LeftTupleIndexHashTable.java:35)
at org.drools.common.SingleBetaConstraints.createBetaMemory(SingleBetaConstraints.java:172)
at org.drools.reteoo.BetaNode.createMemory(BetaNode.java:340)
at org.drools.common.ConcurrentNodeMemories.createNodeMemory(ConcurrentNodeMemories.java:96)
at org.drools.common.ConcurrentNodeMemories.getNodeMemory(ConcurrentNodeMemories.java:75)
at org.drools.common.AbstractWorkingMemory.getNodeMemory(AbstractWorkingMemory.java:1534)
at org.drools.reteoo.JoinNode.assertLeftTuple(JoinNode.java:103)
at org.drools.reteoo.CompositeLeftTupleSinkAdapter.doPropagateAssertLeftTuple(CompositeLeftTupleSinkAdapter.java:145)
at org.drools.reteoo.CompositeLeftTupleSinkAdapter.createAndPropagateAssertLeftTuple(CompositeLeftTupleSinkAdapter.java:57)
at org.drools.reteoo.LeftInputAdapterNode.assertObject(LeftInputAdapterNode.java:142)
at org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:42)
at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:185)
at org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:146)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1046)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1001)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:788)
at org.drools.impl.StatelessKnowledgeSessionImpl.execute(StatelessKnowledgeSessionImpl.java:259)
at scheme.SchemeEngine.applyOnPurchaseOrder(SchemeEngine.java:178)
at test.Main.testCrazyBug(Main.java:55)
at test.Main.main(Main.java:64)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2432) TemplateDataListener.newCell filters out correctly blank values; this leads to incorrect template processing
by Denis Robert (JIRA)
TemplateDataListener.newCell filters out correctly blank values; this leads to incorrect template processing
------------------------------------------------------------------------------------------------------------
Key: JBRULES-2432
URL: https://jira.jboss.org/jira/browse/JBRULES-2432
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: drools-core (expert)
Affects Versions: 5.0.1.FINAL
Environment: Any
Reporter: Denis Robert
Assignee: Mark Proctor
When using a DataProviderCompiler(), a blank column returned by the DataProvider causes an entire line to not be outputted in the result. I tracked this to a line in TemplateDataListener.newCell which explicitly filters out blank cells, even though such cells should be allowed.
The template I'm using is:
<snip>
template header
ruleID
object
field
regexp
replacement
package standardization
import [removed].*
template std_rule
rule "@{ruleID}"
dialect "mvel"
when
$o: @{object}()
then
$o.@{field} = $o.?(a){field}.replaceFirst("@{regexp}", "@{replacement}");
end
end template
<snip>
Whenever "replacement" is blank, the consequent does not get generated.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2453) Marshalling issue with not rules
by Kris Verlaenen (JIRA)
Marshalling issue with not rules
--------------------------------
Key: JBRULES-2453
URL: https://jira.jboss.org/jira/browse/JBRULES-2453
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Components: drools-core (expert)
Affects Versions: 5.1.0.M1
Reporter: Kris Verlaenen
Assignee: Mark Proctor
Fix For: 5.1.0.M2
Issue with OutputMarshaller in specific case of Not rules:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at
java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1838)
at
java.io.ObjectOutputStream$BlockDataOutputStream.write(ObjectOutputStream.java:1769)
at java.io.DataOutputStream.writeInt(DataOutputStream.java:182)
at
java.io.ObjectOutputStream$BlockDataOutputStream.writeInt(ObjectOutputStream.java:1904)
at java.io.ObjectOutputStream.writeInt(ObjectOutputStream.java:769)
at
org.drools.marshalling.impl.OutputMarshaller.writeLeftTuple(OutputMarshaller.java:459)
at
org.drools.marshalling.impl.OutputMarshaller.writeInitialFactHandleLeftTuples(OutputMarshaller.java:356)
at
org.drools.marshalling.impl.OutputMarshaller.writeFactHandles(OutputMarshaller.java:251)
at
org.drools.marshalling.impl.OutputMarshaller.writeSession(OutputMarshaller.java:85)
at
org.drools.marshalling.impl.DefaultMarshaller.marshall(DefaultMarshaller.java:117)
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2463) Deadlock between ResourceChangeNotifierImpl.subscribeResourceChangeListener and ResourceChangeScannerImpl.subscribeNotifier
by Andreas Kohn (JIRA)
Deadlock between ResourceChangeNotifierImpl.subscribeResourceChangeListener and ResourceChangeScannerImpl.subscribeNotifier
---------------------------------------------------------------------------------------------------------------------------
Key: JBRULES-2463
URL: https://jira.jboss.org/jira/browse/JBRULES-2463
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Affects Versions: 5.0.1.FINAL
Reporter: Andreas Kohn
Assignee: Mark Proctor
This deadlock was found by our continouos integration system which is building drools using mvn.
Found one Java-level deadlock:
=============================
"Thread-42":
waiting to lock monitor 0x00002aaaf8f2e8d0 (object 0x00002aaab4645830, a java.util.HashMap),
which is held by "main"
"main":
waiting to lock monitor 0x00002aaaf4f3a028 (object 0x00002aaab46459b0, a java.util.HashMap),
which is held by "Thread-42"
Java stack information for the threads listed above:
===================================================
"Thread-42":
at org.drools.io.impl.ResourceChangeNotifierImpl.subscribeResourceChangeListener(ResourceChangeNotifierImpl.java:64)
- waiting to lock <0x00002aaab4645830> (a java.util.HashMap)
at org.drools.io.impl.ResourceChangeNotifierImpl.subscribeChildResource(ResourceChangeNotifierImpl.java:103)
at org.drools.io.impl.ResourceChangeScannerImpl.scan(ResourceChangeScannerImpl.java:128)
- locked <0x00002aaab46459b0> (a java.util.HashMap)
at org.drools.io.impl.ResourceChangeScannerImpl$ProcessChangeSet.run(ResourceChangeScannerImpl.java:276)
- locked <0x00002aaab46459b0> (a java.util.HashMap)
- locked <0x00002aaade2c97d8> (a org.drools.io.impl.ResourceChangeScannerImpl$ProcessChangeSet)
at java.lang.Thread.run(Thread.java:619)
"main":
at org.drools.io.impl.ResourceChangeScannerImpl.subscribeNotifier(ResourceChangeScannerImpl.java:64)
- waiting to lock <0x00002aaab46459b0> (a java.util.HashMap)
at org.drools.io.impl.ResourceChangeNotifierImpl.subscribeResourceChangeListener(ResourceChangeNotifierImpl.java:70)
- locked <0x00002aaab4645830> (a java.util.HashMap)
at org.drools.agent.impl.KnowledgeAgentImpl.processChangeSet(KnowledgeAgentImpl.java:150)
- locked <0x00002aaade2c9c18> (a java.util.HashMap)
at org.drools.agent.impl.KnowledgeAgentImpl.applyChangeSet(KnowledgeAgentImpl.java:117)
- locked <0x00002aaade2c9c18> (a java.util.HashMap)
at org.drools.agent.impl.KnowledgeAgentImpl.applyChangeSet(KnowledgeAgentImpl.java:109)
at org.drools.agent.KnowledgeAgentTest.testModifyDirectory(KnowledgeAgentTest.java:776)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)
Found 1 deadlock.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2457) Wrong evaluation of rules and PseudoClock NPE
by Vítor Moreira (JIRA)
Wrong evaluation of rules and PseudoClock NPE
---------------------------------------------
Key: JBRULES-2457
URL: https://jira.jboss.org/jira/browse/JBRULES-2457
Project: Drools
Issue Type: Bug
Security Level: Public (Everyone can see)
Affects Versions: 5.1.0.M1, 5.0.1.FINAL
Environment: Windows 7, Eclipse 3.4, Java 1.6.0_u18, JUnit 4
Reporter: Vítor Moreira
Assignee: Mark Proctor
I've got a DRL file, having the following rules:
- offline event for 3 minutes withou any online event meanwhile => send an offline notification
- online event after offline event (within 3 minute range) => send an online notification
I've also got an junit test:
- insert offline event
- pseudoclock advances 2m50s
- insert online event
- pseudoclock advances 15s
- check if there's any notification
And the result of the junit is:
1) NPE when clock advances 15s
java.lang.NullPointerException
at org.drools.util.LinkedList.remove(LinkedList.java:113)
at org.drools.common.Scheduler$DuractionJob.execute(Scheduler.java:71)
at org.drools.time.impl.PseudoClockScheduler$ScheduledJob.call(PseudoClockScheduler.java:219)
at org.drools.time.impl.PseudoClockScheduler.runCallBacks(PseudoClockScheduler.java:168)
at org.drools.time.impl.PseudoClockScheduler.advanceTime(PseudoClockScheduler.java:130)
2) When checking for a notification, it should have one online notification but has on offline notification
At the bottom of this issue, there are snippets of junit code and drools rule file.
Probably, the problem relies on Junit initialization code.
T.I.A.
-- DRL file (snippet) --
dialect "java"
declare Event
@role( event )
@expires ( 7d )
end
global ISnmpNotifier snmpNotifier;
/*************************/
/* OFFLINE FOR 3 MINUTES */
/*************************/
rule "bit\dom - events offline (device offline for 3 minutes)"
when
$offline : Event( freeField == "101", $offlineLane : lane ) from entry-point "incoming"
not ( $online : Event (freeField == "102", lane == $offlineLane, this after [0s,3m] $offline ) from entry-point "incoming" )
then
snmpNotifier.send( new Notification("101", "offline") );
end
rule "bit\dom - events online (device offline for 3 minutes)"
when
$offline: Event( freeField == "101", $lane : lane ) from entry-point "incoming"
$online : Event( freeField == "102", lane == $lane, this after [3m] $offline ) from entry-point "incoming"
then
snmpNotifier.send( new Notification("102", "online") );
end
-- DRL file (snippet) --
-- JUnit code (snippet) --
package pt.brisa.sam.agent.rules.bit_dom;
import java.util.concurrent.TimeUnit;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.conf.EventProcessingOption;
import org.drools.io.ResourceFactory;
import org.drools.runtime.KnowledgeSessionConfiguration;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.conf.ClockTypeOption;
import org.drools.runtime.rule.WorkingMemoryEntryPoint;
import org.drools.time.impl.PseudoClockScheduler;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class Jira_Drools {
// values used to create test
private String offlineEventCode = "101";
private String onlineEventCode = "102";
private String device = "device";
// drools specific vars
private WorkingMemoryEntryPoint workingMemoryEntryPoint;
private PseudoClockScheduler clock = null;
private StatefulKnowledgeSession kSession;
/**
* SnmpNotificationEventCase.getNumberOfNotificationsByExample(example)
* .getNumberOfNotificationsByExample => from the notification queue, returns the number of notifications matching the given example
*/
private SnmpNotificationEventCase snmpNotificationEventCase;
@Before
public void droolsSetup() {
KnowledgeBaseConfiguration baseConfig;
KnowledgeSessionConfiguration sessionConfig;
KnowledgeBase kBase;
KnowledgeBuilder kBuilder;
baseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
baseConfig.setOption( EventProcessingOption.STREAM ); // Use stream mode
kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kBuilder.add(ResourceFactory.newFileResource( "test.drl"), ResourceType.DRL);
kBase = KnowledgeBaseFactory.newKnowledgeBase(baseConfig);
kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());
sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
sessionConfig.setOption( ClockTypeOption.get( "pseudo" ) );
kSession = kBase.newStatefulKnowledgeSession( sessionConfig, null );
kSession.setGlobal( "snmpNotifier", snmpNotificationEventCase );
workingMemoryEntryPoint = kSession.getWorkingMemoryEntryPoint("incoming");
clock = (PseudoClockScheduler) kSession.getSessionClock();
snmpNotificationEventCase = new SnmpNotificationEventCase();
}
/* offline online 3min */
/* -----|-------------------|------/----^----- */
/* check */
@Test
public void deviceOffline_onlineBefore3minutes_checkAfter3minutes() {
/* alocates OFFLINE and ONLINE events, EXAMPLE */
Event offlineEvent = new Event();
Event onlineEvent = new Event();
Notification example = new Notification();
/* configures the events */
offlineEvent.setFreeField( offlineEventCode );
offlineEvent.setEventType( (byte)5 );
offlineEvent.setEventCode( "0001000" + offlineEventCode );
offlineEvent.setFormattedMessage( "JUnit string test" );
offlineEvent.setLane( "102" );
onlineEvent.setFreeField( onlineEventCode );
onlineEvent.setEventType( (byte)3 );
onlineEvent.setEventCode( "0001000" + onlineEventCode );
onlineEvent.setFormattedMessage( "JUnit string test" );
onlineEvent.setLane( "102" );
/* insert offline event */
workingMemoryEntryPoint.insert( offlineEvent );
kSession.fireAllRules();
/* intermediary check - offline notification */
example.setRuleCode( "31" );
example.setEventCode( offlineEventCode );
Assert.assertTrue(
"(device "+device+")(ruleCode 31): There are OFFLINE notifications, when it shouldn't have",
snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
/* advances the clock */
clock.advanceTime( 2, TimeUnit.MINUTES );
clock.advanceTime( 50, TimeUnit.SECONDS );
/* intermediary check - offline notification */
example.setRuleCode( "31" );
example.setEventCode( offlineEventCode );
Assert.assertTrue(
"(device "+device+")(ruleCode 31): There are OFFLINE notifications, when it shouldn't have",
snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
/* insert online event */
workingMemoryEntryPoint.insert( onlineEvent );
kSession.fireAllRules();
/* intermediary check - offline notification */
example.setRuleCode( "31" );
example.setEventCode( offlineEventCode );
Assert.assertTrue(
"(device "+device+")(ruleCode 31): There are OFFLINE notifications, when it shouldn't have",
snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
/* intermediary check - online notification */
example.setRuleCode( "31" );
example.setEventCode( onlineEventCode );
Assert.assertTrue(
"(device "+device+")(ruleCode 31): There are ONLINE notifications, when it shouldn't have",
snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
/* advances the clock */
clock.advanceTime( 15, TimeUnit.SECONDS );
/* since there's an ONLINE before the 3 minute's limit, there shouldn't be any trap regarding "last offline 3 minutes ago" */
example.setRuleCode( "31" );
example.setEventCode( offlineEventCode );
Assert.assertTrue(
"(device "+device+")(ruleCode 31): There are OFFLINE notifications, when it shouldn't have",
snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
example.setRuleCode( "31" );
example.setEventCode( onlineEventCode );
Assert.assertTrue(
"(device "+device+")(ruleCode 31): There are ONLINE notifications, when it shouldn't have",
snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 1 );
}
}
-- JUnit code (snippet) --
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JGRP-1052) Ergonomics
by Bela Ban (JIRA)
Ergonomics
----------
Key: JGRP-1052
URL: https://jira.jboss.org/jira/browse/JGRP-1052
Project: JGroups
Issue Type: Feature Request
Reporter: Bela Ban
Assignee: Bela Ban
Fix For: 3.0
The goal is to (a) reduce the number of properties needed and (b) determine the values dynamically.
Examples:
- Determine the best min/max size of a thread pool
- Find out what the best timeout values are for retransmission, e.g. based on average retransmission times
- Determine the optimal number of credits in FC
This is similar to the JVM setting where, starting with 1.5, the initial values can be set, but over time, the JVM dynamically changes them.
In the best case, a config contains only a list of protocols without any properties, and JGroups will figure out the correct values.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBRULES-2438) loading multiple sheets of single Excel book by one change-set xml
by Toshiya Kobayashi (JIRA)
loading multiple sheets of single Excel book by one change-set xml
------------------------------------------------------------------
Key: JBRULES-2438
URL: https://jira.jboss.org/jira/browse/JBRULES-2438
Project: Drools
Issue Type: Feature Request
Security Level: Public (Everyone can see)
Components: drools-core
Affects Versions: 5.0.1.FINAL
Reporter: Toshiya Kobayashi
Assignee: Mark Proctor
I'm trying to use rules via DecisionTable using change-set.
I wrote rules in multiple sheets of single Excel book.
Then I configured my change-set xml like:
...
<add>
<resource source='classpath:data/dtable.xls' type="DTABLE">
<decisiontable-conf input-type="XLS" worksheet-name="sheet1" />
</resource>
<resource source='classpath:data/dtable.xls' type="DTABLE">
<decisiontable-conf input-type="XLS" worksheet-name="sheet2" />
</resource>
</add>
...
But only rules of sheet1 were loaded.
As far as I observed source codes, KnowledgeAgentImpl.java puts resource into "Map<Resource, ResourceMapping> resources". But even if multiple resources are configured in change-set, it appears to me like those resources are considered as the same resource and eventually only one resource will be registered.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBMESSAGING-1490) BridgeService should be JAAS aware
by Nicholas Sayer (JIRA)
BridgeService should be JAAS aware
----------------------------------
Key: JBMESSAGING-1490
URL: https://jira.jboss.org/jira/browse/JBMESSAGING-1490
Project: JBoss Messaging
Issue Type: Feature Request
Affects Versions: 1.4.2.GA
Environment: n/a
Reporter: Nicholas Sayer
Assignee: Tim Fox
Priority: Optional
org.jboss.jms.server.bridge.BridgeService currently requires a username and password for the source and destination. It would be better if it could be configured with a JAAS login context name. This would allow username and password information to be set in, for example, a SecureIdentityLoginModule. For example:
<application-policy name = "JmsBridgeRealm">
<authentication>
<login-module code = "org.jboss.resource.security.SecureIdentityLoginModule" flag = "required">
<module-option name = "principal">${bridge.user}</module-option>
<module-option name = "userName">${bridge.user}</module-option>
<module-option name = "password">${bridge.encryptedPassword}</module-option>
<module-option name = "ignoreMissigingMCF">true</module-option>
<!-- it is a separate bug that you must set managedConnectionFactoryName to something regardless of setting ignoreMissingMCF to true -->
<module-option name = "managedConnectionFactoryName">jboss.nonexistent:service=NonExistent,name=NonExistent</module-option>
</login-module>
</authentication>
</application-policy>
There is undoubtedly a better way to accomplish this (probably to pass the JAAS context directly into the JMS connection factory used to vend connections for the bridge), but we're using this as a crude hack for now:
import java.util.Set;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;
import javax.security.auth.login.CredentialNotFoundException;
import javax.resource.spi.security.PasswordCredential;
import org.jboss.jms.server.bridge.BridgeService;
public class JAASAwareBridgeService extends BridgeService {
private String sourceContext, targetContext;
public void setSourceLoginContext(String ctxName) { this.sourceContext = ctxName; }
public String getSourceLoginContext() { return this.sourceContext; }
public void setTargetLoginContext(String ctxName) { this.targetContext = ctxName; }
public String getTargetLoginContext() { return this.targetContext; }
public void start() throws Exception {
setupSourceCredentials();
setupTargetCredentials();
super.start();
}
private void setupSourceCredentials() throws LoginException {
PasswordCredential pc = getPasswordCredential(this.sourceContext);
super.setSourceUsername(pc.getUserName());
super.setSourcePassword(new String(pc.getPassword()));
}
private void setupTargetCredentials() throws LoginException {
PasswordCredential pc = getPasswordCredential(this.targetContext);
super.setTargetUsername(pc.getUserName());
super.setTargetPassword(new String(pc.getPassword()));
}
private static PasswordCredential getPasswordCredential(String contextName) throws LoginException {
LoginContext ctx = new LoginContext(contextName);
ctx.login();
Subject s = ctx.getSubject();
Set<PasswordCredential> creds = s.getPrivateCredentials(PasswordCredential.class);
if (creds.isEmpty())
throw new CredentialNotFoundException("Login context '" + contextName + "' subject has no PasswordCredential");
return creds.iterator().next(); // get 1st
}
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBMESSAGING-1478) inconsistent test suite performance
by Aleksandar Kostadinov (JIRA)
inconsistent test suite performance
-----------------------------------
Key: JBMESSAGING-1478
URL: https://jira.jboss.org/jira/browse/JBMESSAGING-1478
Project: JBoss Messaging
Issue Type: Bug
Components: Tests and Performance
Affects Versions: 1.4.0.SP3.CP04
Reporter: Aleksandar Kostadinov
Assignee: Tim Fox
I see inconsistent performance running the JBM test suite. Here I have 2 builds on the same physical machine (windows), using local disk storage so environment should be pretty stable.
The mysql database is shared but I doubt it is the culprit.
I run the test suite with the following options:
property( name: "functional.tests.database", value: dbname )
property( name: "stress.tests.database", value: dbname )
property( name: "clustering.tests.database", value: dbname )
property( name: "test.target", value: "report" )
property( name: "test.bind.address", value: properties["env.MYTESTIP_1"] )
property( name: "jboss.messaging.groupname", value: properties["env.BUILD_TAG"])
property( name: "jboss.messaging.datachanneludpaddress", value: properties["env.MCAST_ADDR"] )
property( name: "jboss.messaging.controlchanneludpaddress", value: properties["env.MCAST_ADDR"] )
Are there any other options I can add to increase isolation from other processes in the same LAN?
Would you be able to look at these 2 builds and based on the logs, say why is the first one taking longer and eventually timeout?
http://hudson.qa.jboss.com/hudson/view/SOA-Release/job/soa-jbm/163/
http://hudson.qa.jboss.com/hudson/view/SOA-Release/job/soa-jbm/164/
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBMESSAGING-1631) Messages are piling up in the queues in clustered environment and not pulled by message sucker
by Victor Starenky (JIRA)
Messages are piling up in the queues in clustered environment and not pulled by message sucker
----------------------------------------------------------------------------------------------
Key: JBMESSAGING-1631
URL: https://jira.jboss.org/jira/browse/JBMESSAGING-1631
Project: JBoss Messaging
Issue Type: Bug
Components: JMS Clustering
Affects Versions: 1.4.0.SP3.CP08
Environment: Cluster of a few JBoss 4.2.3 servers with JBM 1.4.2.GA-SP1 or 1.4.0.SP3_CP08 running on x64 windows servers.
JBoss Remoting 2.5.1 or 2.2.3
Clustered XA connection factory, clustered queues, both server and client (MDBs) are deployed as one application - identical deployment for all servers in a cluster
Reporter: Victor Starenky
Assignee: Tim Fox
We have an EJB3 application is running on a cluster of 7 servers.
All servers have the same application farmed across them.
We have a clustered queue and using clustered connection factory.
Originally we ran into the bug JBMESSAGING-1456 and while testing the fix ran into a different problem. After the cluster was running for some time (usually overnight with lots of heavy background processing hapenning at that time) we see messages are "piling up" in some queues on some nodes.
Sympthoms are:
MessageCount is not zero (rather in the order of hundreeds), DeliveringCount is zero. These nodes have ConsumerCount=0 for the queues experiencing the problem. Message sucker is configured as far as I can tell. Looks like the problem might be related to client and/or server failover leaving some nodes without consumers while sucker not doing it's job (if I understand it correctly).
Once we bump the timeout values much higher than they are in the original config files the problem seems to disappear or at least show up much less frequently. Specifically I'm talking about these values:
messaging-service.xml:
<attribute name="FailoverStartTimeout">180000</attribute>
remoting-bisocket-service.xml:
<attribute name="clientLeasePeriod" isParam="true">30000</attribute>
<attribute name="validatorPingPeriod" isParam="true">30000</attribute>
<attribute name="validatorPingTimeout" isParam="true">20000</attribute>
<attribute name="registerCallbackListener">false</attribute>
<attribute name="timeout" isParam="true">240000</attribute>
While this serves as a temporary workaround we don't feel we can rely on JBM in a production clustered environment without having failover working properly.
This is a big showstopper for us at the moment.
Attached are the log files from the prod environment of 7 servers with the config files as well as log files from the test environment with just 2 servers (having same issue) and corresponding configs. The logs were produced by the test version of the messaging code with added logging as per JBMESSAGING-1456.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBMESSAGING-1621) Provide complete message ordering in a clustered environment
by Yusuke Yamamoto (JIRA)
Provide complete message ordering in a clustered environment
------------------------------------------------------------
Key: JBMESSAGING-1621
URL: https://jira.jboss.org/jira/browse/JBMESSAGING-1621
Project: JBoss Messaging
Issue Type: Feature Request
Reporter: Yusuke Yamamoto
Assignee: Tim Fox
While JBMESSAGING-1416 states message ordering feature in a singleton configuration, customer is also requesting a complete message ordering feature which is applicable in a clustered environment.
Here's the background:
In the case JMS is used, both performance and scalability are priority.
There is a conflict between scalable JMS implementation and complete message ordering feature since order aware messages cannot be processed concurrently.
But order unaware queues should be still processed in parallel for better throughput.
Additionally, there are some cases that no downtime is acceptable. But HA-Singleton requires certain amount of time to fail-over the service to other node.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBMESSAGING-1684) Message remain in the queue and do not get dispatched
by Alexander Marktl (JIRA)
Message remain in the queue and do not get dispatched
-----------------------------------------------------
Key: JBMESSAGING-1684
URL: https://jira.jboss.org/jira/browse/JBMESSAGING-1684
Project: JBoss Messaging
Issue Type: Quality Risk
Environment: SuSe Linux Enterprise Server 10, Java 1.5.0_11, AS 5 with JBoss Messaging - default installation
Reporter: Alexander Marktl
Assignee: Tim Fox
Priority: Minor
I tried to create 10 queues and send 10.000 messages per queue from a single producer per queue to a single consumer per queue. Unfortunately not all of the messages where delivered, some messages remain in the queues and wait for delivery. The JMX console for example states: 3 messages in the queue, 3 messages pending for delivery. But nothing happens. My receivers don't get these last messages. I don't know if this is a configuration issue or a bug.
The queues are named: qname_0 ...qname_n
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBMESSAGING-1707) ConcurrentModificationException in ClientClusteredConnectionFactoryDelegate
by Pavel Slavicek (JIRA)
ConcurrentModificationException in ClientClusteredConnectionFactoryDelegate
---------------------------------------------------------------------------
Key: JBMESSAGING-1707
URL: https://jira.jboss.org/jira/browse/JBMESSAGING-1707
Project: JBoss Messaging
Issue Type: Quality Risk
Components: JMS Client Manager
Affects Versions: 1.4.3.GA
Reporter: Pavel Slavicek
Assignee: Tim Fox
I have found ConcurrentModificationException in ClientClusteredConnectionFactoryDelegate.
Exception in thread "Thread-11" java.util.ConcurrentModificationException
at java.util.WeakHashMap$HashIterator.nextEntry(WeakHashMap.java:784)
at java.util.WeakHashMap$KeyIterator.next(WeakHashMap.java:817)
at org.jboss.jms.client.delegate.ClientClusteredConnectionFactoryDelegate$FinalizerShutdownHook.run(ClientClusteredConnectionFactoryDelegate.java:414)
Client:
client with multiple threads, every thread creates-sends-receives-closes.
Problem description:
Problem is in the ClientClusteredConnectionFactoryDelegate.java in the inner class FinalizerShutdownHook.
Shutdown hook implementation should to be written as thread safe (see javadoc for addShutdownHook() method).
Method run() in the FinalizerShutdownHook class iterates over all elements in the registered delegates
but this iteration should be synchronized on the delegates object.
Please see http://java.sun.com/javase/6/docs/api/java/util/Collections.html#synchron...
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months
[JBoss JIRA] Created: (JBMESSAGING-1754) Implement the JBossMQ behavior on JBM, when stopDelivery() is invoked via JMX console
by Tyronne Wickramarathne (JIRA)
Implement the JBossMQ behavior on JBM, when stopDelivery() is invoked via JMX console
-------------------------------------------------------------------------------------
Key: JBMESSAGING-1754
URL: https://jira.jboss.org/jira/browse/JBMESSAGING-1754
Project: JBoss Messaging
Issue Type: Feature Request
Components: Messaging Core
Affects Versions: 1.4.0.SP3.CP08
Environment: JBoss-EAP-4.3_CP6, JBM-1.4.0-SP3_CP8P1
Reporter: Tyronne Wickramarathne
When stopDelivery() is invoked via JMX console for any given MDB, the in process messages are rolled back to their corresponding destination without completing the process. This is however *not* a bug, but the expected behavior in JBM, for this is how it has defined the behavior of stopDelivery().
However on JBossMQ, the in process messages are completed at first, before stopDelivery() is processed. Which means, the call made via stopDelivery() will be kept on hold, until all in process messages are successfully completed. The customers migrating from JBossMQ are seeing this as a compatibility issue, when porting their applications to work on JBM. Hence, would it be possible to accommodate the behavior seen in JBossMQ on JBM please ?
I have tested this on both JBoss-EAP-4.3_CP6 as well as on JBoss-EAP-4.2_CP7. Both have the same code base for EJB3,JCA but not the JMS provider. Therefore, I'm raising this feature request under JBM.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: https://jira.jboss.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
13 years, 7 months