Search code examples
wildflymicroprofileeclipse-microprofile-config

MicroProfile LRA - How to define custom participant URI on a WildFly JEE application?


When MicroProfile LRA coordinator and participants run on different Docker containers, it is needed to define a custom URI for each participant.

Otherwise the LRA coordinator tries to call participant compensate/complete APIs by referring them with "localhost" based URI.

Is it possible, on WildFly environment, to define a custom URI for a participant? And ingeneral is it possible to define a how participants can register with any LRA?


Solution

  • By default, the participant endpoints are derived from the caller information provided in the JAX-RS UriInfo class. This class contains the base URI of the caller of the participant. The idea is that coordinator should be able to call the participant on the same URI as the original request to the participant came in.

    I've created a simple docker image https://hub.docker.com/repository/docker/xstefank/uriinfo-wildfly which will on path /uriinfo/ping return the the base URI that will be used for participant URLs.

    Calling this locally gives you - Base URI is http://localhost:8080/uriinfo/ which is expected called from the local machine. Deploying this image to OpenShift/Kubernetes and exposing a route for this application gives you Base URI is http://uriinfo-wildfly-testing.6923.rh-us-east-1.openshiftapps.com/uriinfo/. And finally, calling it from a different pod deployed in the same project gives you Base URI is http://uriinfo-wildfly:8080/uriinfo/ which corresponds to the actual calls:

    $ curl localhost:8080/uriinfo/ping
    Base URI is http://localhost:8080/uriinfo/
    
    $ curl http://uriinfo-wildfly-testing.6923.rh-us-east-1.openshiftapps.com/uriinfo/ping
    Base URI is http://uriinfo-wildfly-testing.6923.rh-us-east-1.openshiftapps.com/uriinfo/
    
    # called from different pod in the same openshift project
    $ curl http://uriinfo-wildfly:8080/uriinfo/ping
    Base URI is http://uriinfo-wildfly:8080/uriinfo/
    

    Another option is to manually register the URLs you require through NarayanaLRAClient#joinLRA methods which either take individual URLs for different LRA endpoints or a base URI that will derive the URLs as mentioned above.