Query for all Users in a Group via Candidates / TaskListener Email Notification for Users in Group

964 views
Skip to first unread message

Andre Zensen

unread,
Dec 11, 2015, 2:13:02 PM12/11/15
to camunda BPM users
Hi there,
I'm trying to use a TaskListener on a User Task, set to the event create, to create a query for all users in a task's candidate group, so I can send them a notification e-mail about the new task.

I first use the delegateTask.getCandidates() method to get a List<IdentityLink>. I iterate through the IdentityLinks and buffer group IDs in an array. I then iterate through the group IDs to fetch a list of users in that group with List<User> userList = identityService().createUserQuery().memberOfGroup(groupID).list();. After that, I iterate through the list to get User object which I want to query for their mail.

Getting group IDs works fine, but it doesn't seem to work after that. Looks like the list of users is always empty.

My task listener code looks like this:
import static org.camunda.bpm.engine.test.assertions.ProcessEngineTests.identityService;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

//
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.delegate.TaskListener;
import org.camunda.bpm.engine.identity.User;
import org.camunda.bpm.engine.task.IdentityLink;
public class NeueAufgabeMail implements TaskListener {

private final static Logger LOGGER = Logger.getLogger("AufgabeSendenLogger");
//

@Override
public void notify(DelegateTask delegateTask) {
// Name des Tasks //Task name
String taskName = delegateTask.getName();
LOGGER.log(Level.INFO, "Sende Benachrichtigung über neue Aufgabe für Task " + taskName + " .");
// Liste der Gruppen IDs // List of Group IDs
ArrayList<String> groupIDs = new ArrayList<String>();
// Gruppen IDs per Kandidatenliste des Tasks hinzufügen // add group IDs via candidate list of the task
for (IdentityLink link : delegateTask.getCandidates()) {
groupIDs.add(link.getGroupId());
LOGGER.log(Level.INFO, "GruppenID hinzugefügt: " + link.getGroupId());
}

if (!groupIDs.isEmpty()) {
//Userliste durch Abfrage per GroupID erstellen // create user list by querying via group ID
for (String groupID : groupIDs) {
List<User> userList = identityService().createUserQuery()
.memberOfGroup(groupID).list();
// Mail an jeden User in der Userliste // mail to each user in the group
for (User userInGroup : userList) {
LOGGER.log(Level.INFO, "Sende Benachrichtigung an " + userInGroup.getEmail());
                                        sendMail(userInGroup, taskName);
}
}
} else
{
LOGGER.log(Level.WARNING, "Keine Kandidaten-GruppenIDs für Task " + taskName + " gefunden.");
}
}

Andre Zensen

unread,
Dec 11, 2015, 2:36:55 PM12/11/15
to camunda BPM users
Hi again,

I think I've solved it.. and sent a Mail to de...@camunda.org in the process :-)

Problem was apparently the way I was getting the identityService. Instead of

List<User> userList = identityService().createUserQuery()
.memberOfGroup(groupID).list();

I used

IdentityService identityService = Context.getProcessEngineConfiguration().getIdentityService();
List<User> userList = identityService.createUserQuery()
.memberOfGroup(groupID).list();

which gives me the proper identityService!

thorben....@camunda.com

unread,
Dec 14, 2015, 3:56:51 AM12/14/15
to camunda BPM users
Hi Andre,

delegateTask.getProcessEngineServices().getIdentityService() is another way of obtaining the identity service and uses public API only.

Cheers,
Thorben
Reply all
Reply to author
Forward
0 new messages