Skip to content

Outbox message should be in the CloudEvent format #1580

@mcruzdev

Description

@mcruzdev

Context

Using the Outbox API:

public Response createWithOutbox(OrderRequest request) {
        Log.info("Receiving request for creating an Order: " + request);

        String uuid = UUID.randomUUID().toString();

        Order order = new Order(uuid,
                request.items().stream().map(i -> new Order.OrderItem(i.id(), i.name(), i.price())).toList());

        /* outbox.yaml: metadata.name */
        ExecuteStateTransactionRequest transactionRequest = new ExecuteStateTransactionRequest("postgres-outbox");

        List<TransactionalStateOperation<?>> ops = new ArrayList<>();

        Map<String, String> metadata = new HashMap<>();
        metadata.put("datacontenttype", "application/json");

        State<Order> state = new State<>(order.id(), order, null, metadata, new StateOptions(Consistency.STRONG, Concurrency.FIRST_WRITE));

        TransactionalStateOperation<Order> upsertOps = new TransactionalStateOperation<>(
                TransactionalStateOperation.OperationType.UPSERT, state);

        ops.add(upsertOps);

        transactionRequest.setOperations(ops);

        dapr.executeStateTransaction(transactionRequest).block();

        Log.info("Event (order.created) sent to 'rabbitmq' and order saved to the database using Outbox pattern");

        return Response
                .ok(new OrderResponse(order.id(), order.status(), order.items().stream()
                        .map(item -> new OrderRequest.OrderItemRequest(item.id(), item.name(), item.price())).toList()))
                .build();
    }

I am facing a wrong behavior, which is not the same as documented here https://docs.dapr.io/developing-applications/building-blocks/pubsub/pubsub-cloudevents/#dapr-generated-cloudevents-example

Actual behavior

{"data":"{\"id\":\"dd1f1122-cb3a-4dc4-8ab6-e16ff6599a61\",\"status\":\"RECEIVED\",\"items\":[{\"id\":1,\"name\":\"Quarkus Stickers\",\"price\":19.99}]}","datacontenttype":"text/plain","id":"outbox-06af412d-e21b-4151-8f25-9c6c7273a95c","pubsubname":"rabbitmq","source":"orders-api","specversion":"1.0","time":"2025-10-22T18:40:26Z","topic":"order.created","traceid":"00-dc2464c8d9432109a3d1f13469aa739a-ed59c9a3d2829220-01","traceparent":"","tracestate":"","type":"com.dapr.event.sent"}

Expected behavior

{"data": { "id": "dd1f1122-cb3a-4dc4-8ab6-e16ff6599a61","status":"RECEIVED","items":[{"id":1,"name":"Quarkus Stickers","price":19.99}]}","datacontenttype":"application/json","id":"outbox-06af412d-e21b-4151-8f25-9c6c7273a95c","pubsubname":"rabbitmq","source":"orders-api","specversion":"1.0","time":"2025-10-22T18:40:26Z","topic":"order.created","traceid":"00-dc2464c8d9432109a3d1f13469aa739a-ed59c9a3d2829220-01","traceparent":"","tracestate":"","type":"com.dapr.event.sent"}

The data field is coming as string not a object, I tried to use cloudevent.datacontentype but without success too.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions