From 2fa2269bd4a993217302183736e6dd0888656869 Mon Sep 17 00:00:00 2001 From: rfeng Date: Fri, 6 Nov 2009 23:58:17 +0000 Subject: Improve performance by indexing invocation chains by operation and caching Java instanceFactory (merge from 1.x) git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@833609 13f79535-47bb-0310-9956-ffa450edef68 --- .../tuscany/sca/core/assembly/RuntimeWireImpl.java | 38 +++++++++++++++------- .../sca/core/invocation/JDKInvocationHandler.java | 11 ++++--- 2 files changed, 34 insertions(+), 15 deletions(-) (limited to 'branches/sca-java-1.5.2/modules/core/src/main/java') diff --git a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java index ad38906e9d..cc71374296 100644 --- a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java +++ b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java @@ -21,7 +21,9 @@ package org.apache.tuscany.sca.core.assembly; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.IdentityHashMap; import java.util.List; +import java.util.Map; import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; @@ -79,6 +81,10 @@ public class RuntimeWireImpl implements RuntimeWire { private List chains; private InvocationChain bindingInvocationChain; + // Cache + private transient final Map invocationChainMap = + new IdentityHashMap(); + /** * @param source @@ -129,20 +135,30 @@ public class RuntimeWireImpl implements RuntimeWire { } public InvocationChain getInvocationChain(Operation operation) { - for (InvocationChain chain : getInvocationChains()) { - Operation op = null; - if (wireSource.getContract() != null) { - // Reference chain - op = chain.getSourceOperation(); + synchronized (invocationChainMap) { + InvocationChain cached = invocationChainMap.get(operation); + if (cached == null) { + for (InvocationChain chain : getInvocationChains()) { + Operation op = null; + if (wireSource.getContract() != null) { + // Reference chain + op = chain.getSourceOperation(); + } else { + // Service chain + op = chain.getTargetOperation(); + } + if (interfaceContractMapper.isCompatible(operation, op, op.getInterface().isRemotable())) { + invocationChainMap.put(operation, chain); + return chain; + } + } + invocationChainMap.put(operation, null); + return null; + } else { - // Service chain - op = chain.getTargetOperation(); - } - if (interfaceContractMapper.isCompatible(operation, op, op.getInterface().isRemotable())) { - return chain; + return cached; } } - return null; } public Object invoke(Message msg) throws InvocationTargetException { diff --git a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java index 80650b2804..4c6abc726c 100644 --- a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java +++ b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java @@ -23,7 +23,7 @@ import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; -import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.UUID; @@ -82,7 +82,7 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable { protected boolean fixedWire = true; - protected transient Map chains = new HashMap(); + protected transient Map chains = new IdentityHashMap(); public JDKInvocationHandler(MessageFactory messageFactory, Class businessInterface, RuntimeWire wire) { this.messageFactory = messageFactory; @@ -288,8 +288,11 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable { } protected synchronized InvocationChain getInvocationChain(Method method, RuntimeWire wire) { - if (fixedWire && chains.containsKey(method)) { - return chains.get(method); + if (fixedWire) { + InvocationChain chain = chains.get(method); + if (chain != null) { + return chain; + } } InvocationChain found = null; for (InvocationChain chain : wire.getInvocationChains()) { -- cgit v1.2.3