cancel
Showing results for 
Search instead for 
Did you mean: 

Assigning Tasks and Sending Notifications to Users Dynamically

Former Member
0 Kudos

BPM Experts,

We have a BPM process which gets triggered from a JWD application. The issue which we are having is as follows

1.Dynamic allocation of Single user to a task is not working. The approach we have taken is WD application will send User Unique Id from context and it will be mapped to getPrincipal exression.

2.Assign to task to multiple users, first in complex type we are not able to set the cardinality 0..n , it accepting 0..1 or 1..1...To handle this we have appended each of IUsedId sent as string in WD with special characters and tried using tokenize function and then getPrincipals even that also not working

Any quick response and pointers will be highly appreciated

FYI... we cannot use Portal UME groups in this scenario

Best regards,

Prasad

Accepted Solutions (0)

Answers (1)

Answers (1)

Former Member
0 Kudos

Team,

Any response will be highly appreciated

Thanks again

Best regards,

Prasad

Former Member
0 Kudos

Hi Prasad,

try using getPrincipalByUniqueName(UserUniqueId,"user" ) with UserUniqueId from the context and "user" string to indicate an user.

Regards,

Unni

junwu
Active Contributor
0 Kudos

you can take some time to go with EJB function.

Former Member
0 Kudos

Hi John,

Thanks for your reply. I am encountering issues in EJB to return Array of Principal Ids, I am not sure how we need to declare in Complex type in EJB

@unni: getPrincipalByUniqueName doesnt serve purpose as task needs to be assigned to multiple user

Best regards,

Prasad

Former Member
0 Kudos

Hi Prasad,

I had to do something similar with an EJB.

For your question: "I am not sure how we need to declare in Complex type in EJB".

You could use the following code:



private static final String NAMESPACE_FUNCTION_PARAMETER = "xxxx";//Your function namespace
private static final String RESULT = "result";
private static final String NAME_PROPERTY_OUTPUT_RESULT = SdoRenamingHelper
			.renameXsdElementToSdoProperty(new QName(
					NAMESPACE_FUNCTION_PARAMETER, RESULT), false);

public DataObject invokeSdo(DataObject inputDO, IInvocationContext invocationContext) {

DataObject outputDO = invocationContext.createOutputDataObject();
List<String> principals = yourMethodForGetPrincipalIds();
outputDO.setList(outputDO.getType().getProperty(NAME_PROPERTY_OUTPUT_RESULT), principals);
return outputDO;

}

I hope that this information is useful.

Regards,

Julian.

Former Member
0 Kudos

Hi Julian,

Thanks for the reply, I am getting below warning when trying to deploy the EAR which has got EJB as used DC. The same error is coming when I am trying use the same in BPM after deployment at runtime -


com.sap.engine.services.ejb3.runtime.impl.refmatcher.EJBResolvingException: Cannot start application xxxxx.com/devc~eardynamicusers; nested exception is: java.rmi.RemoteException: ASJ.dpl_ds.006125 Error occurred while starting application locally and wait.; nested exception is:

* com.sap.engine.services.deploy.exceptions.ServerDeploymentException: Application [xxxxx.com/devc~eardynamicusers] cannot be started. Reason: it has hard reference to resource [devc~ejbdynamicusers] with type [application], which is not active on the server.*

Hint: 1) Is referred resource deployed? 2) Is referred resource able to start? at com.sap.engine.services.ejb3.runtime.impl.DefaultContainerRepository.startApp(DefaultContainerRepository.java:351)

at com.sap.engine.services.ejb3.runtime.impl.refmatcher.result.SingleResultImpl.add(SingleResultImpl.java:17)

at com.sap.engine.services.ejb3.runtime.impl.refmatcher.BeanMatcher.matchLocalInterfaces(BeanMatcher.java:208)

at com.sap.engine.services.ejb3.runtime.impl.refmatcher.BeanMatcher.matchInterfaces(BeanMatcher.java:83)

at com.sap.engine.services.ejb3.runtime.impl.refmatcher.BeanMatcher.matchReferenceToBean(BeanMatcher.java:46)

at com.sap.engine.services.ejb3.runtime.impl.DefaultContainerRepository.matchBean(DefaultContainerRepository.java:390)

at com.sap.engine.services.ejb3.runtime.impl.DefaultContainerRepository.matchApps(DefaultContainerRepository.java:367)

