Skip to content

Java SSE Client

Akram El Assas edited this page Jul 19, 2025 · 4 revisions

Prerequisites

Client SSE Sample

Here is a sample Java SSE client WexflowSSEClient.java:

package com.example;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;

import okhttp3.*;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;
import okhttp3.sse.EventSources;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;

public class WorkflowSSEClient {

    private static final String BASE_URL = "http://localhost:8000/api/v1";
    private static final String USERNAME = "admin";
    private static final String PASSWORD = "wexflow2018";
    private static final int WORKFLOW_ID = 41;

    private static final HttpClient httpClient = HttpClient.newHttpClient();
    private static final ObjectMapper objectMapper = new ObjectMapper();

    public static void main(String[] args) throws Exception {
        String token = login(USERNAME, PASSWORD);
        String jobId = startWorkflow(token, WORKFLOW_ID);

        System.out.printf("Workflow %d started. Job ID: %s%n", WORKFLOW_ID, jobId);

        String sseUrl = String.format("%s/sse/%d/%s", BASE_URL, WORKFLOW_ID, jobId);
        listenToSse(sseUrl, token);
    }

    private static String login(String user, String pass) throws IOException, InterruptedException {
        String jsonBody = String.format(
            "{\"username\":\"%s\", \"password\":\"%s\", \"stayConnected\": false}", user, pass);

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "/login"))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
            .timeout(Duration.ofSeconds(10))
            .build();

        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
            throw new RuntimeException("Login failed: HTTP " + response.statusCode());
        }

        JsonNode jsonNode = objectMapper.readTree(response.body());
        return jsonNode.get("access_token").asText();
    }

    private static String startWorkflow(String token, int workflowId) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(BASE_URL + "/start?w=" + workflowId))
            .header("Authorization", "Bearer " + token)
            .POST(HttpRequest.BodyPublishers.noBody())
            .timeout(Duration.ofSeconds(10))
            .build();

        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
            throw new RuntimeException("Start workflow failed: HTTP " + response.statusCode());
        }

        // The start endpoint returns the jobId as JSON string, e.g. "jobid-uuid-string"
        return objectMapper.readTree(response.body()).asText();
    }

    private static void listenToSse(String sseUrl, String token) {
        OkHttpClient client = new OkHttpClient.Builder()
            .retryOnConnectionFailure(true)
            .build();

        Request request = new Request.Builder()
            .url(sseUrl)
            .addHeader("Authorization", "Bearer " + token)
            .build();

        EventSourceListener listener = new EventSourceListener() {
            @Override
            public void onOpen(EventSource eventSource, Response response) {
                System.out.println("SSE connection opened");
            }

            @Override
            public void onEvent(EventSource eventSource, String id, String type, String data) {
                System.out.println("Received event:");
                System.out.println("Type: " + type);
                System.out.println("Data: " + data);

                try {
                    JsonNode json = objectMapper.readTree(data);
                    System.out.println("Parsed JSON:");
                    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(json));
                } catch (Exception e) {
                    System.err.println("Failed to parse SSE JSON: " + e.getMessage());
                }

                // Close connection if you want after first event:
                eventSource.cancel();
            }

            @Override
            public void onClosed(EventSource eventSource) {
                System.out.println("SSE connection closed");
            }

            @Override
            public void onFailure(EventSource eventSource, Throwable t, Response response) {
                System.err.println("SSE connection error: " + t.getMessage());
                if (response != null) {
                    System.err.println("Response code: " + response.code());
                }
            }
        };

        EventSource.Factory factory = EventSources.createFactory(client);
        factory.newEventSource(request, listener);

        // Prevent JVM from exiting immediately to keep SSE alive:
        try {
            Thread.sleep(10 * 60 * 1000);  // 10 minutes; adjust as needed
        } catch (InterruptedException ignored) {}
    }
}

To run the client, download samples/clients/sse/java example from GitHub and run the following commands:

cd java
mvn clean package
mvn clean compile
mvn exec:java -X
  1. Installing
    1. Windows (.NET 4.8 - Legacy)
      1. Installation Instructions
    2. Windows (.NET 9.0+ - Stable)
      1. Accessing the Admin Panel
      2. Configuration
      3. Running Wexflow as a Windows Service using NSSM
      4. Deleting the Wexflow Windows Service
    3. Linux (.NET 9.0+ - Stable)
      1. Installing the Admin Panel on NGINX
      2. Installing the Admin Panel on Apache2
      3. MongoDB Configuration
      4. Updating Wexflow
    4. macOS (.NET 9.0+ - Stable)
    5. Installing the Admin Panel on a Web Server
      1. .NET 4.8 - Legacy
      2. .NET 9.0+ - Stable
  2. HTTPS/SSL
  3. Screenshots
  4. Docker
  5. Configuration
    1. Wexflow Server
    2. Wexflow.xml
    3. Admin Panel
    4. Authentication
  6. Persistence Providers
  7. Getting Started
  8. Android App
  9. Local Variables
  10. Global Variables
  11. REST Variables
  12. Functions
  13. Cron Scheduling
  14. Command Line Interface (CLI)
  15. REST API Reference
    1. Introduction
    2. JWT Authentication
    3. Sample Clients
      1. C# Client
      2. JavaScript Client
      3. PHP Client
      4. Python Client
      5. Go Client
      6. Rust Client
      7. Ruby Client
      8. Java Client
      9. C++ Client
    4. Security Considerations
    5. Swagger
    6. Workflow Notifications via SSE
      1. C# SSE Client
      2. JavaScript SSE Client
      3. PHP SSE Client
      4. Python SSE Client
      5. Go SSE Client
      6. Rust SSE Client
      7. Ruby SSE Client
      8. Java SSE Client
      9. C++ SSE Client
    7. Endpoints
  16. Samples
    1. Sequential workflows
    2. Execution graph
    3. Flowchart workflows
      1. If
      2. While
      3. Switch
    4. Approval workflows
      1. Simple approval workflow
      2. OnRejected workflow event
      3. YouTube approval workflow
      4. Form submission approval workflow
    5. Workflow events
  17. Logging
  18. Custom Tasks
    1. Introduction
    2. General
      1. Creating a Custom Task
      2. Wexflow Task Class Example
      3. Task Status
      4. Settings
      5. Loading Files
      6. Loading Entities
      7. Need A Starting Point?
    3. Installing Your Custom Task in Wexflow
      1. .NET Framework 4.8 (Legacy Version)
      2. .NET 8.0+ (Stable Version)
      3. Referenced Assemblies
      4. Updating a Custom Task
      5. Using Your Custom Task
    4. Suspend/Resume
    5. Logging
    6. Files
    7. Entities
    8. Shared Memory
    9. Designer Integration
      1. Registering the Task
      2. Adding Settings
  19. Debugging
  20. Built-in Tasks
    1. File system tasks
    2. Encryption tasks
    3. Compression tasks
    4. Iso tasks
    5. Speech tasks
    6. Hashing tasks
    7. Process tasks
    8. Network tasks
    9. XML tasks
    10. SQL tasks
    11. WMI tasks
    12. Image tasks
    13. Audio and video tasks
    14. Email tasks
    15. Workflow tasks
    16. Social media tasks
    17. Waitable tasks
    18. Reporting tasks
    19. Web tasks
    20. Script tasks
    21. JSON and YAML tasks
    22. Entities tasks
    23. Flowchart tasks
    24. Approval tasks
    25. Notification tasks
    26. SMS tasks
  21. Run from Source
Clone this wiki locally