@@ -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