如何在Spring Boot中实现Camunda SendTask?新手技术求助
Hey there! Let's walk through how to implement a solid Send Task in Camunda that hooks into your business logic and services—since you already have an ExecutionListener set up, we can build right on that foundation.
First, let's clarify: Camunda's Send Task is designed to trigger outbound communications (emails, SMS, internal notifications, etc.), so your implementation will revolve around what to send, who to send it to, and how to send it using your existing services.
Option 1: Extend Your Existing ExecutionListener
Since you’ve already created an ExecutionListener, this is the quickest path to integrate your business logic. Here’s how to expand it:
Step 1: Inject Your Business Service into the Listener
First, make your listener class aware of your notification/service class (e.g., an email service, internal alert service). If you’re using Spring, use dependency injection; for plain Java, initialize the service via constructor/setter.
Example code:
public class SendTaskExecutionListener implements ExecutionListener { // Inject your business service (Spring: use @Autowired; plain Java: pass via constructor) private NotificationService notificationService; public SendTaskExecutionListener(NotificationService notificationService) { this.notificationService = notificationService; } @Override public void notify(DelegateExecution execution) throws Exception { // 1. Pull necessary variables from the process (from Business Rule Task/Gateway) String recipientEmail = (String) execution.getVariable("approvedUserEmail"); String ruleDecision = (String) execution.getVariable("businessRuleResult"); String processInstanceId = execution.getProcessInstanceId(); // 2. Build your business-specific message content String messageSubject = "New Process Task Alert"; String messageBody = String.format( "Hi there,\n\nYour business rule decision was: %s.\nA User Task is waiting for you in process ID: %s.\n\nThanks,\nCamunda Process Engine", ruleDecision, processInstanceId ); // 3. Execute your business send logic try { notificationService.sendEmail(recipientEmail, messageSubject, messageBody); // Mark success in process variables (for gateway branching if needed) execution.setVariable("sendTaskStatus", "SUCCESS"); } catch (ServiceException e) { // Handle failures: set error variable and throw BpmnError for gateway exception paths execution.setVariable("sendTaskStatus", "FAILED"); throw new BpmnError("SEND_FAILURE", "Failed to send notification: " + e.getMessage()); } } }
Step 2: Configure the Listener in Camunda Modeler
- Select your Send Task in the modeler
- Go to the Listeners tab
- Add a new Execution Listener:
- Choose the event type:
start(run when the Send Task begins) orend(run when the task completes) - In the Java Class field, enter the full qualified name of your
SendTaskExecutionListener
- Choose the event type:
- If using Spring, annotate your listener with
@Componentso Spring manages it and injects theNotificationServiceautomatically.
Option 2: Use a Java Delegate (More Flexible for Complex Logic)
If your send logic is complex or you want the Send Task to act as a dedicated service node, use a JavaDelegate instead. This is often preferred for reusable, modular logic.
Step 1: Create the Delegate Class
@Component // Spring-managed bean public class SendNotificationDelegate implements JavaDelegate { @Autowired private NotificationService notificationService; @Override public void execute(DelegateExecution execution) throws Exception { // Same variable retrieval and message building as above String recipient = (String) execution.getVariable("userContact"); String decision = (String) execution.getVariable("ruleOutcome"); String message = String.format( "Alert: Business rule result is '%s'. Please complete the upcoming User Task.", decision ); // Call your service notificationService.sendSms(recipient, message); execution.setVariable("notificationSent", true); } }
Step 2: Configure the Send Task in Modeler
- Select the Send Task
- Go to the Main Config tab
- Set the task type to:
- Java Class: Enter the full class name of
SendNotificationDelegate - OR Delegate Expression: Use
${sendNotificationDelegate}(works if the bean is Spring-managed)
- Java Class: Enter the full class name of
Key Best Practices
- Variable Management: Use Camunda’s Input/Output mappings (in the Send Task’s Input/Output tab) to explicitly define which variables are passed into the task—this makes your process more readable and avoids unexpected variable issues.
- Error Handling: Always handle service failures (e.g., down email servers). Use
BpmnErrorto trigger exception paths in your gateway, or set retry configurations in Camunda to automatically retry failed Send Tasks. - Testing: Use Camunda’s Tasklist or REST API to trigger test processes. Check process variables (via Cockpit) to verify if the send task succeeded, and confirm your notification service actually delivered the message.
- Service Integration: Ensure your business services (email, SMS, etc.) are accessible from Camunda’s runtime environment. For Spring Boot, this is straightforward with dependency injection; for standalone Camunda, register your service beans in Camunda’s configuration.
内容的提问来源于stack exchange,提问作者Soumik Das

