blob: 4fe010e9c6b4075850917f64abfef5e5c598e8c3 [file] [log] [blame] [view]
# Java SDK for Apache Iggy
Official Java client SDK for [Apache Iggy](https://iggy.apache.org) message streaming.
> This is part of the Apache Iggy monorepo. For the main project, see the [root repository](https://github.com/apache/iggy).
## Installation
Add the dependency to your project:
**Gradle:**
```gradle
implementation 'org.apache.iggy:iggy:0.6.0'
```
**Maven:**
```xml
<dependency>
<groupId>org.apache.iggy</groupId>
<artifactId>iggy</artifactId>
<version>0.6.0</version>
</dependency>
```
Find the latest version on [Maven Repository](https://mvnrepository.com/artifact/org.apache.iggy/iggy).
### Snapshot Versions
Snapshot versions are also available through the ASF snapshot repository:
**Gradle:**
```gradle
repositories {
maven {
url = uri("https://repository.apache.org/content/repositories/snapshots/")
}
}
dependencies {
implementation 'org.apache.iggy:iggy:0.6.1-SNAPSHOT'
}
```
**Maven:**
```xml
<repositories>
<repository>
<id>apache-snapshots</id>
<url>https://repository.apache.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<dependency>
<groupId>org.apache.iggy</groupId>
<artifactId>iggy</artifactId>
<version>0.6.1-SNAPSHOT</version>
</dependency>
```
## Quick Start
### TCP Client (Blocking)
```java
import org.apache.iggy.Iggy;
// Create and connect with auto-login
var client = Iggy.tcpClientBuilder()
.blocking()
.host("localhost")
.port(8090)
.credentials("iggy", "iggy")
.buildAndLogin();
// Or build, connect, and login separately
var client = Iggy.tcpClientBuilder()
.blocking()
.host("localhost")
.port(8090)
.build();
client.connect();
client.users().login("iggy", "iggy");
```
### TCP Client (Async)
```java
import org.apache.iggy.Iggy;
// Create async client
var asyncClient = Iggy.tcpClientBuilder()
.async()
.host("localhost")
.port(8090)
.credentials("iggy", "iggy")
.buildAndLogin()
.join();
// Or with manual connect and login
var asyncClient = Iggy.tcpClientBuilder()
.async()
.host("localhost")
.build();
asyncClient.connect().join();
asyncClient.users().login("iggy", "iggy").join();
```
### HTTP Client
```java
import org.apache.iggy.Iggy;
// Using URL
var httpClient = Iggy.httpClientBuilder()
.blocking()
.url("http://localhost:3000")
.credentials("iggy", "iggy")
.buildAndLogin();
// Using host/port
var httpClient = Iggy.httpClientBuilder()
.blocking()
.host("localhost")
.port(3000)
.credentials("iggy", "iggy")
.buildAndLogin();
```
### TLS Support
Both TCP and HTTP clients support TLS:
```java
// TCP with TLS
var secureClient = Iggy.tcpClientBuilder()
.blocking()
.host("iggy-server.example.com")
.port(8090)
.enableTls()
.tlsCertificate("/path/to/ca.pem") // Optional custom CA
.credentials("admin", "secret")
.buildAndLogin();
// HTTPS
var secureHttpClient = Iggy.httpClientBuilder()
.blocking()
.host("iggy-server.example.com")
.port(443)
.enableTls()
.credentials("admin", "secret")
.buildAndLogin();
```
### Builder Options
The client builders support additional configuration:
```java
var client = Iggy.tcpClientBuilder()
.blocking()
.host("localhost")
.port(8090)
.connectionTimeout(Duration.ofSeconds(10))
.requestTimeout(Duration.ofSeconds(30))
.connectionPoolSize(10)
.retryPolicy(RetryPolicy.exponentialBackoff())
.credentials("iggy", "iggy")
.buildAndLogin();
```
### Version Information
```java
// Get SDK version
String version = Iggy.version(); // e.g., "0.6.1-SNAPSHOT"
// Get detailed version info
IggyVersion info = Iggy.versionInfo();
info.getVersion(); // Version string
info.getBuildTime(); // Build timestamp
info.getGitCommit(); // Git commit hash
info.getUserAgent(); // User-Agent string for HTTP
```
## Exception Handling
All exceptions thrown by the SDK inherit from `IggyException`. This allows you to catch all SDK-related errors with a single catch block, or handle specific exception types for more granular error handling.
## Examples
See the **[Java Examples](../../examples/java/)** directory for runnable applications demonstrating the SDK:
- **BlockingProducer** synchronous message production with batch sending
- **BlockingConsumer** synchronous consumption with polling loops
- **AsyncProducer** high-throughput async production with pipelining
- **AsyncConsumer** async consumption with backpressure and error recovery
Each example includes comprehensive documentation on when to use blocking vs. async clients, CompletableFuture patterns, thread pool management, and performance characteristics.
For Apache Flink integration, see the [Flink Connector Library](external-processors/iggy-connector-flink/iggy-connector-library/README.md).
## Building from Source
This project uses the Gradle Wrapper. Due to Apache Software Foundation policy, the `gradle-wrapper.jar` binary is not checked into the repository. Instead, the `gradlew` script automatically downloads it on first run.
```bash
# Build the project
./gradlew build
# Run tests
./gradlew test
```
The wrapper script will:
1. Download `gradle-wrapper.jar` from the official Gradle repository if missing
2. Verify the SHA256 checksum for security
3. Execute the requested Gradle command
No manual Gradle installation is required.
**Note:** Only the Unix shell wrapper (`gradlew`) is provided. Windows users should use WSL, Git Bash, or install Gradle manually.
## Contributing
Before opening a pull request:
1. **Format code:** `./gradlew spotlessApply`
2. **Validate build:** `./gradlew check`
This ensures code style compliance and that all tests and checkstyle validations pass.