cancel
Showing results for 
Search instead for 
Did you mean: 

Calling BRM from UDF using Public API

0 Kudos

Hi Experts,

I am trying to call BRM from UDF using the public BRM API.

The following blog is used as inspiration.

http://help.sap.com/saphelp_nwce72/helpdata/en/2f/b0c8182e3a4aa0af3931938679fe58/frameset.htm

I get an error when calling the invokeRuleset part of the code from from a message mapping.

jndiName = "com.sap.brms.RuleEngine"

if (ruleEngine == null) {

  InitialContext context = new InitialContext()

  Object obj = context.lookup(jndiName);

  RuleEngineHome home = (RuleEngineHome) PortableRemoteObject.narrow(obj,

  RuleEngineHome.class);

  ruleEngine = (RuleEngine) home.create();

}

The error message i get in the Try/Catch is the following: com.sap.brms.qrules.ejb.RuleEngineHome

Let me know if more info is needed?

Accepted Solutions (0)

Answers (2)

Answers (2)

junwu
Active Contributor
0 Kudos

error message is just com.sap.brms.qrules.ejb.RuleEngineHome?

0 Kudos

Yes,

And i dont know what it means.

I know the line it fails on is this:

RuleEngineHome home = (RuleEngineHome) PortableRemoteObject.narrow(obj,

  RuleEngineHome.class);

junwu
Active Contributor
0 Kudos

are you sure? did you print the stacktrace?

0 Kudos

Here is the StackTrace:

com.sap.engine.services.cross.PortableRemoteObjectContainer.narrow(PortableRemoteObjectContainer.java:238)
com.sap.engine.system.PortableRemoteObjectProxy.narrow(PortableRemoteObjectProxy.java:24)
javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
xxxx.com_xxxx_1._.XXXXFunctions.readDecisionTable(XXXXFunctions.java:70)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.sap.aii.mappingtool.tf7.rt.MethodImplementedIteratorHelper.executeMethod(MethodImplementedIteratorHelper.java:177)
com.sap.aii.mappingtool.tf7.rt.FunctionWrapper.calculateCurrentValue(FunctionWrapper.java:106)
com.sap.aii.mappingtool.tf7.rt.AbstractFunctionWrapper.cacheValue(AbstractFunctionWrapper.java:31)
com.sap.aii.mappingtool.tf7.rt.AbstractFunctionWrapper.gotoNextContext(AbstractFunctionWrapper.java:41)
com.sap.aii.mappingtool.tfapi.ResIteratorDump.dump(ResIteratorDump.java:54)
com.sap.aii.mappingtool.tf7.AMappingProgram.dumpIterators(AMappingProgram.java:731)
com.sap.aii.mappingtool.tf7.AMappingProgram.start(AMappingProgram.java:511)
com.sap.aii.mappingtool.tf7.Transformer.start(Transformer.java:145)
com.sap.aii.mappingtool.tf7.AMappingProgram.transform(AMappingProgram.java:645)
com.sap.aii.ibrep.server.mapping.exec.ExecuteXiMappingCommand.transformInternal(ExecuteXiMappingCommand.java:198)
com.sap.aii.ibrep.server.mapping.exec.ExecuteXiMappingCommand.execute(ExecuteXiMappingCommand.java:95)
com.sap.aii.ib.server.mapping.exec.CommandManager.execute(CommandManager.java:43)
com.sap.aii.ibrep.server.mapping.ServerMapService.execute(ServerMapService.java:40)
com.sap.aii.ibrep.server.mapping.MapServiceBean.execute(MapServiceBean.java:40)
sun.reflect.GeneratedMethodAccessor767.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.sap.engine.services.ejb3.runtime.impl.RequestInvocationContext.proceedFinal(RequestInvocationContext.java:47)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:166)
com.sap.engine.services.ejb3.runtime.impl.Interceptors_StatesTransition.invoke(Interceptors_StatesTransition.java:19)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
com.sap.engine.services.ejb3.runtime.impl.Interceptors_Resource.invoke(Interceptors_Resource.java:50)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
com.sap.engine.services.ejb3.runtime.impl.Interceptors_Transaction.doWorkWithAttribute(Interceptors_Transaction.java:37)
com.sap.engine.services.ejb3.runtime.impl.Interceptors_Transaction.invoke(Interceptors_Transaction.java:21)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
com.sap.engine.services.ejb3.runtime.impl.Interceptors_MethodRetry.invoke(Interceptors_MethodRetry.java:46)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:191)
com.sap.engine.services.ejb3.runtime.impl.Interceptors_StatelessInstanceGetter.invoke(Interceptors_StatelessInstanceGetter.java:23)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
com.sap.engine.services.ejb3.runtime.impl.Interceptors_SecurityCheck.invoke(Interceptors_SecurityCheck.java:25)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
com.sap.engine.services.ejb3.runtime.impl.Interceptors_ExceptionTracer.invoke(Interceptors_ExceptionTracer.java:17)
com.sap.engine.services.ejb3.runtime.impl.AbstractInvocationContext.proceed(AbstractInvocationContext.java:179)
com.sap.engine.services.ejb3.runtime.impl.DefaultInvocationChainsManager.startChain(DefaultInvocationChainsManager.java:138)
com.sap.engine.services.ejb3.runtime.impl.DefaultEJBProxyInvocationHandler.invoke(DefaultEJBProxyInvocationHandler.java:164)
$Proxy982.execute(Unknown Source)
sun.reflect.GeneratedMethodAccessor766.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
com.sap.engine.services.rmi_p4.P4DynamicSkeleton.dispatch(P4DynamicSkeleton.java:240)
com.sap.engine.services.rmi_p4.DispatchImpl._runInternal(DispatchImpl.java:466)
com.sap.engine.services.rmi_p4.server.ServerDispatchImpl.run(ServerDispatchImpl.java:69)
com.sap.engine.services.rmi_p4.P4Message.process(P4Message.java:72)
com.sap.engine.services.rmi_p4.P4Message.execute(P4Message.java:43)
com.sap.engine.services.cross.fca.FCAConnectorImpl.executeRequest(FCAConnectorImpl.java:999)
com.sap.engine.services.rmi_p4.P4Message.process(P4Message.java:59)
com.sap.engine.services.cross.fca.MessageReader.run(MessageReader.java:55)
com.sap.engine.core.thread.execution.Executable.run(Executable.java:122)
com.sap.engine.core.thread.execution.Executable.run(Executable.java:101)
com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:328)
0 Kudos

Here is the UDF code.

public class XXXXFunctions  {

          private static String projectName = "demo.sap.com~ratecalculation";

          private static String rulesetName = "ratecalcrules";

          @LibraryMethod(title="readDecisionTable", description="Read Decision Table", category="User-Defined", type=ExecutionType.SINGLE_VALUE)

          public String readDecisionTable (

                    @Argument(title="connProvider")  String connProvider,

                    @Argument(title="destCountry")  String destCountry,

                    @Argument(title="originCountry")  String originCountry,

                    @Argument(title="typeOfLine")  String typeOfLine,

                     Container container)  throws StreamTransformationException{

                    String result = "";

                    try {

                              //Remote Lookup of the Rules Engine

                              InitialContext context = new InitialContext();

                              Object obj = context.lookup(RuleEngineHome.JNDI_NAME);

                              RuleEngineHome home = (RuleEngineHome) PortableRemoteObject.narrow(obj,

                                                                      RuleEngineHome.class);

                              RuleEngineRemote remote = home.create();

                              RuleEngine engine = (RuleEngine) remote;

                              //Invoking a Ruleset

                              RulesetContext ruleContext = engine.createRulesetContext(projectName, rulesetName);

                    } catch (Exception e) {

                              StackTraceElement[] stack = e.getStackTrace();

                        String exception = "";

                        for (StackTraceElement s : stack) {

                            exception = exception + s.toString() + "\n\t\t";

                        }

                              messageLog("ErrorMessage: " + e.getMessage(), container);

                              messageLog("ErrorTrace: " + exception, container);

                    }

                    return result;

          }

          public static void messageLog(String traceInput, Container container) {

                    AbstractTrace trace = container.getTrace();

                    trace.addInfo(traceInput);

          }

          @Init(description="")

          public void init (

                     GlobalContainer container)  throws StreamTransformationException{

          }

          @Cleanup

          public void cleanup (

                     GlobalContainer container)  throws StreamTransformationException{

          }

}

Former Member
0 Kudos

Hi Christian,

Did you manage to make this UDF working?

Can you share the trick please?

Thanks and regards,

Jorge

0 Kudos

When i run the inspiration scenario i get the following data in obj.

Object obj = context.lookup(jndiName);

obj

RMI_P4: Local Dynamic Stub for impl -> com.sap.engine.services.ejb3.runtime.impl.DefaultEJBProxyInvocationHandler@d2e210b6

------ P4 Remote Object Info : com.sap.engine.services.rmi_p4.server.P4ServerObjectInfo@12a

   |-           broker id : 1120312513

   |-           server id : 3779250

   |-           client Id : -1

   |-            local Id : 3779250

   |-     is redirectable : false

   |-         redir Ident :

   |-        factory Name : null

   |-               objId : null

   |-  server loader name : null

   |-           connected : false

   |- supportOptimization : true

   |-            protocol :  76 31                                             v1

        Remote Interfaces :

   Interface : [0] = com.sap.brms.qrules.ejb.RuleEngineRemote

   Interface : [1] = com.sap.engine.services.ejb3.runtime.ComponentInterface

=========================================

       Connection profiles :

   connection profile : [0] = None:10.118.226.187:50004

=========================================

The response i get from my UDF is the following:

obj

RMI_P4: Local Dynamic Stub for impl -> com.sap.engine.services.ejb3.runtime.impl.DefaultEJBProxyInvocationHandler@d2e210b6

------ P4 Remote Object Info : com.sap.engine.services.rmi_p4.server.P4ServerObjectInfo@129

|- broker id : 1120312513

|- server id : 3779250

|- client Id : -1

|- local Id : 3779250

|- is redirectable : false

|- redir Ident :

|- factory Name : null

|- objId : null

|- server loader name : null

|- connected : false

|- supportOptimization : true

|- protocol : 76 31 v1

Remote Interfaces :

Interface : [0] = com.sap.brms.qrules.ejb.RuleEngineHome

Interface : [1] = com.sap.engine.services.ejb3.runtime.ComponentInterface

=========================================

Connection profiles :

  connection profile : [0] = None:10.118.226.187:50004

=========================================

The only real difference i can see is the Interface[0]

com.sap.brms.qrules.ejb.RuleEngineRemote

com.sap.brms.qrules.ejb.RuleEngineHome

All ideas are welcome 🙂