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);
}
}
}