at com.sap.engine.services.ejb3.runtime.impl.DefaultContainerRepository.getEnterpriseBeansContainers(DefaultContainerRepository.java:95)

at com.sap.engine.services.ejb3.runtime.impl.DefaultRemoteObjectFactory.resolveReference(DefaultRemoteObjectFactory.java:73)

at com.sap.engine.services.ejb3.runtime.impl.EJBObjectFactory.getObjectInstance(EJBObjectFactory.java:145)

at com.sap.engine.services.ejb3.runtime.impl.EJBObjectFactory.getObjectInstance(EJBObjectFactory.java:64)

at com.sap.engine.system.naming.provider.ObjectFactoryBuilderImpl._getObjectInstance(ObjectFactoryBuilderImpl.java:77)

at com.sap.engine.system.naming.provider.ObjectFactoryBuilderImpl.access$100(ObjectFactoryBuilderImpl.java:33)

at com.sap.engine.system.naming.provider.ObjectFactoryBuilderImpl$DispatchObjectFactory.getObjectInstance(ObjectFactoryBuilderImpl.java:228)

at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:283)

at com.sap.engine.services.jndi.implclient.ClientContext.lookup(ClientContext.java:450)

at com.sap.engine.services.jndi.implclient.OffsetClientContext.lookup(OffsetClientContext.java:224)

at com.sap.engine.services.jndi.implclient.OffsetClientContext.lookup(OffsetClientContext.java:243)

at javax.naming.InitialContext.lookup(InitialContext.java:392)

at javax.naming.InitialContext.lookup(InitialContext.java:392)

at com.sap.glx.mapping.execution.implementation.function.BeanFunctionProvider.createBeanFunction(BeanFunctionProvider.java:24)

at com.sap.glx.mapping.execution.implementation.Compiler$NativeBeanFunction.invokeNative(Compiler.java:362)

at com.sap.glx.mapping.execution.implementation.rule.invocation.StandardInvocation.step(StandardInvocation.java:133)

at com.sap.glx.mapping.execution.implementation.rule.expression.DeepExpression$Resolver.resolve(DeepExpression.java:45)

at com.sap.glx.mapping.execution.implementation.rule.expression.DeepExpression$Resolver.<init>(DeepExpression.java:27)

at com.sap.glx.mapping.execution.implementation.rule.expression.DeepExpression.internalExpress(DeepExpression.java:77)

at com.sap.glx.mapping.execution.implementation.rule.expression.AbstractExpression.express(AbstractExpression.java:50)

at com.sap.glx.mapping.execution.implementation.rule.part.AbstractPart.processSourceExpression(AbstractPart.java:117)

at com.sap.glx.mapping.execution.implementation.rule.part.TerminalPart.internalPartake(TerminalPart.java:23)

at com.sap.glx.mapping.execution.implementation.rule.part.AbstractPart.partake(AbstractPart.java:87)

at com.sap.glx.mapping.execution.implementation.rule.mapping.NarrowMapping.internalMap(NarrowMapping.java:42)

at com.sap.glx.mapping.execution.implementation.rule.mapping.AbstractMapping.map(AbstractMapping.java:49)

at com.sap.glx.mapping.execution.implementation.rule.invocation.StandardInvocation$ImplementedInput.receive(StandardInvocation.java:77)

at com.sap.glx.mapping.execution.implementation.invoker.MediatedSdoInvoker$Mediator.createInputDataObject(MediatedSdoInvoker.java:110)

at com.sap.glx.mapping.execution.implementation.invoker.MediatedSdoInvoker.invokeNative(MediatedSdoInvoker.java:155)

at com.sap.glx.mapping.execution.implementation.Compiler$NativeBeanFunction.invokeNative(Compiler.java:364)

at com.sap.glx.mapping.execution.implementation.rule.invocation.StandardInvocation.step(StandardInvocation.java:133)

at com.sap.glx.mapping.execution.implementation.rule.expression.DeepExpression$Resolver.resolve(DeepExpression.java:45)

at com.sap.glx.mapping.execution.implementation.rule.expression.DeepExpression$Resolver.<init>(DeepExpression.java:27)

at com.sap.glx.mapping.execution.implementation.rule.expression.DeepExpression.internalExpress(DeepExpression.java:77)

