# Queues (/sdks/java/reference/queues)



`QueuesClient` sends messages with `sendQueueMessage`, receives them through `receiveQueueMessages` (downstream gRPC stream managed internally), and offers convenience `waiting` / `pull` helpers for peek-style reads.

## Simple Queues [#simple-queues]

### sendQueueMessage [#sendqueuemessage]

```java
QueueSendResult sendQueueMessage(QueueMessage message) throws KubeMQException
```

Unary send with builder-created `QueueMessage` (channel, body, metadata, delay, expiration, DLQ, max receive count).

> **Note:** `sendQueuesMessage` is a deprecated alias (deprecated since 2.2.0, `forRemoval=true` at v3.0). Prefer `sendQueueMessage`.

**Parameters:**

| Name      | Type           | Required | Description                   |
| --------- | -------------- | -------- | ----------------------------- |
| `message` | `QueueMessage` | Yes      | Fully populated queue payload |

**Returns:** `QueueSendResult` — server IDs and status flags.

### receiveQueueMessages [#receivequeuemessages]

```java
QueuesPollResponse receiveQueueMessages(QueuesPollRequest request) throws KubeMQException
```

Receives batches via the downstream stream. Each `QueueMessageReceived` exposes ack/reject/requeue unless `autoAck` is enabled on the poll request.

**Parameters:**

| Name      | Type                | Required | Description                                       |
| --------- | ------------------- | -------- | ------------------------------------------------- |
| `request` | `QueuesPollRequest` | Yes      | Channel, max messages, wait, visibility, auto-ack |

**QueuesPollRequest fields:**

| Field                      | Description             |
| -------------------------- | ----------------------- |
| `channel`                  | Queue channel name      |
| `pollMaxMessages`          | Max messages to receive |
| `pollWaitTimeoutInSeconds` | Long poll wait          |
| `visibilitySeconds`        | Processing lease        |
| `autoAckMessages`          | Acknowledge on delivery |

### waiting / pull [#waiting--pull]

```java
QueueMessagesWaiting waiting(String channel, int maxMessages, int waitTimeoutInSeconds)
QueueMessagesPulled pull(String channel, int maxMessages, int waitTimeoutInSeconds)
```

Peek (`waiting`) or destructive pull (`pull`) helpers built on unary receive RPCs.

## Queue Streaming [#queue-streaming]

Internally the SDK multiplexes `QueueUpstreamHandler` for batched sends and `QueueDownstreamHandler` for long-lived receive streams. Application code typically calls the high-level methods above; advanced scenarios can rely on async variants (`sendQueuesMessageAsync`, `receiveQueuesMessagesAsync`, `waitingAsync`, `pullAsync`).

## QueueMessage builder highlights [#queuemessage-builder-highlights]

| Method                                | Description   |
| ------------------------------------- | ------------- |
| `.channel(String)`                    | Target queue  |
| `.body(byte[])`                       | Payload       |
| `.delayInSeconds(int)`                | Initial delay |
| `.expirationInSeconds(int)`           | TTL           |
| `.attemptsBeforeDeadLetterQueue(int)` | Retry budget  |
| `.deadLetterQueue(String)`            | DLQ routing   |

## Quick Usage [#quick-usage]

```java title="Queues.java"
QueueMessage msg = QueueMessage.builder()
    .channel("jobs")
    .body(payload)
    .build();

queues.sendQueueMessage(msg);
```

## See Also [#see-also]

* [Queues Examples](/sdks/java/how-to/queues/)
* [Queues pattern](/learn/queues/getting-started)
* [Java SDK Getting Started](/sdks/java)
