[jboss-svn-commits] JBL Code SVN: r34368 - in labs/jbossesb/trunk/product: samples/quickstarts/business_ruleservice_ruleAgent/ruleAgent/package and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Jul 29 20:14:27 EDT 2010
Author: dward
Date: 2010-07-29 20:14:26 -0400 (Thu, 29 Jul 2010)
New Revision: 34368
Added:
labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java
Removed:
labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentResourceClassLoader.java
Modified:
labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_cep/readme.txt
labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_ruleAgent/ruleAgent/package/org.jboss.soa.esb.services.rules.pkg
labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentHelper.java
labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java
Log:
Fix for JBESB-3402 ( https://jira.jboss.org/browse/JBESB-3402 ).
Modified: labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_cep/readme.txt
===================================================================
--- labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_cep/readme.txt 2010-07-29 23:58:09 UTC (rev 34367)
+++ labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_cep/readme.txt 2010-07-30 00:14:26 UTC (rev 34368)
@@ -1,3 +1,8 @@
+Note:
+=====
+ This example is currently under development and will most likely change in
+ the next release of JBoss ESB to more accurately showcase a CEP application.
+
Overview:
=========
An example of Complex Event Processing, using the classic "hub and spoke"
Modified: labs/jbossesb/trunk/product/samples/quickstarts/business_ruleservice_ruleAgent/ruleAgent/package/org.jboss.soa.esb.services.rules.pkg
===================================================================
(Binary files differ)
Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentHelper.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentHelper.java 2010-07-29 23:58:09 UTC (rev 34367)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentHelper.java 2010-07-30 00:14:26 UTC (rev 34368)
@@ -52,10 +52,12 @@
import org.drools.ChangeSet;
import org.drools.agent.RuleAgent;
import org.drools.builder.ResourceType;
+import org.drools.builder.conf.ClassLoaderCacheOption;
import org.drools.conf.EventProcessingOption;
import org.drools.xml.ChangeSetSemanticModule;
import org.drools.xml.SemanticModules;
import org.drools.xml.XmlChangeSetReader;
+import org.jboss.internal.soa.esb.services.rules.util.RulesClassLoader;
import org.jboss.internal.soa.esb.util.StreamUtils;
import org.jboss.soa.esb.ConfigurationException;
import org.jboss.soa.esb.services.rules.RuleInfo;
@@ -107,6 +109,7 @@
}
private final Properties properties = new Properties();
+ private final ClassLoader classLoader;
private String name = null;
private final ChangeSet changeSet;
@@ -117,6 +120,7 @@
public DroolsRuleAgentHelper(final RuleInfo ruleInfo) throws RuleServiceException
{
final String ruleAgentProperties = ruleInfo.getRuleSource();
+ classLoader = new RulesClassLoader(ruleAgentProperties);
String contents;
InputStream is = null;
@@ -150,7 +154,7 @@
if (ruleAgentProperties.endsWith(".xml") && contents.indexOf("<change-set") != -1)
{
// change-set
- changeSet = readChangeSet(ruleAgentProperties, contents);
+ changeSet = readChangeSet(contents);
}
else
{
@@ -248,16 +252,19 @@
logger.debug("created ChangeSet XML [" + xml + "]");
}
}
- changeSet = readChangeSet(ruleAgentProperties, xml);
+ changeSet = readChangeSet(xml);
}
+ // If this isn't false, then all rules' LHS object conditions will not match on .esb redeploys!
+ // (since objects are only equal if they're classloaders are also equal - and they're not on redploys)
+ properties.setProperty(ClassLoaderCacheOption.PROPERTY_NAME, Boolean.FALSE.toString());
}
- private ChangeSet readChangeSet(String ruleAgentProperties, String xml) throws RuleServiceException
+ private ChangeSet readChangeSet(String xml) throws RuleServiceException
{
SemanticModules semanticModules = new SemanticModules();
semanticModules.addSemanticModule(new ChangeSetSemanticModule());
XmlChangeSetReader reader = new XmlChangeSetReader(semanticModules);
- reader.setClassLoader(new DroolsRuleAgentResourceClassLoader(ruleAgentProperties), null);
+ reader.setClassLoader(classLoader, null);
try
{
return reader.read(new StringReader(xml));
@@ -477,11 +484,15 @@
return items;
}
-
+
public Properties getProperties()
{
return properties;
}
+ public ClassLoader getClassLoader()
+ {
+ return classLoader;
+ }
public String getName()
{
Deleted: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentResourceClassLoader.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentResourceClassLoader.java 2010-07-29 23:58:09 UTC (rev 34367)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleAgentResourceClassLoader.java 2010-07-30 00:14:26 UTC (rev 34368)
@@ -1,146 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2006, JBoss Inc., and others contributors as indicated
- * by the @authors tag. All rights reserved.
- * See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- * This copyrighted material is made available to anyone wishing to use,
- * modify, copy, or redistribute it subject to the terms and conditions
- * of the GNU Lesser General Public License, v. 2.1.
- * This program is distributed in the hope that it will be useful, but WITHOUT A
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
- * You should have received a copy of the GNU Lesser General Public License,
- * v.2.1 along with this distribution; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301, USA.
- *
- * (C) 2005-2010
- */
-package org.jboss.internal.soa.esb.services.rules;
-
-import java.net.URL;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.log4j.Logger;
-import org.jboss.internal.soa.esb.assertion.AssertArgument;
-import org.jboss.soa.esb.lifecycle.LifecyclePriorities;
-import org.jboss.soa.esb.lifecycle.LifecycleResource;
-import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
-import org.jboss.soa.esb.lifecycle.LifecycleResourceFactory;
-import org.jboss.soa.esb.lifecycle.LifecycleResourceManager;
-
-/**
- * Holds lifecycle-bound references to whatever the TCCL was at the time of construction,
- * and tries to use that for getting resources. This will not only help us find the correct
- * resource, but it will also help us avoid a memory leak, as the ClassLoader of the
- * XmlChangeSetReader is used to create the ClassPathResource, which is held onto globally
- * by the static drools ResourceChangeScanner/Notifier mechanism.
- *
- * @author dward at jboss.org
- */
-public class DroolsRuleAgentResourceClassLoader extends ClassLoader
-{
-
- private final String ruleAgentProperties;
-
- public DroolsRuleAgentResourceClassLoader(String ruleAgentProperties)
- {
- AssertArgument.isNotNullAndNotEmpty(ruleAgentProperties, RULE_AGENT_PROPERTIES);
- this.ruleAgentProperties = ruleAgentProperties;
- ClassLoader tccl = Thread.currentThread().getContextClassLoader();
- if (tccl != null)
- {
- try
- {
- putClassLoader(this.ruleAgentProperties, tccl);
- }
- catch (LifecycleResourceException lre)
- {
- throw new RuntimeException(lre);
- }
- }
- }
-
- @Override
- public final URL getResource(String name)
- {
- ClassLoader cl;
- try
- {
- cl = getClassLoader(ruleAgentProperties);
- }
- catch (LifecycleResourceException lre)
- {
- throw new RuntimeException(lre);
- }
- return (cl != null ? cl.getResource(name) : null);
- }
-
- private static final Logger logger = Logger.getLogger(DroolsRuleAgentResourceClassLoader.class);
-
- private static final String RULE_AGENT_PROPERTIES = "ruleAgentProperties";
-
- private static final LifecycleResource<Map<String, ClassLoader>> lifecycleClassLoaders =
- new LifecycleResource<Map<String, ClassLoader>>(new LifecycleRuleAgentFactory(), LifecyclePriorities.RULE_AGENT_RESOURCE_CLASSLOADER_PRIORITY);
-
- private static final void putClassLoader(String ruleAgentProperties, ClassLoader classLoader) throws LifecycleResourceException
- {
- String key = buildKey(ruleAgentProperties);
- Map<String, ClassLoader> map = lifecycleClassLoaders.getLifecycleResource();
- synchronized (map)
- {
- map.put(key, classLoader);
- }
- }
-
- private static final ClassLoader getClassLoader(String ruleAgentProperties) throws LifecycleResourceException
- {
- String key = buildKey(ruleAgentProperties);
- Map<String, ClassLoader> map = lifecycleClassLoaders.getLifecycleResource();
- synchronized (map)
- {
- return map.get(key);
- }
- }
-
- private static final String buildKey(String ruleAgentProperties)
- {
- return new StringBuilder()
- .append(DroolsRuleAgentResourceClassLoader.class.getSimpleName())
- .append("?deployment=")
- .append(LifecycleResourceManager.getSingleton().getIdentity())
- .append('&')
- .append(RULE_AGENT_PROPERTIES)
- .append('=')
- .append(ruleAgentProperties)
- .toString();
- }
-
- private static final class LifecycleRuleAgentFactory implements LifecycleResourceFactory<Map<String, ClassLoader>>
- {
-
- public Map<String, ClassLoader> createLifecycleResource(String lifecycleIdentity) throws LifecycleResourceException
- {
- return new ConcurrentHashMap<String, ClassLoader>();
- }
-
- public void destroyLifecycleResource(Map<String, ClassLoader> resource, String lifecycleIdentity) throws LifecycleResourceException
- {
- if (resource.size() > 0)
- {
- if ( logger.isInfoEnabled() )
- {
- for ( String key : resource.keySet() )
- {
- logger.info("Removing " + key);
- }
- }
- resource.clear();
- }
- }
-
- }
-
-}
Modified: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java 2010-07-29 23:58:09 UTC (rev 34367)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/DroolsRuleBaseHelper.java 2010-07-30 00:14:26 UTC (rev 34368)
@@ -29,8 +29,10 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
+import java.util.Properties;
import org.apache.log4j.Logger;
+import org.drools.ChangeSet;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
@@ -40,12 +42,15 @@
import org.drools.builder.DecisionTableConfiguration;
import org.drools.builder.DecisionTableInputType;
import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderConfiguration;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
+import org.drools.builder.conf.ClassLoaderCacheOption;
import org.drools.compiler.DroolsParserException;
import org.drools.conf.EventProcessingOption;
import org.drools.io.ResourceFactory;
+import org.jboss.internal.soa.esb.services.rules.util.RulesClassLoader;
import org.jboss.internal.soa.esb.util.StreamUtils;
import org.jboss.soa.esb.services.rules.RuleInfo;
import org.jboss.soa.esb.services.rules.RuleServicePropertiesNames.StringValue;
@@ -209,12 +214,19 @@
*/
public KnowledgeAgent createRuleAgent(final RuleInfo ruleInfo) throws RuleServiceException
{
- DroolsRuleAgentHelper drah = new DroolsRuleAgentHelper(ruleInfo);
- KnowledgeAgentConfiguration kac = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(drah.getProperties());
- KnowledgeAgent ka = KnowledgeAgentFactory.newKnowledgeAgent(drah.getName(), kac);
- ka.setSystemEventListener(new LogAgentEventListener(drah.getName()));
- ka.applyChangeSet(drah.getChangeSet());
- return ka;
+ final DroolsRuleAgentHelper drah = new DroolsRuleAgentHelper(ruleInfo);
+ final Properties properties = drah.getProperties();
+ final ClassLoader classLoader = drah.getClassLoader();
+ final String name = drah.getName();
+ final ChangeSet changeSet = drah.getChangeSet();
+ final KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(properties, classLoader);
+ final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConfig);
+ final KnowledgeAgentConfiguration kagentConfig = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(properties);
+ final KnowledgeBuilderConfiguration kbuilderConfig = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(properties, classLoader);
+ final KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(name, kbase, kagentConfig, kbuilderConfig);
+ kagent.setSystemEventListener(new LogAgentEventListener(name));
+ kagent.applyChangeSet(changeSet);
+ return kagent;
}
private String getFileContents( final String fileName ) throws RuleServiceException
@@ -252,8 +264,14 @@
{
throw new RuleServiceException("Generation raised the following errors: " + errors) ;
}
- KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+ // If we don't use this config, then all rules' LHS object conditions will not match on .esb redeploys!
+ // (since objects are only equal if their ClassLoaders are also equal - and they're not on redeploys..)
+ final Properties properties = new Properties();
+ properties.setProperty(ClassLoaderCacheOption.PROPERTY_NAME, Boolean.FALSE.toString());
+ final ClassLoader classLoader = new RulesClassLoader(ruleInfo.getRuleSource());
+ KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(properties, classLoader);
+
// CEP
StringValue eventProcessingType = RULE_EVENT_PROCESSING_TYPE.getStringValue(ruleInfo.getEventProcessingType());
if (STREAM.equals(eventProcessingType))
Added: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java
===================================================================
--- labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java (rev 0)
+++ labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java 2010-07-30 00:14:26 UTC (rev 34368)
@@ -0,0 +1,180 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, JBoss Inc., and others contributors as indicated
+ * by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * (C) 2005-2010
+ */
+package org.jboss.internal.soa.esb.services.rules.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.log4j.Logger;
+import org.jboss.internal.soa.esb.assertion.AssertArgument;
+import org.jboss.soa.esb.lifecycle.LifecyclePriorities;
+import org.jboss.soa.esb.lifecycle.LifecycleResource;
+import org.jboss.soa.esb.lifecycle.LifecycleResourceException;
+import org.jboss.soa.esb.lifecycle.LifecycleResourceFactory;
+import org.jboss.soa.esb.lifecycle.LifecycleResourceManager;
+
+/**
+ * Holds lifecycle-bound references to whatever the TCCL was at the time of construction,
+ * and tries to use that for loading classes or getting resources. This will not only
+ * help us find the correct class or resource, but it will also help us avoid a memory leak,
+ * as there are static drools mechanisms (like ResourceChangeScanner/Notifier).
+ *
+ * @author dward at jboss.org
+ */
+public final class RulesClassLoader extends ClassLoader
+{
+
+ private final String ruleSource;
+
+ public RulesClassLoader(final String ruleSource)
+ {
+ AssertArgument.isNotNullAndNotEmpty(ruleSource, RULE_SOURCE);
+ this.ruleSource = ruleSource;
+ ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+ if (tccl != null)
+ {
+ try
+ {
+ putClassLoader(this.ruleSource, tccl);
+ }
+ catch (LifecycleResourceException lre)
+ {
+ throw new RuntimeException(lre);
+ }
+ }
+ }
+
+ @Override
+ public final URL getResource(String name)
+ {
+ ClassLoader cl = getClassLoader();
+ return (cl != null) ? cl.getResource(name) : super.getResource(name);
+ }
+
+ @Override
+ public final InputStream getResourceAsStream(String name)
+ {
+ ClassLoader cl = getClassLoader();
+ return (cl != null) ? cl.getResourceAsStream(name) : super.getResourceAsStream(name);
+ }
+
+ @Override
+ public final Enumeration<URL> getResources(String name) throws IOException
+ {
+ ClassLoader cl = getClassLoader();
+ return (cl != null) ? cl.getResources(name) : super.getResources(name);
+ }
+
+ @Override
+ public final Class<?> loadClass(String name) throws ClassNotFoundException
+ {
+ ClassLoader cl = getClassLoader();
+ return (cl != null) ? cl.loadClass(name) : super.loadClass(name);
+ }
+
+ @Override
+ public final Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
+ {
+ ClassLoader cl = getClassLoader();
+ return (cl != null) ? cl.loadClass(name) : super.loadClass(name, resolve);
+ }
+
+ private final ClassLoader getClassLoader()
+ {
+ try
+ {
+ return getClassLoader(this.ruleSource);
+ }
+ catch (LifecycleResourceException lre)
+ {
+ throw new RuntimeException(lre);
+ }
+ }
+
+ private static final Logger logger = Logger.getLogger(RulesClassLoader.class);
+
+ private static final String RULE_SOURCE = "ruleSource";
+
+ private static final LifecycleResource<Map<String, ClassLoader>> lifecycleClassLoaders =
+ new LifecycleResource<Map<String, ClassLoader>>(new LifecycleRuleAgentFactory(), LifecyclePriorities.RULE_AGENT_RESOURCE_CLASSLOADER_PRIORITY);
+
+ private static final void putClassLoader(String ruleSource, ClassLoader classLoader) throws LifecycleResourceException
+ {
+ String key = buildKey(ruleSource);
+ Map<String, ClassLoader> map = lifecycleClassLoaders.getLifecycleResource();
+ synchronized (map)
+ {
+ map.put(key, classLoader);
+ }
+ }
+
+ private static final ClassLoader getClassLoader(String ruleSource) throws LifecycleResourceException
+ {
+ String key = buildKey(ruleSource);
+ Map<String, ClassLoader> map = lifecycleClassLoaders.getLifecycleResource();
+ synchronized (map)
+ {
+ return map.get(key);
+ }
+ }
+
+ private static final String buildKey(String ruleSource)
+ {
+ return new StringBuilder()
+ .append(RulesClassLoader.class.getSimpleName())
+ .append("?deployment=")
+ .append(LifecycleResourceManager.getSingleton().getIdentity())
+ .append('&')
+ .append(RULE_SOURCE)
+ .append('=')
+ .append(ruleSource)
+ .toString();
+ }
+
+ private static final class LifecycleRuleAgentFactory implements LifecycleResourceFactory<Map<String, ClassLoader>>
+ {
+
+ public Map<String, ClassLoader> createLifecycleResource(String lifecycleIdentity) throws LifecycleResourceException
+ {
+ return new ConcurrentHashMap<String, ClassLoader>();
+ }
+
+ public void destroyLifecycleResource(Map<String, ClassLoader> resource, String lifecycleIdentity) throws LifecycleResourceException
+ {
+ if (resource.size() > 0)
+ {
+ if ( logger.isInfoEnabled() )
+ {
+ for ( String key : resource.keySet() )
+ {
+ logger.info("Removing " + key);
+ }
+ }
+ resource.clear();
+ }
+ }
+
+ }
+
+}
Property changes on: labs/jbossesb/trunk/product/services/jbrules/src/main/java/org/jboss/internal/soa/esb/services/rules/util/RulesClassLoader.java
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
More information about the jboss-svn-commits
mailing list