in core/servicemix-core/src/main/java/org/apache/servicemix/jbi/nmr/DefaultBroker.java [310:377]
protected void resolveAddress(MessageExchangeImpl exchange) throws JBIException {
ServiceEndpoint theEndpoint = exchange.getEndpoint();
if (theEndpoint != null) {
if (theEndpoint instanceof ExternalEndpoint) {
throw new JBIException("External endpoints can not be used for routing: should be an internal or dynamic endpoint.");
}
if (!(theEndpoint instanceof AbstractServiceEndpoint)) {
throw new JBIException(
"Component-specific endpoints can not be used for routing: should be an internal or dynamic endpoint.");
}
}
// Resolve linked endpoints
if (theEndpoint instanceof LinkedEndpoint) {
QName svcName = ((LinkedEndpoint) theEndpoint).getToService();
String epName = ((LinkedEndpoint) theEndpoint).getToEndpoint();
ServiceEndpoint ep = registry.getInternalEndpoint(svcName, epName);
if (ep == null) {
throw new JBIException("Could not resolve linked endpoint: " + theEndpoint);
}
theEndpoint = ep;
}
// get the context which created the exchange
ComponentContextImpl context = exchange.getSourceContext();
if (theEndpoint == null) {
QName serviceName = exchange.getService();
QName interfaceName = exchange.getInterfaceName();
// check in order, ServiceName then InterfaceName
// check to see if there is a match on the serviceName
if (serviceName != null) {
ServiceEndpoint[] endpoints = registry.getEndpointsForService(serviceName);
endpoints = getMatchingEndpoints(endpoints, exchange);
theEndpoint = getServiceChooser(exchange).chooseEndpoint(endpoints, context, exchange);
if (theEndpoint == null) {
LOGGER.warn("ServiceName ({}) specified for routing, but can't find it registered", serviceName);
}
}
if (theEndpoint == null && interfaceName != null) {
ServiceEndpoint[] endpoints = registry.getEndpointsForInterface(interfaceName);
endpoints = getMatchingEndpoints(endpoints, exchange);
theEndpoint = (InternalEndpoint) getInterfaceChooser(exchange).chooseEndpoint(endpoints, context, exchange);
if (theEndpoint == null) {
LOGGER.warn("InterfaceName ({}) specified for routing, but can't find any matching components", interfaceName);
}
}
if (theEndpoint == null) {
// lets use the resolver on the activation spec if
// applicable
ActivationSpec activationSpec = exchange.getActivationSpec();
if (activationSpec != null) {
EndpointResolver destinationResolver = activationSpec.getDestinationResolver();
if (destinationResolver != null) {
try {
EndpointFilter filter = createEndpointFilter(context, exchange);
theEndpoint = (InternalEndpoint) destinationResolver.resolveEndpoint(context, exchange, filter);
} catch (JBIException e) {
throw new MessagingException("Failed to resolve endpoint: " + e, e);
}
}
}
}
}
if (theEndpoint != null) {
exchange.setEndpoint(theEndpoint);
}
LOGGER.trace("Routing exchange {} to {}", exchange, theEndpoint);
}