blob: e93992397981af674c160d82692b1179d480d761 [file] [log] [blame]
/*
* Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.dbchangenotification;
import java.util.Vector;
import org.eclipse.persistence.sessions.Session;
public class CacheInvalidationHandler {
Session session;
javax.jms.Connection connection;
long timeToWait;
CacheInvalidator invalidator;
Vector exceptions;
int messageCount;
boolean shouldStop;
int numMessagesExpected = -1;
long timeDead = -1;
long timeLastMessageWasReceived;
public CacheInvalidationHandler(Session session, javax.jms.Connection connection) {
this(session, connection, 1000);
}
// each timeToWait the handler checks whether it shouldStop (should be positive)
public CacheInvalidationHandler(Session session, javax.jms.Connection connection, long timeToWait) {
this.session = session;
this.connection = connection;
this.timeToWait = timeToWait;
invalidator = new CacheInvalidator(session);
}
protected void addException(Exception ex) {
if (exceptions == null) {
exceptions = new Vector();
}
exceptions.addElement(ex);
}
public Vector getExceptions() {
return exceptions;
}
public int getMessageCount() {
return messageCount;
}
String getName() {
return session.getName();
}
// stops the handler as soon as possible
public void askToStop() throws InterruptedException {
askToStopAfter(0, 0);
}
// stops the handler when the expected number of messages has been received:
// messageCount >= numMessagesExpected
// or if the last message was received a long time ago:
// currentTime - timeLastMessageWasReceived >= timeDead
// - in this case something wrong probably has happened
public void askToStopAfter(int numMessagesExpected, long timeDead) throws InterruptedException {
this.numMessagesExpected = numMessagesExpected;
this.timeDead = timeDead;
}
// this method is called at least every timeToWait:
// if the message was received - with true;
// otherwise - with false
protected synchronized void checkToStop(boolean messageWasReceived) {
if (numMessagesExpected < 0 && timeDead < 0) {
return;
}
if (this.messageCount >= numMessagesExpected) {
shouldStop = true;
return;
}
long currentTime = System.currentTimeMillis();
if (timeLastMessageWasReceived == 0) {
timeLastMessageWasReceived = currentTime;
return;
}
if (currentTime - timeLastMessageWasReceived >= timeDead) {
shouldStop = true;
return;
}
if (messageWasReceived) {
timeLastMessageWasReceived = currentTime;
}
}
}