diff options
Diffstat (limited to 'BKUOnline/src/main/java/at')
-rw-r--r-- | BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java | 226 |
1 files changed, 118 insertions, 108 deletions
diff --git a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java index d206913d..ef0bcdd6 100644 --- a/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java +++ b/BKUOnline/src/main/java/at/gv/egiz/stal/service/impl/STALRequestBrokerImpl.java @@ -1,19 +1,19 @@ /* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ + * Copyright 2008 Federal Chancellery Austria and + * Graz University of Technology + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ /* * To change this template, choose Tools | Templates * and open the template in the editor. @@ -75,39 +75,40 @@ public class STALRequestBrokerImpl implements STALRequestBroker { */ @Override public synchronized List<STALResponse> handleRequest(List<STALRequest> requests) { - long beforeWait = System.currentTimeMillis(); - while (isHandlingRequest) { - log.trace("waiting to produce request"); - try { + try { + long beforeWait = System.currentTimeMillis(); + while (isHandlingRequest) { + log.trace("waiting to produce request"); +// try { wait(TIMEOUT_MS); if (System.currentTimeMillis() - beforeWait >= TIMEOUT_MS) { log.warn("timeout while waiting to produce request"); return Collections.singletonList((STALResponse) new ErrorResponse(ERR_6000)); } - } catch (InterruptedException ex) { - log.warn("interrupt while waiting to produce request: " + ex.getMessage()); +// } catch (InterruptedException ex) { +// log.warn("interrupt while waiting to produce request: " + ex.getMessage()); +// } } - } - log.trace("produce request"); - isHandlingRequest = true; + log.trace("produce request"); + isHandlingRequest = true; - this.requests = requests; - currentHashDataInput = null; - for (STALRequest request : requests) { - if (request instanceof SignRequest) { - log.trace("Received SignRequest, keep HashDataInput."); - currentHashDataInput = ((SignRequest) request).getHashDataInput(); - break; - } else if (request instanceof QuitRequest) { - //alternative1: - //for QUIT requests, do not wait for responses, but for request consumation - // (i.e. set isHandlingReq to false once QUIT is consumed) - log.trace("Received QuitRequest, do not wait for responses."); - log.trace("notifying request consumers"); - notify(); - //alternative2: - //wait for QUIT to be consumed - // (i.e. notify me once QUIT is consumed) + this.requests = requests; + currentHashDataInput = null; + for (STALRequest request : requests) { + if (request instanceof SignRequest) { + log.trace("Received SignRequest, keep HashDataInput."); + currentHashDataInput = ((SignRequest) request).getHashDataInput(); + break; + } else if (request instanceof QuitRequest) { + //alternative1: + //for QUIT requests, do not wait for responses, but for request consumation + // (i.e. set isHandlingReq to false once QUIT is consumed) + log.trace("Received QuitRequest, do not wait for responses."); + log.trace("notifying request consumers"); + notify(); + //alternative2: + //wait for QUIT to be consumed + // (i.e. notify me once QUIT is consumed) // while (this.requests != null) { // try { // long beforeWait = System.currentTimeMillis(); @@ -123,18 +124,18 @@ public class STALRequestBrokerImpl implements STALRequestBroker { // } // } // isHandlingRequest = false; - return new ArrayList<STALResponse>(); - } else if (log.isTraceEnabled()) { - log.trace("Received STAL request: " + request.getClass().getName()); + return new ArrayList<STALResponse>(); + } else if (log.isTraceEnabled()) { + log.trace("Received STAL request: " + request.getClass().getName()); + } } - } - log.trace("notifying request consumers"); - notify(); + log.trace("notifying request consumers"); + notify(); - beforeWait = System.currentTimeMillis(); - while (this.responses == null) { - log.trace("waiting to consume response"); - try { + beforeWait = System.currentTimeMillis(); + while (this.responses == null) { + log.trace("waiting to consume response"); +// try { wait(TIMEOUT_MS); if (System.currentTimeMillis() - beforeWait >= TIMEOUT_MS) { log.warn("timeout while waiting to consume response"); @@ -143,11 +144,11 @@ public class STALRequestBrokerImpl implements STALRequestBroker { isHandlingRequest = false; return Collections.singletonList((STALResponse) new ErrorResponse(ERR_6000)); } - } catch (InterruptedException ex) { - log.warn("interrupt while waiting to consume response: " + ex.getMessage()); +// } catch (InterruptedException ex) { +// log.warn("interrupt while waiting to consume response: " + ex.getMessage()); +// } } - } - log.trace("consuming responses"); + log.trace("consuming responses"); List<STALResponse> resps = responses; responses = null; log.trace("notifying response producers"); @@ -158,6 +159,10 @@ public class STALRequestBrokerImpl implements STALRequestBroker { notify(); return resps; + } catch (InterruptedException ex) { + log.warn("interrupt in handleRequest(): " + ex.getMessage()); + return null; + } } /** @@ -167,75 +172,80 @@ public class STALRequestBrokerImpl implements STALRequestBroker { */ @Override public synchronized List<STALRequest> nextRequest(List<STALResponse> responses) { - if (responses != null && responses.size() > 0) { - if (!expectingResponse) { - log.warn("Received unexpected response in nextRequest()"); - return Collections.singletonList((STALRequest) new QuitRequest()); - } - long beforeWait = System.currentTimeMillis(); - while (this.responses != null) { - log.trace("waiting to produce response"); - try { + try { + if (responses != null && responses.size() > 0) { + if (!expectingResponse) { + log.warn("Received unexpected response in nextRequest()"); + return Collections.singletonList((STALRequest) new QuitRequest()); + } + long beforeWait = System.currentTimeMillis(); + while (this.responses != null) { + log.trace("waiting to produce response"); +// try { wait(TIMEOUT_MS); if (System.currentTimeMillis() - beforeWait >= TIMEOUT_MS) { log.warn("timeout while waiting to produce response"); return Collections.singletonList((STALRequest) new QuitRequest()); } - } catch (InterruptedException ex) { - log.warn("interrupt while waiting to produce response: " + ex.getMessage()); +// } catch (InterruptedException ex) { +// log.warn("interrupt while waiting to produce response: " + ex.getMessage()); +// } } - } - log.trace("produce response"); - this.responses = responses; - //reset HashDataInputCallback - if (log.isTraceEnabled()) { - for (STALResponse response : responses) { - log.trace("Received STAL response: " + response.getClass().getName()); + log.trace("produce response"); + this.responses = responses; + //reset HashDataInputCallback + if (log.isTraceEnabled()) { + for (STALResponse response : responses) { + log.trace("Received STAL response: " + response.getClass().getName()); + } } + log.trace("notifying response consumers"); + notify(); + } else { + if (expectingResponse) { + // while (expectingResponse) wait(); + log.warn("No expected response received in nextRequest()"); + return Collections.singletonList((STALRequest) new QuitRequest()); + } + log.trace("expecting non-null response in next nextRequest(response)"); + expectingResponse = true; } - log.trace("notifying response consumers"); - notify(); - } else { - if (expectingResponse) { - // while (expectingResponse) wait(); - log.warn("No expected response received in nextRequest()"); - return Collections.singletonList((STALRequest) new QuitRequest()); - } - log.trace("expecting non-null response in next nextRequest(response)"); - expectingResponse = true; - } - long beforeWait = System.currentTimeMillis(); - while (this.requests == null) { - log.trace("waiting to consume request"); - try { + long beforeWait = System.currentTimeMillis(); + while (this.requests == null) { + log.trace("waiting to consume request"); +// try { wait(TIMEOUT_MS); if (System.currentTimeMillis() - beforeWait >= TIMEOUT_MS) { log.warn("timeout while waiting to consume request"); return Collections.singletonList((STALRequest) new QuitRequest()); } - } catch (InterruptedException ex) { - log.warn("interrupt while waiting to consume request: " + ex.getMessage()); +// } catch (InterruptedException ex) { +// log.warn("interrupt while waiting to consume request: " + ex.getMessage()); +// } } - } - log.trace("consume request"); - List<STALRequest> reqs = requests; - //TODO check if QUIT and set isHandlingReq to false here? - // (rename isHandlingReq -> produce) - // handleReq(QUIT) doesn't wait() and returns immediately - // cf. handleReq(QUIT) - requests = null; - //no need to notify; request producer is waiting for isHandlingRequest - //(alt2: the QUIT producer returned immediately and didn't notify) - //(alt1: the QUIT producer is waiting for notification on QUIT consumption) - if (reqs.size() > 0 && reqs.get(0) instanceof QuitRequest) { - isHandlingRequest = false; - log.trace("consumed QUIT, notifying request producers"); - notify(); - log.trace("expecting no response in next nextRequest()"); - expectingResponse = false; + log.trace("consume request"); + List<STALRequest> reqs = requests; + //TODO check if QUIT and set isHandlingReq to false here? + // (rename isHandlingReq -> produce) + // handleReq(QUIT) doesn't wait() and returns immediately + // cf. handleReq(QUIT) + requests = null; + //no need to notify; request producer is waiting for isHandlingRequest + //(alt2: the QUIT producer returned immediately and didn't notify) + //(alt1: the QUIT producer is waiting for notification on QUIT consumption) + if (reqs.size() > 0 && reqs.get(0) instanceof QuitRequest) { + isHandlingRequest = false; + log.trace("consumed QUIT, notifying request producers"); + notify(); + log.trace("expecting no response in next nextRequest()"); + expectingResponse = false; //notify no-response request consumers + } + return reqs; + } catch (InterruptedException ex) { + log.warn("interrupt in nextRequest(): " + ex.getMessage()); + return null; } - return reqs; } @Override |