Ignore:
Timestamp:
10/16/13 13:01:04 (11 years ago)
Author:
stoda
Message:

MultiMethod? without numWait -> it depends on the timeout

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/supervisor/src/main/java/omq/client/proxy/Proxymq.java

    r99 r104  
    44import java.lang.reflect.InvocationHandler;
    55import java.lang.reflect.Method;
     6import java.util.ArrayList;
    67import java.util.HashMap;
     8import java.util.List;
    79import java.util.Map;
    810import java.util.Properties;
     
    201203                                publishMessage(request, replyQueueName);
    202204                                if (request.isMulti()) {
    203                                         return getResults(corrId, request.getWait(), timeout, type);
     205                                        return getResults(corrId, timeout, type);
    204206                                } else {
    205207                                        return getResult(corrId, timeout, type);
     
    228230                String methodName = method.getName();
    229231                boolean multi = false;
    230                 int wait = 0;
    231232
    232233                if (method.getAnnotation(MultiMethod.class) != null) {
    233234                        multi = true;
    234                         wait = method.getAnnotation(MultiMethod.class).waitNum();
    235235                }
    236236
     
    246246                                timeout = sync.timeout();
    247247                        }
    248                         return Request.newSyncRequest(corrId, methodName, arguments, retries, timeout, multi, wait);
     248                        return Request.newSyncRequest(corrId, methodName, arguments, retries, timeout, multi);
    249249                } else {
    250250                        return Request.newAsyncRequest(corrId, methodName, arguments, multi);
     
    291291         * @param corrId
    292292         *            - Correlation Id of the request
    293          * @param wait
    294          *            - Array length
    295293         * @param timeout
    296294         *            - Timeout read in @SyncMethod.timeout(). If the timeout is set
     
    302300         * @throws Exception
    303301         */
    304         private Object getResults(String corrId, int wait, long timeout, Class<?> type) throws Exception {
     302        private Object getResults(String corrId, long timeout, Class<?> type) throws Exception {
    305303                Response resp = null;
    306304                // Get the component type of an array
    307305                Class<?> actualType = type.getComponentType();
    308306
    309                 Object array = Array.newInstance(actualType, wait);
     307                List<Object> list = new ArrayList<Object>();
    310308
    311309                int i = 0;
     
    313311                long start = System.currentTimeMillis();
    314312
    315                 while (i < wait) {
     313                while (true) {
    316314                        synchronized (results) {
    317315                                // Due to we are using notifyAll(), we need to control the real
     
    322320                                }
    323321                                if ((timeout - localTimeout) <= 0) {
    324                                         throw new TimeoutException("Timeout exception time: " + timeout);
     322                                        break;
    325323                                }
    326324                                // Remove the corrId to receive new replies
    327325                                resp = serializer.deserializeResponse(results.remove(corrId), actualType);
    328                                 Array.set(array, i, resp.getResult());
     326                                list.add(resp.getResult());
    329327                        }
    330328                        i++;
    331329                }
     330
     331                if (i == 0) {
     332                        results.remove(corrId);
     333                        throw new TimeoutException("Timeout exception time: " + timeout);
     334                }
     335
    332336                synchronized (results) {
    333337                        results.put(corrId, null);
     338                }
     339
     340                Object array = Array.newInstance(actualType, i);
     341                i = 0;
     342                for (Object o : list) {
     343                        Array.set(array, i++, o);
    334344                }
    335345
Note: See TracChangeset for help on using the changeset viewer.