@@ -60,6 +60,7 @@ public class SCAInvoker extends BaseServiceHandler {
60
60
private final String _targetNamespace ;
61
61
private final boolean _clustered ;
62
62
private ClusteredInvoker _invoker ;
63
+ private boolean _preferLocal ;
63
64
private boolean _disableRemoteTransaction = false ;
64
65
private TransactionContextSerializer _txSerializer = new TransactionContextSerializer ();
65
66
@@ -73,6 +74,7 @@ public SCAInvoker(SCABindingModel config) {
73
74
_targetService = config .getTarget ();
74
75
_targetNamespace = config .getTargetNamespace ();
75
76
_clustered = config .isClustered ();
77
+ _preferLocal = config .isPreferLocal ();
76
78
}
77
79
78
80
/**
@@ -100,10 +102,23 @@ public void handleMessage(Exchange exchange) throws HandlerException {
100
102
throw SCAMessages .MESSAGES .referenceBindingNotStarted (_referenceName , _bindingName );
101
103
}
102
104
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
+
103
110
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
+ }
105
117
} 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 );
107
122
}
108
123
} catch (SwitchYardException syEx ) {
109
124
throw new HandlerException (syEx .getMessage ());
@@ -126,16 +141,9 @@ void setInvoker(ClusteredInvoker invoker) {
126
141
_invoker = invoker ;
127
142
}
128
143
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 {
137
145
SynchronousInOutHandler replyHandler = new SynchronousInOutHandler ();
138
- Exchange ex = ref .createExchange (exchange .getContract ().getProviderOperation ().getName (), replyHandler );
146
+ Exchange ex = targetRef .createExchange (exchange .getContract ().getProviderOperation ().getName (), replyHandler );
139
147
140
148
// Can't send same message twice, so make a copy
141
149
Message invokeMsg = exchange .getMessage ().copy ();
@@ -146,7 +154,7 @@ private void invokeLocal(Exchange exchange) throws HandlerException {
146
154
ClassLoader origCL = null ;
147
155
try {
148
156
ClassLoader targetCL = (ClassLoader )
149
- ref .getDomain ().getProperty (Deployment .CLASSLOADER_PROPERTY );
157
+ targetRef .getDomain ().getProperty (Deployment .CLASSLOADER_PROPERTY );
150
158
origCL = Classes .setTCCL (targetCL );
151
159
ex .send (invokeMsg );
152
160
} finally {
@@ -172,10 +180,8 @@ private void invokeLocal(Exchange exchange) throws HandlerException {
172
180
}
173
181
}
174
182
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
+
179
185
RemoteMessage request = new RemoteMessage ()
180
186
.setDomain (exchange .getProvider ().getDomain ().getName ())
181
187
.setService (serviceName )
0 commit comments