tree 88cf13b4e6402c3172aa1212fa7121d3fdc8a94b
parent b9e96098062b5968a7de24e44644688dff66d474
author Jia Zhai <zhaijia@apache.org> 1588907049 +0800
committer GitHub <noreply@github.com> 1588907049 +0800
gpgsig -----BEGIN PGP SIGNATURE-----
 
 wsBcBAABCAAQBQJetMwpCRBK7hj4Ov3rIwAAdHIIAG3BusIz8kLSXDSNvufBOnxN
 GvgbDpjkIowIyyjgc70KxYz7aXGfulT0JyKzkzMzF7jASgLXq4UxATj2qdtiCZ+q
 ldBqNYl2Xj9A66UgEzhTsQsB2e/gHgxGhE4JZzEgG/AqiJMXMTCzEo/R/OqhB1W+
 ffaPrX0Rm2dXw2YC1VHiV9JVO1VkLpy++vkYFHQkGfTt+LXKzgUDQbJn5u7bvkfY
 hAyD0E0pF2/+j3dIXLLeZi5MXSYzc3GarnlMkHjtBtC5AHGcE+acr08IdyCesGs+
 IkGblyUOsx9VmijaBb7/pTsM5Jc/MGC+qvkOaB3IAfSs1qrRZaKyUei1MHyXOAM=
 =UIwK
 -----END PGP SIGNATURE-----
 

Support function with format: Function<I, CompletableFuture<O>> (#6684)

Fixes #6519

### Motivation

Currently, Pulsar Functions not support Async mode, e.g. user passed in a Function in format :
```
Function<I, CompletableFuture<O>>
```
This kind of function is useful if the function might use RPCs to call external systems.

e.g.
```java
public class AsyncFunction implements Function<String, CompletableFuture<O>> {
    CompletableFuture<O> apply (String input) {
        CompletableFuture future = new CompletableFuture();
        ...function compute...
        future.whenComplete(() -> {
            ...  call external system  ...
        });
        return future;
    }
```

### Modifications
- add support for Async Functions support.

### Verifying this change
current ut passed.



* support func: Function<I, CompletableFuture<O>>

* add 2 examples

* add limit to the max outstanding items