*
* @param exchange
* @throws JBIException
*/
public void sendExchangePacket(MessageExchange me) throws JBIException {
MessageExchangeImpl exchange = (MessageExchangeImpl) me;
if (exchange.getRole() == Role.PROVIDER && exchange.getDestinationId() == null) {
resolveAddress(exchange);
}
boolean foundRoute = false;
// If we found a destination, or this is a reply
if (exchange.getEndpoint() != null || exchange.getRole() == Role.CONSUMER) {
foundRoute = true;
Flow flow = defaultFlowChooser.chooseFlow(flows, exchange);
if (flow == null) {
throw new MessagingException("Unable to choose a flow for exchange: " + exchange);
}
flow.send(exchange);
}
if (exchange.getRole() == Role.PROVIDER) {
getSubscriptionManager().dispatchToSubscribers(exchange);
}
if (!foundRoute) {
boolean throwException = true;
ActivationSpec activationSpec = exchange.getActivationSpec();
if (activationSpec != null) {
throwException = activationSpec.isFailIfNoDestinationEndpoint();
}
if (throwException) {
throw new MessagingException("Could not find route for exchange: " + exchange + " for service: " + exchange.getService() + " and interface: "
+ exchange.getInterfaceName());
} else if (exchange.getMirror().getSyncState() == MessageExchangeImpl.SYNC_STATE_SYNC_SENT) {
exchange.handleAccept();
ComponentContextImpl ctx = (ComponentContextImpl) getSubscriptionManager().getContext();
exchange.setDestinationId(ctx.getComponentNameSpace());
// TODO: this will fail if exchange is InOut
getSubscriptionManager().done(exchange);
}
}
}