Add exampleSite
This commit is contained in:
parent
7a6ab6d724
commit
5b7db23aaa
9 changed files with 286 additions and 18 deletions
18
exampleSite/config.yml
Normal file
18
exampleSite/config.yml
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
baseURL: http://example.org
|
||||||
|
title: Rx Jersey
|
||||||
|
theme: book
|
||||||
|
|
||||||
|
# Book configuration
|
||||||
|
disablePathToLower: true
|
||||||
|
|
||||||
|
params:
|
||||||
|
# show or hide table of contents for page
|
||||||
|
BookShowToC: true
|
||||||
|
|
||||||
|
# Set bundle to render side menu
|
||||||
|
# if not specified file structure and weights will be used
|
||||||
|
BookMenuBundle: /menu
|
||||||
|
|
||||||
|
# specify section of content to render as menu
|
||||||
|
# if bookMenuBundle is not set, 'docs' is value by default
|
||||||
|
BookSection: docs
|
77
exampleSite/content/_index.md
Normal file
77
exampleSite/content/_index.md
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
---
|
||||||
|
title: Introduction
|
||||||
|
type: docs
|
||||||
|
---
|
||||||
|
|
||||||
|
# RxJersey - Reactive Jersey Feature
|
||||||
|
|
||||||
|
[![Build Status](https://travis-ci.org/alex-shpak/rx-jersey.svg?branch=master)](https://travis-ci.org/alex-shpak/rx-jersey)
|
||||||
|
![Maven Central](https://img.shields.io/maven-central/v/net.winterly.rxjersey/core-server.svg)
|
||||||
|
|
||||||
|
RxJersey is RxJava extension for [Jersey](https://jersey.java.net/) framework providing non-blocking Jax-RS server and client.
|
||||||
|
RxJersey target is to handle large amount requests in small static set of threads, which is highly suitable for microservice applications.
|
||||||
|
|
||||||
|
Library uses Jersey 2 async support with `@Suspended` and `AsyncResponse` under the hood.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
- [x] RxJava Support
|
||||||
|
- [x] RxJava 2 Support
|
||||||
|
- [x] RxJava Proxy Client
|
||||||
|
- [x] Async Request Interceptors
|
||||||
|
- [x] Dropwizard bundle
|
||||||
|
|
||||||
|
## Roadmap
|
||||||
|
- [ ] Futures support
|
||||||
|
- [ ] Vert.x integration
|
||||||
|
- [ ] Improved proxy client
|
||||||
|
|
||||||
|
|
||||||
|
## Maven Artifacts
|
||||||
|
### Maven Central
|
||||||
|
```
|
||||||
|
compile "net.winterly.rxjersey:dropwizard:$rxJerseyVersion"
|
||||||
|
compile "net.winterly.rxjersey:rxjava-client:$rxJerseyVersion"
|
||||||
|
compile "net.winterly.rxjersey:rxjava-server:$rxJerseyVersion"
|
||||||
|
compile "net.winterly.rxjersey:rxjava2-client:$rxJerseyVersion"
|
||||||
|
compile "net.winterly.rxjersey:rxjava2-server:$rxJerseyVersion"
|
||||||
|
```
|
||||||
|
|
||||||
|
### JitPack
|
||||||
|
Most recent snapshot is available via [JitPack](https://jitpack.io/#alex-shpak/rx-jersey/)
|
||||||
|
```
|
||||||
|
compile "com.github.alex-shpak.rx-jersey:dropwizard:$rxJerseyVersion"
|
||||||
|
compile "com.github.alex-shpak.rx-jersey:rxjava-client:$rxJerseyVersion"
|
||||||
|
compile "com.github.alex-shpak.rx-jersey:rxjava-server:$rxJerseyVersion"
|
||||||
|
compile "com.github.alex-shpak.rx-jersey:rxjava2-client:$rxJerseyVersion"
|
||||||
|
compile "com.github.alex-shpak.rx-jersey:rxjava2-server:$rxJerseyVersion"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Example
|
||||||
|
```java
|
||||||
|
@Path("/example/")
|
||||||
|
public class GithubResource {
|
||||||
|
|
||||||
|
@Remote("https://api.github.com/")
|
||||||
|
private GithubApi githubApi;
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("github")
|
||||||
|
public Single<GithubRepository> getRepository() {
|
||||||
|
return githubApi.getRepository("alex-shpak", "rx-jersey").toSingle();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Path("/")
|
||||||
|
public interface GithubApi {
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("/repos/{user}/{repo}")
|
||||||
|
Observable<GithubRepository> getRepository(@PathParam("user") String username, @PathParam("repo") String repo);
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
[MIT](LICENCE.txt)
|
35
exampleSite/content/docs/dropwizard-configuration.md
Normal file
35
exampleSite/content/docs/dropwizard-configuration.md
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
## Dropwizard configuration
|
||||||
|
|
||||||
|
Use provided `RxJerseyBundle`
|
||||||
|
```java
|
||||||
|
@Override
|
||||||
|
public void initialize(Bootstrap<RxJerseyConfiguration> bootstrap) {
|
||||||
|
bootstrap.addBundle(new RxJerseyBundle<RxJerseyConfiguration>()
|
||||||
|
.setClientConfigurationProvider(config -> config.client)
|
||||||
|
.register(HeaderInterceptor.class)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively you can directly configure and register Jersey feature
|
||||||
|
```java
|
||||||
|
public void run(RxJerseyConfiguration configuration, Environment environment) throws Exception {
|
||||||
|
JerseyEnvironment jersey = environment.jersey();
|
||||||
|
|
||||||
|
Client client = new JerseyClientBuilder(environment)
|
||||||
|
.using(configuration.client)
|
||||||
|
.using(new GrizzlyConnectorProvider())
|
||||||
|
.buildRx("Client", RxObservableInvoker.class);
|
||||||
|
|
||||||
|
RxJerseyServerFeature rxJerseyServerFeature = new RxJerseyServerFeature()
|
||||||
|
.register(HeaderInterceptor.class);
|
||||||
|
|
||||||
|
RxJerseyClientFeature rxJerseyClientFeature = new RxJerseyClientFeature()
|
||||||
|
.register(client);
|
||||||
|
|
||||||
|
jersey.register(rxJerseyServerFeature);
|
||||||
|
jersey.register(rxJerseyClientFeature);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### [See example](https://github.com/alex-shpak/rx-jersey/tree/master/example) for more information
|
20
exampleSite/content/docs/jersey-configuration.md
Normal file
20
exampleSite/content/docs/jersey-configuration.md
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
## Jersey configuration
|
||||||
|
### Simple configuration
|
||||||
|
This will assume default configuration with no interceptor and Grizzly client
|
||||||
|
```java
|
||||||
|
resourceConfig.register(RxJerseyServerFeature.class);
|
||||||
|
resourceConfig.register(RxJerseyClientFeature.class);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Detailed configuration
|
||||||
|
This configuration will add async request interceptor and override default client
|
||||||
|
```java
|
||||||
|
RxJerseyServerFeature rxJerseyServerFeature = new RxJerseyServerFeature()
|
||||||
|
.register(AuthRequestInterceptor.class);
|
||||||
|
|
||||||
|
RxJerseyClientFeature rxJerseyClientFeature = new RxJerseyClientFeature()
|
||||||
|
.register(client); // Should be non-blocking client implementation
|
||||||
|
|
||||||
|
resourceConfig.register(rxJerseyServerFeature);
|
||||||
|
resourceConfig.register(rxJerseyClientFeature);
|
||||||
|
```
|
60
exampleSite/content/docs/rx-jersey-client.md
Normal file
60
exampleSite/content/docs/rx-jersey-client.md
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
## RxJersey Proxy Client
|
||||||
|
|
||||||
|
Proxy client provides convenient way to call resources without constructing request. Also it allows to reuse resource interfaces between microservices.
|
||||||
|
|
||||||
|
In order to enable RxJava in proxy client register Jersey feature
|
||||||
|
```java
|
||||||
|
RxJerseyClientFeature rxJerseyClientFeature = new RxJerseyClientFeature()
|
||||||
|
.register(client); //should be non-blocking client implementation
|
||||||
|
resourceConfig.register(rxJerseyClientFeature);
|
||||||
|
```
|
||||||
|
Default client with Grizzly connector will be used if not provided
|
||||||
|
|
||||||
|
|
||||||
|
## Remote resource injection
|
||||||
|
You can inject proxy client with `@Remote` annotation, in addition you can inject `WebTarget` or `RxWebTarget`
|
||||||
|
```java
|
||||||
|
@Path("/example/")
|
||||||
|
public class GithubResource {
|
||||||
|
|
||||||
|
@Remote("https://api.github.com/")
|
||||||
|
private GithubApi githubApi;
|
||||||
|
|
||||||
|
@Remote("https://api.github.com/")
|
||||||
|
private WebTarget webTarget;
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("github")
|
||||||
|
public Single<GithubRepository> getRepository() {
|
||||||
|
return githubApi.getRepository("alex-shpak", "rx-jersey").toSingle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Manual proxy client creation
|
||||||
|
You can use `WebResourceFactory` from `net.winterly.rxjersey.client` package in order to create proxy client
|
||||||
|
|
||||||
|
#### RxJava
|
||||||
|
```java
|
||||||
|
WebResourceFactory.newResource(
|
||||||
|
ResourceInterface.class,
|
||||||
|
rxWebTarget,
|
||||||
|
new ObservableClientMethodInvoker()
|
||||||
|
);
|
||||||
|
```
|
||||||
|
#### RxJava 2
|
||||||
|
```java
|
||||||
|
WebResourceFactory.newResource(
|
||||||
|
ResourceInterface.class,
|
||||||
|
webTarget,
|
||||||
|
new FlowableClientMethodInvoker()
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Url resolving
|
||||||
|
Below is example of URL merging based on `@Remote` annotation value
|
||||||
|
|
||||||
|
| Annotation Value | Jersey Context Path | Result URL |
|
||||||
|
| ----------------------------- | --------------------------- | ---------------------------- |
|
||||||
|
| @Remote("http://example.com") | http://baseurl.com/resource | http://example.com/ |
|
||||||
|
| @Remote("/resource/") | http://baseurl.com/some | http://baseurl.com/resource/ |
|
64
exampleSite/content/docs/rx-jersey-server.md
Normal file
64
exampleSite/content/docs/rx-jersey-server.md
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
## Jersey Server
|
||||||
|
Register `RxJerseyServerFeature` in `resourceConfig`
|
||||||
|
```java
|
||||||
|
resourceConfig.register(RxJerseyServerFeature.class);
|
||||||
|
```
|
||||||
|
Or with configuration
|
||||||
|
```java
|
||||||
|
RxJerseyServerFeature rxJerseyServerFeature = new RxJerseyServerFeature()
|
||||||
|
.register(AuthInterceptor.class);
|
||||||
|
|
||||||
|
resourceConfig.register(rxJerseyServerFeature);
|
||||||
|
```
|
||||||
|
|
||||||
|
Update your resource adding rx return type:
|
||||||
|
```java
|
||||||
|
@Path("/")
|
||||||
|
public class HelloResource {
|
||||||
|
|
||||||
|
@GET
|
||||||
|
public Single<HelloEntity> getAsync() {
|
||||||
|
return Single.just(new HelloEntity());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static class HelloEntity {
|
||||||
|
public String hello = "world";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Inteceptor
|
||||||
|
You can use RxJava enabled interceptors. Result of such interceptor will be ignored. Thrown or returned error would be redirected to jersey.
|
||||||
|
|
||||||
|
#### RxJava
|
||||||
|
```java
|
||||||
|
public class SimpleInterceptor implements ObservableRequestInterceptor<Void> {
|
||||||
|
public Observable<Void> intercept(ContainerRequestContext requestContext) {
|
||||||
|
return Observable.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### RxJava 2
|
||||||
|
```java
|
||||||
|
public class SimpleInterceptor implements CompletableRequestInterceptor {
|
||||||
|
public Completable intercept(ContainerRequestContext requestContext) {
|
||||||
|
return Observable.complete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Important notes
|
||||||
|
#### RxJava
|
||||||
|
- It's recommended to use `rx.Single` as return type (Representing single response entity).
|
||||||
|
- Multiple elements emitted in `Observable` will be treated as error.
|
||||||
|
- Empty `Observable` or `null` value in `Observable` or `Single` will be treated as `204: No content`.
|
||||||
|
- `Completable` will be executed and `204: No content` will be returned.
|
||||||
|
|
||||||
|
#### RxJava 2
|
||||||
|
- It's recommended to use `io.reactivex.Maybe` which could be 0 or 1 item or an error.
|
||||||
|
- Multiple elements emitted in `Observable` or `Flowable` will be treated as error.
|
||||||
|
- Empty `Observable`/`Maybe` will be treated as `204: No content`.
|
||||||
|
- `Completable` will be executed and `204: No content` will be returned.
|
12
exampleSite/content/menu/index.md
Normal file
12
exampleSite/content/menu/index.md
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
---
|
||||||
|
headless: true
|
||||||
|
---
|
||||||
|
|
||||||
|
- [**Introduction**](/)
|
||||||
|
- [Configuration](/docs/jersey-configuration)
|
||||||
|
- [Jersey configuration](/docs/jersey-configuration)
|
||||||
|
- [Dropwizard configuration](/docs/dropwizard-configuration)
|
||||||
|
- **Usage**
|
||||||
|
- [Server](/docs/rx-jersey-server)
|
||||||
|
- [Client](/docs/rx-jersey-client)
|
||||||
|
- Vert.x Integration
|
7
static/css/grids-responsive-min.css
vendored
7
static/css/grids-responsive-min.css
vendored
File diff suppressed because one or more lines are too long
11
static/css/pure-min.css
vendored
11
static/css/pure-min.css
vendored
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue