public void handleMessage(Message message) {
final Exchange exchange = message.getExchange();
final Endpoint endpoint = exchange.get(Endpoint.class);
final Service service = endpoint.getService();
final Invoker invoker = service.getInvoker();
Runnable invocation = new Runnable() {
public void run() {
Exchange runableEx = message.getExchange();
Object result = invoker.invoke(runableEx, getInvokee(message));
if (!exchange.isOneWay()) {
Endpoint ep = exchange.get(Endpoint.class);
Message outMessage = runableEx.getOutMessage();
if (outMessage == null) {
outMessage = ep.getBinding().createMessage();
exchange.setOutMessage(outMessage);
}
copyJaxwsProperties(message, outMessage);
if (result != null) {
MessageContentsList resList = null;
if (result instanceof MessageContentsList) {
resList = (MessageContentsList)result;
} else if (result instanceof List) {
resList = new MessageContentsList((List)result);
} else if (result.getClass().isArray()) {
resList = new MessageContentsList((Object[])result);
} else {
outMessage.setContent(Object.class, result);
}
if (resList != null) {
outMessage.setContent(List.class, resList);
}
}
}
}
};
Executor executor = getExecutor(endpoint);
if (exchange.get(Executor.class) == executor) {
// already executing on the appropriate executor
invocation.run();
} else {
exchange.put(Executor.class, executor);
executor.execute(invocation);
}
}
|