at com.sap.glx.mapping.execution.implementation.rule.expression.AbstractExpression.express(AbstractExpression.java:50)

at com.sap.glx.mapping.execution.implementation.rule.part.AbstractPart.processSourceExpression(AbstractPart.java:117)

at com.sap.glx.mapping.execution.implementation.rule.part.BroadPart.internalPartake(BroadPart.java:38)

at com.sap.glx.mapping.execution.implementation.rule.part.AbstractPart.partake(AbstractPart.java:87)

at com.sap.glx.mapping.execution.implementation.rule.part.BroadPart.internalPartake(BroadPart.java:46)

at com.sap.glx.mapping.execution.implementation.rule.part.AbstractPart.partake(AbstractPart.java:87)

at com.sap.glx.mapping.execution.implementation.rule.mapping.NarrowMapping.internalMap(NarrowMapping.java:42)

at com.sap.glx.mapping.execution.implementation.rule.mapping.AbstractMapping.map(AbstractMapping.java:49)

at com.sap.glx.mapping.execution.implementation.Runner.transform(Runner.java:61)

at com.sap.glx.mapping.execution.implementation.Runner.transform(Runner.java:41)

at com.sap.glx.core.internaladapter.Transformer$TransformerTemplateAccessor$MapperTemplate$ImplementedInvocationHandler.map(Transformer.java:3016)

at com.sap.glx.core.internaladapter.Transformer$TransformerTemplateAccessor$MapperTemplate$ImplementedInvocationHandler.invoke(Transformer.java:2997)

at com.sap.glx.core.internaladapter.Transformer$TransformerInvocationHandler.invoke(Transformer.java:3284)

at com.sap.glx.core.dock.impl.DockObjectImpl.invokeMethod(DockObjectImpl.java:530)

at com.sap.glx.core.kernel.trigger.config.Script$MethodInvocation.execute(Script.java:245)

at com.sap.glx.core.kernel.trigger.config.Script.execute(Script.java:791)

at com.sap.glx.core.kernel.execution.transition.ScriptTransition.execute(ScriptTransition.java:63)

at com.sap.glx.core.kernel.execution.transition.Transition.commence(Transition.java:138)

at com.sap.glx.core.kernel.mmtx.DirectNestedTransaction.inPrepare(DirectNestedTransaction.java:67)

at com.sap.glx.core.kernel.mmtx.AbstractTransaction.do_prepare(AbstractTransaction.java:198)

at com.sap.glx.core.kernel.mmtx.AbstractTransaction.commit(AbstractTransaction.java:81)

at com.sap.glx.core.kernel.mmtx.DirectNestedTransaction.inPrepare(DirectNestedTransaction.java:68)

at com.sap.glx.core.kernel.mmtx.AbstractTransaction.do_prepare(AbstractTransaction.java:198)

at com.sap.glx.core.kernel.mmtx.AbstractTransaction.commit(AbstractTransaction.java:81)

at com.sap.glx.core.kernel.mmtx.PrimaryTransaction.inPrepare(PrimaryTransaction.java:125)

at com.sap.glx.core.kernel.mmtx.AbstractTransaction.do_prepare(AbstractTransaction.java:198)

at com.sap.glx.core.kernel.mmtx.AbstractTransaction.commit(AbstractTransaction.java:81)

at com.sap.glx.core.kernel.execution.LeaderWorkerPool$Follower.run(LeaderWorkerPool.java:129)

at com.sap.glx.core.resource.impl.common.WorkWrapper.run(WorkWrapper.java:58)

at com.sap.glx.core.resource.impl.j2ee.ServiceUserManager$ServiceUserImpersonator$1.run(ServiceUserManager.java:124)

at java.security.AccessController.doPrivileged(Native Method)

at javax.security.auth.Subject.doAs(Subject.java:337)

at com.sap.glx.core.resource.impl.j2ee.ServiceUserManager$ServiceUserImpersonator.run(ServiceUserManager.java:121)

at com.sap.engine.core.thread.impl3.ActionObject.run(ActionObject.java:37)

at java.security.AccessController.doPrivileged(Native Method)

at com.sap.engine.core.thread.impl3.SingleThread.execute(SingleThread.java:182)

at com.sap.engine.core.thread.impl3.SingleThread.run(SingleThread.java:299)

at: NamingException: Exception during lookup operation of object with name xxxxx.com/devc~eardynamicusers/LOCAL/DynamicUsersBean/bean.DynamicUsersBeanLocal, cannot resolve object reference.

