Vertx-eventbus-python

From BITPlan Wiki
Jump to: navigation, search

logo-sm.png

Click here to comment see Vertx-eventbus-python

OsProject

OsProject
edit
id  vertx-eventbus-python
owner  rc-dukes
title  Python vertx eventbus bridge
url  https://github.com/rc-dukes/vertx-eventbus-python
version  3.8.5
date  2020/01/30

Content

Usage


The message type can be the following for messages sent by the TCP client:

  1. send to send a message to an address,
  2. publish to publish a message to an address,
  3. register to subscribe to the messages sent or published to an address,
  4. unregister to unsubscribe to the messages sent or published to an address,
  5. ping to send a ping request to the bridge.

Example

For the Unit tests and as an Example Vertx-eventbus-python ships with some Java code that provides an environment to try out the python API.

Usage

java/run -h
 -h (--help)         : show this usage (default: true)
 -i (--inbound) VAL  : inbound permission regex to be used (default: echo.*)
 -o (--outbound) VAL : outbound permission regex to be used (default: echo.*)
 -p (--port) N       : port to listen for eventbus messages (default: 7001)

EchoVerticle

To test things out a Java "EchoVerticle" is deployed. This verticle will accept messages in Json-Format at the address "echo". By default it will accept the message and reply to it. If the JsonObject represent an EchoCommand it will react as instructed by the command.

Below you'll find an explanation graphiz graph. The nodes are clickable and link to the source code. The black lines show eventbus messages. The blue lines show the bridged messages e.g. a reply message or "..." for any other message type.

Python ClientJava vert.x tcp Eventbus BridgeJava EchoVerticleThis is a graph with borders and nodes that may contain hyperlinks.

EchoCommand time

Java

This is a Junit test that tries the EchoVerticle with the command "time"

@Test 
  public void testSendCmd() throws InterruptedException {
    EchoCommand cmd=new EchoCommand("time","send","me");
    
    Object[] ro= {null};
    // listen to any message for the address me
    eb.consumer("me", rmsg->{
      ro[0]=rmsg.body();
    });
    eb.send("echo", cmd.asJsonObject());
    Thread.sleep(500);
    Object o=ro[0];
    assertNotNull(o);
    assertTrue(o instanceof JsonObject);
    JsonObject jo=(JsonObject)o;
    assertTrue(jo.containsKey("received_nanotime"));
    assertTrue(jo.containsKey("iso_time"));
  }

Expected result like:

EchoVerticle deployed after 4,2 secs
Echo Verticle received:
{"cmd":"time","msgType":"send","address":"me"}
headers:

 will reply it back now with received_time timestamp 73828431136823...
{"cmd":"time","msgType":"send","address":"me","received_nanotime":73828431136823,"iso_time":"2020-02-02 15:36:00.345"}

Python

This is Python-unit test that tries the EchoVerticle with the command "time"

def test_send(self):
        """ test sending a message"""
        eb = Eventbus(port=7001,debug=self.debug)
        handler=Handler(self.debug)
        address="echoMe"
        eb.registerHandler(address, handler.handle) 
        cmd=EchoCommand("time","send",address)   
        eb.wait(State.OPEN)
        eb.send('echo',cmd)
        # wait for the message to arrive
        time.sleep(RECEIVE_WAIT)
        eb.close()  
        assert 'received_nanotime' in handler.result
        assert 'iso_time' in handler.result

Expected result (with debug info) like:

starting receiving thread
sending 70 bytes '{"type": "register", "address": "echoMe", "headers": {}, "body": null}'

trying to receive a message in state OPEN
wait for OPEN successful after 0.000 secs
sending 115 bytes '{"type": "send", "address": "echo", "headers": {}, "body": {"cmd": "time", "msgType": "send", "address": "echoMe"}}'
trying to receive 192 bytes in state OPEN
192 message bytes with payload {'type': 'message', 'address': 'echoMe', 'headers': {}, 'body': {'cmd': 'time', 'msgType': 'send', 'address': 'echoMe', 'received_nanotime': 78069691493750, 'iso_time': '2020-02-02 16:46:41.462'}, 'send': True}
handler received {'cmd': 'time', 'msgType': 'send', 'address': 'echoMe', 'received_nanotime': 78069691493750, 'iso_time': '2020-02-02 16:46:41.462'}
trying to receive a message in state OPEN
timed out
trying to receive a message in state OPEN
timed out
trying to receive a message in state OPEN
timed out
receiving thread finished in state CLOSING
wait for CLOSED successful after 0.020 secs
----------------------------------------------------------------------
Ran 1 test in 0.325s

Installation

From PyPi

From Git

git clone https://github.com/rc-dukes/vertx-eventbus-python
cd vertx-eventbus-python

Java

cd java
mvn clean install -D gpg.skip
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  27.125 s
...

Python

cd python
sudo -H pip install .

Test

Java

./test --java

...
Results :

Tests run: 4, Failures: 0, Errors: 0, Skipped: 0

Python

For the python tests to be successful you might want to start the echoVerticle manually first with

java/run
... Initializing cluster partition table arrangement...

and then start the python unit tests in a separate terminal window with

./test --python
...
Ran 14 tests in 1.663s

OK
python unit tests successful!

Integration

The integration test will do the testing steps

  1. java tests
  2. start echoVerticle
  3. python tests

automatically in sequence

./test --all

Help / Usage

./test -h
usage:
  ./test [a|--all|-h|--help|-j|--java|-p|--python]
 -h|--help: show this help
 -a|--all: run all tests
 -j|--java: run java tests
 -p|--python: run python tests
 -pa: run python tests with automatic start of echoServer

TestEnviroment

The tests above have been run succesfully in the following environments:

MacOS

mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /opt/local/share/java/maven3
Java version: 1.8.0_152, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk1.8.0_152.jdk/Contents/Home/jre
Default locale: de_DE, platform encoding: UTF-8
OS name: "mac os x", version: "10.13.6", arch: "x86_64", family: "mac"

python3 --version
Python 3.7.6

Raspbian

mvn -version
Apache Maven 3.6.0
Maven home: /usr/share/maven
Java version: 1.8.0_212, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-8-openjdk-armhf/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.19.75-v7l+", arch: "arm", family: "unix"

python3 --version
Python 3.7.3

Ubuntu

mvn -version
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T13:57:37+02:00)
Maven home: /usr/local/src/apache-maven-3.3.3
Java version: 1.8.0_242, vendor: Private Build
Java home: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.0.0-37-generic", arch: "amd64", family: "unix"

python3 --version
Python 3.7.5

Travis

The travis environment used is an Ubuntu Xenial distribution.

History