public Channel build(PhysicalChannelDefinition definition) throws BuilderException {
URI uri = definition.getUri();
QName deployable = definition.getDeployable();
FanOutHandler fanOutHandler;
if (definition.getBindingDefinition() != null) {
fanOutHandler = new SyncFanOutHandler();
} else {
fanOutHandler = new AsyncFanOutHandler(executorService);
}
Channel channel;
if (definition.isReplicate() && replicationCapable) {
String channelName = uri.toString();
ReplicationHandler replicationHandler = new ReplicationHandler(channelName, topologyService, monitor);
channel = new DefaultChannelImpl(uri, deployable, replicationHandler, fanOutHandler, definition.getChannelSide());
if (!topologyService.isChannelOpen(channelName)) {
try {
topologyService.openChannel(channelName, null, replicationHandler);
} catch (ZoneChannelException e) {
throw new BuilderException(e);
}
}
} else {
channel = new DefaultChannelImpl(uri, deployable, fanOutHandler, definition.getChannelSide());
}
PhysicalChannelBindingDefinition bindingDefinition = definition.getBindingDefinition();
buildBinding(channel, bindingDefinition);
return channel;
}