Edited by: Hemanth Racharla on Jun 19, 2011 6:18 PM

Former Member
0 Kudos

Hi Prasad,

Try to deploy first the EAR project (with reference to EJB project), and then you should checked if the EJB is deployed correctly (http://<host>:<port>/ejbexplorer).

Later deploy your BPM project, but before checked if the EJB Function have the correct JNDI lookup name for the EJB.

Best Regards,

Julian.

Former Member
0 Kudos

Hi Julian,

Thanks for the details, I've created same I've checked that EJB is deployed as well. But I am getting below error. Though I've given correct JNDI reference name. Appreciate any help from you. Also can please let me know while giving the reference in EAR file do we need to check for Design Deploy and Runtime?

at: IllegalArgumentException: Lookup name 'xxxx.com/devc~eardynamicusers/LOCAL/DynamicUsersBean/bean.DynamicUsersBeanLocal' invalid

at: EJB::xxxx.com/devc~eardynamicusers/LOCAL/DynamicUsersBean/bean.DynamicUsersBeanLocal( "xxxx@xxxx" --> input )

at: EJB::xxxx.com/devc~eardynamicusers/LOCAL/DynamicUsersBean/bean.DynamicUsersBeanLocal( "xxxx@xxxx" --> input )/result merge(relay,void)> principalID

at: Implicit Function Argument Transformation

JNDI name given is :xxxxx.com/devc~eardynamicusers/LOCAL/DynamicUsersBean/bean.DynamicUsersBeanLocal

public class DynamicUsersBean implements DynamicUsersBeanLocal, Function, SdoInvoker {

    /**
     * Default constructor. 
     */
    public DynamicUsersBean() {
        
    }
    private static final String NAMESPACE_FUNCTION_PARAMETER = "dynamicusers.xxxx.com/bpmprocess";
    private static final String SOURCE_LOGONID_PROPERTY = "input";
    private static final String RESULT = "result";
    private static final String NAME_PROPERTY_OUTPUT_RESULT = SdoRenamingHelper.renameXsdElementToSdoProperty(new QName(NAMESPACE_FUNCTION_PARAMETER, RESULT), false);
    //private static final com.sap.tc.logging.Location logger = com.sap.tc.logging.Location.getLocation(DynamicUsersBean.class);
  //  private static final String NAME_PROPERTY_INPUT_PARAMETER1 = SdoRenamingHelper.renameXsdElementToSdoProperty(new QName(
    //NAMESPACE_FUNCTION_PARAMETER, PARAMETER1), false);
    
    //private static final String NAME_PROPERTY_OUTPUT_RESULT = SdoRenamingHelper
   // .renameXsdElementToSdoProperty(new QName(
    //NAMESPACE_FUNCTION_PARAMETER, RESULT), false);
	/**
     * @see SdoInvoker#invokeSdo(DataObject, SdoInvoker.InvocationContext)
     */
    public DataObject invokeSdo(DataObject sourceDO, SdoInvoker.InvocationContext invocationContext) {
        // TODO Auto-generated method stub
    	// check source DO
    	System.out.println("<EJB Class>Inside Invoke method");
    	ArrayList<String> listPrincipal = new ArrayList<String>();
    	DataObject outputDO = invocationContext.createOutputDataObject();
    	Property keyvalueProperty = sourceDO.getType().getProperty(SOURCE_LOGONID_PROPERTY);

    	String keyvalueStr = sourceDO.getString(keyvalueProperty);
    	System.out.println("<EJB Class>Input String is "+keyvalueStr);
    	String[] listofUsers =  keyvalueStr.split("@");
    	IUserFactory userFactory = UMFactory.getUserFactory();
    	IUser user = null;
    	for(int i=0;i<listofUsers.length;i++){
    	try {
    	user = userFactory.getUserByLogonID(listofUsers<i>);
    	listPrincipal.add(user.getUniqueID());
    	} catch (UMException e) {
    		System.err.println(e.getMessage());
    	}	
    	outputDO.setList(outputDO.getType().getProperty(NAME_PROPERTY_OUTPUT_RESULT), listPrincipal);
    	}
    	return(outputDO);
    }
    	
}

Former Member
0 Kudos

Closing the issue, it was mistake at code in extending the classes in local interface