Skip to content

Commit 7ed58fc

Browse files
Keith Baboigarashitm
Keith Babo
authored andcommitted
SWITCHYARD-2009 invoke local optimization for clustered endpoints
1 parent f082f06 commit 7ed58fc

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

sca/src/main/java/org/switchyard/component/sca/SCAInvoker.java

+22-16
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public class SCAInvoker extends BaseServiceHandler {
6060
private final String _targetNamespace;
6161
private final boolean _clustered;
6262
private ClusteredInvoker _invoker;
63+
private boolean _preferLocal;
6364
private boolean _disableRemoteTransaction = false;
6465
private TransactionContextSerializer _txSerializer = new TransactionContextSerializer();
6566

@@ -73,6 +74,7 @@ public SCAInvoker(SCABindingModel config) {
7374
_targetService = config.getTarget();
7475
_targetNamespace = config.getTargetNamespace();
7576
_clustered = config.isClustered();
77+
_preferLocal = config.isPreferLocal();
7678
}
7779

7880
/**
@@ -100,10 +102,23 @@ public void handleMessage(Exchange exchange) throws HandlerException {
100102
throw SCAMessages.MESSAGES.referenceBindingNotStarted(_referenceName, _bindingName);
101103
}
102104
try {
105+
// Figure out the QName for the service were invoking
106+
QName serviceName = getTargetServiceName(exchange);
107+
// Get a handle for the reference and use a copy of the exchange to invoke it
108+
ServiceReference ref = exchange.getProvider().getDomain().getServiceReference(serviceName);
109+
103110
if (_clustered) {
104-
invokeRemote(exchange);
111+
// check to see if local is preferred and available
112+
if (_preferLocal && ref != null) {
113+
invokeLocal(exchange, ref);
114+
} else {
115+
invokeRemote(exchange, serviceName);
116+
}
105117
} else {
106-
invokeLocal(exchange);
118+
if (ref == null) {
119+
throw SCAMessages.MESSAGES.serviceReferenceNotFoundInDomain(serviceName.toString(), exchange.getProvider().getDomain().getName().toString());
120+
}
121+
invokeLocal(exchange, ref);
107122
}
108123
} catch (SwitchYardException syEx) {
109124
throw new HandlerException(syEx.getMessage());
@@ -126,16 +141,9 @@ void setInvoker(ClusteredInvoker invoker) {
126141
_invoker = invoker;
127142
}
128143

129-
private void invokeLocal(Exchange exchange) throws HandlerException {
130-
// Figure out the QName for the service were invoking
131-
QName serviceName = getTargetServiceName(exchange);
132-
// Get a handle for the reference and use a copy of the exchange to invoke it
133-
ServiceReference ref = exchange.getProvider().getDomain().getServiceReference(serviceName);
134-
if (ref == null) {
135-
throw SCAMessages.MESSAGES.serviceReferenceNotFoundInDomain(serviceName.toString(), exchange.getProvider().getDomain().getName().toString());
136-
}
144+
private void invokeLocal(Exchange exchange, ServiceReference targetRef) throws HandlerException {
137145
SynchronousInOutHandler replyHandler = new SynchronousInOutHandler();
138-
Exchange ex = ref.createExchange(exchange.getContract().getProviderOperation().getName(), replyHandler);
146+
Exchange ex = targetRef.createExchange(exchange.getContract().getProviderOperation().getName(), replyHandler);
139147

140148
// Can't send same message twice, so make a copy
141149
Message invokeMsg = exchange.getMessage().copy();
@@ -146,7 +154,7 @@ private void invokeLocal(Exchange exchange) throws HandlerException {
146154
ClassLoader origCL = null;
147155
try {
148156
ClassLoader targetCL = (ClassLoader)
149-
ref.getDomain().getProperty(Deployment.CLASSLOADER_PROPERTY);
157+
targetRef.getDomain().getProperty(Deployment.CLASSLOADER_PROPERTY);
150158
origCL = Classes.setTCCL(targetCL);
151159
ex.send(invokeMsg);
152160
} finally {
@@ -172,10 +180,8 @@ private void invokeLocal(Exchange exchange) throws HandlerException {
172180
}
173181
}
174182

175-
private void invokeRemote(Exchange exchange) throws HandlerException {
176-
// Figure out the QName for the service were invoking
177-
QName serviceName = getTargetServiceName(exchange);
178-
183+
private void invokeRemote(Exchange exchange, QName serviceName) throws HandlerException {
184+
179185
RemoteMessage request = new RemoteMessage()
180186
.setDomain(exchange.getProvider().getDomain().getName())
181187
.setService(serviceName)

0 commit comments

Comments
 (0)