0

I have the following classes:

I want to know how to do a chain request<->response using eventbus in Quarkus since I can't make it work. The following code is an example.

If I directlly call the DAO I can see that the data is being called. ( B<->D it works )

If I call a REST API that calls a service and that call the DAO I see the flow working up until the service but the DAO is not being called. ( A<->C<->D )

Class A:

@Singleton
@Path("/api/v1/market-structure-reference-data")
public class RestMarketStructureReferenceDataConnector {

    @Inject
    EventBus eventBus;

    @POST
    @Path("/TradSessListReq")
    public Uni<Response> postTradSessListReq(FIXML request) throws JAXBException {
        if (request.getMessage().getValue() instanceof TradingSessionListRequestMessageT) {
            return eventBus.<FIXML>request("find-trading-session", request).map(Message::body).map(i -> Response.ok(i).build());
        }
        return Uni.createFrom().item(Response.status(Status.BAD_REQUEST).build());
    }
}

Class B:

@Singleton
@Path("/api/v1/admin/trading-session")
public class RestAdministratorTradingSessionConnector {

    @Inject
    EventBus eventBus;

    @GET
    public Uni<TradingSessionDTO> get(@QueryParam("SesID") String tradingSessionID,
            @QueryParam("SesSub") String tradingSessionSubID,
            @QueryParam("Method") int method, @QueryParam("Mode") int mode) {
        DeliveryOptions deliveryOptions = new DeliveryOptions();
        if (tradingSessionID != null) {
            deliveryOptions.addHeader("SesID", tradingSessionID);
        }
        if (tradingSessionSubID != null) {
            deliveryOptions.addHeader("SesSub", tradingSessionSubID);
        }
        if (method > 0) {
            deliveryOptions.addHeader("Method", Integer.toString(method));
        }
        if (mode > 0) {
            deliveryOptions.addHeader("Mode", Integer.toString(mode));
        }
        return eventBus.<List<TrdSessLstGrpBlockT>>request("read-trading-session", "", deliveryOptions)
                .map(Message::body)
                .map(TradingSessionDTO::new);
    }
}

Class C:

@Singleton
public class TradingSessionService {

        @Inject
        EventBus eventBus;

        @Inject
        ObjectFactory objectFactory;

        @ConsumeEvent("find-trading-session")
        public void find(Message<FIXML> message) {

                FIXML request = message.body();
                TradingSessionListRequestMessageT requestMessage = (TradingSessionListRequestMessageT) request
                                .getMessage()
                                .getValue();

                DeliveryOptions deliveryOptions = new DeliveryOptions();
                Optional.ofNullable(requestMessage.getSesID()).ifPresent(m -> deliveryOptions.addHeader("SesID", m));
                Optional.ofNullable(requestMessage.getSesSub())
                                .ifPresent(m -> deliveryOptions.addHeader("SesSubID", m));
                Optional.ofNullable(requestMessage.getMktID()).ifPresent(m -> deliveryOptions.addHeader("MktID", m));
                Optional.ofNullable(requestMessage.getMktSegID())
                                .ifPresent(m -> deliveryOptions.addHeader("MktSegID", m));
                Optional.ofNullable(requestMessage.getMethod())
                                .ifPresent(m -> deliveryOptions.addHeader("Method", m.toString()));
                Optional.ofNullable(requestMessage.getMode())
                                .ifPresent(m -> deliveryOptions.addHeader("Mode", m.toString()));

                FIXML response = objectFactory.createFIXML();
                response.setV(request.getV());

                TradingSessionListMessageT responseMessage = objectFactory.createTradingSessionListMessageT();
                response.setMessage(objectFactory.createTradSessList(responseMessage));
                responseMessage.setReqID(requestMessage.getReqID());

                eventBus.<List<TrdSessLstGrpBlockT>>request("read-trading-session", "", deliveryOptions)
                                .map(Message::body)
                                .map(l -> responseMessage.getTrdSessLstGrp().addAll(l));

                message.reply(response);
        }
}

Class D:

@Singleton
public class TradingSesssionDAO {

    @Inject
    AgroalDataSource defaultDataSource;

    private Marshaller marshaller;

    private static final String SQL_SELECT_ALL = "SELECT DATA FROM TRADING_SESSION";

    @ConsumeEvent("read-trading-session")
    public void read(Message<String> message) throws SQLException, JAXBException {

        StringBuilder sb = new StringBuilder(SQL_SELECT_ALL);

        if (message.headers().contains("SesID") || message.headers().contains("SesSubID")
                || message.headers().contains("MktID") || message.headers().contains("MktSegID")
                || message.headers().contains("Method") || message.headers().contains("Mode")) {

            sb.append(" WHERE XMLEXISTS( 'declare namespace fixp=\"http://www.fixprotocol.org/FIXML-Latest\"; ")
                    .append("$doc/fixp:TrdSessLstGrp[");

            if (message.headers().contains("SesID")) {
                sb.append("@SesID=\"").append(message.headers().get("SesID")).append("\" and ");
            }

            if (message.headers().contains("SesSubID")) {
                sb.append("@SesSubID=\"").append(message.headers().get("SesSubID")).append("\" and ");
            }

            if (message.headers().contains("MktID")) {
                sb.append("@MktID=\"").append(message.headers().get("MktID")).append("\" and ");
            }

            if (message.headers().contains("MktSegID")) {
                sb.append("@MktSegID=\"").append(message.headers().get("MktSegID")).append("\" and ");
            }

            if (message.headers().contains("Method")) {
                sb.append("@Method=\"").append(message.headers().get("Method")).append("\" and ");
            }

            if (message.headers().contains("Mode")) {
                sb.append("@Mode=\"").append(message.headers().get("Mode")).append("\" and ");
            }

            sb.replace(sb.length() - 5, sb.length(), "")
                    .append("]' PASSING DATA AS \"doc\" )");
        }

        try (Connection connection = defaultDataSource.getConnection();
                Statement stmt = connection.createStatement();
                ResultSet rs = stmt.executeQuery(sb.toString());) {
            List<TrdSessLstGrpBlockT> resultList = new ArrayList<>();

            while (rs.next()) {
                resultList.add(unmarshaller
                        .unmarshal(new StreamSource(new StringReader(rs.getString(1))), TrdSessLstGrpBlockT.class)
                        .getValue());
            }
            message.reply(resultList);
        }
    }
}
dalcorta
  • 85
  • 4

0 Answers0