I am facing a tough problem requiring some abnormal solutions: The
requirements calls for million rules (they all think about that at the
beginning), so we are thinking about packaging rules on the fly during
execution instead caching all the rules in the rules engine. All the
rules will be pre-compiled and serialized to storage. We would like to
achieve to separate the Package and Rule's objects, and dynamically
compose the Package object when needed.
I tried the following steps and was enable to move forward beyond step
5:
1. Create the Package object by using
PackageBuilder().addPackageFromDrl(drl_file).
2. For each rule under the Package object, remove it from Package by
calling Package().removeRule(rule), then serialize it to storage.
3. Serialize the now empty Package object to storage.
<!-- when recompose the Package object, perform the following steps -->
4. Deserialize the Package.
5. Deserialize the Rule objects - this is where I encountered an
ClassNotFoundException at the end of the message
6. Using Package().addRule(rule) to add needed rules - not tried yet.
7. Add the package to RuleBase..... as normally do.
java.lang.ClassNotFoundException:
com.travelocity.rules.hotel.Rule_Match_Region_Rule_1_0ConsequenceInvoker
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:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:585)
at
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1544)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699
)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at
java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1908)
at
java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719
)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
at com.travelocity.common.util.IOUtil.readObject(IOUtil.java:158)
at com.travelocity.common.util.IOUtil.readObject(IOUtil.java:147)
at
com.travelocity.rules.hotel.HotelChargeRulesUnitTest.loadPackage(HotelCh
argeRulesUnitTest.java:64)
at
com.travelocity.rules.hotel.HotelChargeRulesUnitTest.testHotelChargeRequ
est(HotelChargeRulesUnitTest.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.jav
a:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
Impl.java:25)
at
com.intellij.rt.execution.junit2.JUnitStarter.main(JUnitStarter.java:32)
In the application, the rule name is "Match Region Rule 1", and the
package name is "com.travelocity.rules.hotel". Please advise if it is
possible to get around this problem, or if this approach would really
work?
Your help is greatly appreciated.
-Ming