add SocketTimeoutException listener
This commit is contained in:
parent
809792e64e
commit
31fa5fc126
14 changed files with 72 additions and 42 deletions
|
@ -1,6 +1,6 @@
|
||||||
group = org.xbib
|
group = org.xbib
|
||||||
name = z3950
|
name = z3950
|
||||||
version = 2.3.3
|
version = 2.3.4
|
||||||
|
|
||||||
gradle.wrapper.version = 6.6.1
|
gradle.wrapper.version = 6.6.1
|
||||||
netty.version = 4.1.66.Final
|
netty.version = 4.1.66.Final
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
package org.xbib.z3950.api;
|
||||||
|
|
||||||
|
public interface TimeoutListener {
|
||||||
|
|
||||||
|
void onTimeout();
|
||||||
|
}
|
|
@ -1,4 +0,0 @@
|
||||||
/**
|
|
||||||
* API for Z39.50 applications.
|
|
||||||
*/
|
|
||||||
package org.xbib.z3950.api;
|
|
|
@ -3,6 +3,8 @@ package org.xbib.z3950.client.api;
|
||||||
import org.xbib.z3950.api.RecordListener;
|
import org.xbib.z3950.api.RecordListener;
|
||||||
import org.xbib.z3950.api.ScanListener;
|
import org.xbib.z3950.api.ScanListener;
|
||||||
import org.xbib.z3950.api.SearchListener;
|
import org.xbib.z3950.api.SearchListener;
|
||||||
|
import org.xbib.z3950.api.TimeoutListener;
|
||||||
|
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -11,14 +13,17 @@ public interface Client extends Closeable {
|
||||||
|
|
||||||
int searchCQL(String query, int offset, int length,
|
int searchCQL(String query, int offset, int length,
|
||||||
SearchListener searchListener,
|
SearchListener searchListener,
|
||||||
RecordListener recordListener) throws IOException;
|
RecordListener recordListener,
|
||||||
|
TimeoutListener timeoutListener) throws IOException;
|
||||||
|
|
||||||
int searchPQF(String query, int offset, int length,
|
int searchPQF(String query, int offset, int length,
|
||||||
SearchListener searchListener,
|
SearchListener searchListener,
|
||||||
RecordListener recordListener) throws IOException;
|
RecordListener recordListener,
|
||||||
|
TimeoutListener timeoutListener) throws IOException;
|
||||||
|
|
||||||
void scanPQF(String query, int nTerms, int step, int position,
|
void scanPQF(String query, int nTerms, int step, int position,
|
||||||
ScanListener scanListener) throws IOException;
|
ScanListener scanListener,
|
||||||
|
TimeoutListener timeoutListener) throws IOException;
|
||||||
|
|
||||||
String getHost();
|
String getHost();
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package org.xbib.z3950.client.jdk;
|
||||||
|
|
||||||
import org.xbib.asn1.io.InputStreamBERReader;
|
import org.xbib.asn1.io.InputStreamBERReader;
|
||||||
import org.xbib.asn1.io.OutputStreamBERWriter;
|
import org.xbib.asn1.io.OutputStreamBERWriter;
|
||||||
|
import org.xbib.z3950.api.TimeoutListener;
|
||||||
import org.xbib.z3950.common.operations.CloseOperation;
|
import org.xbib.z3950.common.operations.CloseOperation;
|
||||||
import org.xbib.z3950.common.operations.InitOperation;
|
import org.xbib.z3950.common.operations.InitOperation;
|
||||||
import org.xbib.z3950.common.operations.PresentOperation;
|
import org.xbib.z3950.common.operations.PresentOperation;
|
||||||
|
@ -20,6 +21,7 @@ import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.net.SocketTimeoutException;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -106,7 +108,8 @@ public class JDKZClient implements Client, Closeable {
|
||||||
@Override
|
@Override
|
||||||
public int searchCQL(String query, int offset, int length,
|
public int searchCQL(String query, int offset, int length,
|
||||||
SearchListener searchListener,
|
SearchListener searchListener,
|
||||||
RecordListener recordListener) throws IOException {
|
RecordListener recordListener,
|
||||||
|
TimeoutListener timeoutListener) throws IOException {
|
||||||
if (query == null) {
|
if (query == null) {
|
||||||
throw new IllegalArgumentException("no query");
|
throw new IllegalArgumentException("no query");
|
||||||
}
|
}
|
||||||
|
@ -139,6 +142,11 @@ public class JDKZClient implements Client, Closeable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return searchOperation.getCount();
|
return searchOperation.getCount();
|
||||||
|
} catch (SocketTimeoutException e) {
|
||||||
|
if (timeoutListener != null) {
|
||||||
|
timeoutListener.onTimeout();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
} finally {
|
} finally {
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
|
@ -147,7 +155,8 @@ public class JDKZClient implements Client, Closeable {
|
||||||
@Override
|
@Override
|
||||||
public int searchPQF(String query, int offset, int length,
|
public int searchPQF(String query, int offset, int length,
|
||||||
SearchListener searchListener,
|
SearchListener searchListener,
|
||||||
RecordListener recordListener) throws IOException {
|
RecordListener recordListener,
|
||||||
|
TimeoutListener timeoutListener) throws IOException {
|
||||||
if (query == null) {
|
if (query == null) {
|
||||||
throw new IllegalArgumentException("no query");
|
throw new IllegalArgumentException("no query");
|
||||||
}
|
}
|
||||||
|
@ -181,19 +190,32 @@ public class JDKZClient implements Client, Closeable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return search.getCount();
|
return search.getCount();
|
||||||
|
} catch (SocketTimeoutException e) {
|
||||||
|
if (timeoutListener != null) {
|
||||||
|
timeoutListener.onTimeout();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
} finally {
|
} finally {
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void scanPQF(String query, int nTerms, int step, int position,
|
public void scanPQF(String query,
|
||||||
ScanListener scanListener) throws IOException {
|
int nTerms,
|
||||||
|
int step,
|
||||||
|
int position,
|
||||||
|
ScanListener scanListener,
|
||||||
|
TimeoutListener timeoutListener) throws IOException {
|
||||||
ensureConnected();
|
ensureConnected();
|
||||||
try {
|
try {
|
||||||
lock.lock();
|
lock.lock();
|
||||||
ScanOperation scanOperation = new ScanOperation(berReader, berWriter, databases);
|
ScanOperation scanOperation = new ScanOperation(berReader, berWriter, databases);
|
||||||
scanOperation.executePQF(nTerms, step, position, query, scanListener);
|
scanOperation.executePQF(nTerms, step, position, query, scanListener);
|
||||||
|
} catch (SocketTimeoutException e) {
|
||||||
|
if (timeoutListener != null) {
|
||||||
|
timeoutListener.onTimeout();
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
|
@ -280,7 +302,7 @@ public class JDKZClient implements Client, Closeable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void disconnect() throws IOException {
|
public void disconnect() {
|
||||||
try {
|
try {
|
||||||
lock.lock();
|
lock.lock();
|
||||||
try {
|
try {
|
||||||
|
@ -311,7 +333,7 @@ public class JDKZClient implements Client, Closeable {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() {
|
||||||
if (isConnected()) {
|
if (isConnected()) {
|
||||||
disconnect();
|
disconnect();
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,8 @@ class DefaultClientTest {
|
||||||
int count = client.searchCQL(query, from, size,
|
int count = client.searchCQL(query, from, size,
|
||||||
(status, total, returned, elapsedMillis) ->
|
(status, total, returned, elapsedMillis) ->
|
||||||
logger.log(Level.INFO, serviceName + " total results = " + total),
|
logger.log(Level.INFO, serviceName + " total results = " + total),
|
||||||
record -> logger.log(Level.INFO, "record = " + record));
|
record -> logger.log(Level.INFO, "record = " + record),
|
||||||
|
() -> logger.log(Level.INFO, "timeout"));
|
||||||
logger.log(Level.INFO, "returned records = " + count);
|
logger.log(Level.INFO, "returned records = " + count);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.log(Level.SEVERE, e.getMessage(), e);
|
logger.log(Level.SEVERE, e.getMessage(), e);
|
||||||
|
@ -49,7 +50,8 @@ class DefaultClientTest {
|
||||||
int count = client.searchPQF(query, from, size,
|
int count = client.searchPQF(query, from, size,
|
||||||
(status, total, returned, elapsedMillis) ->
|
(status, total, returned, elapsedMillis) ->
|
||||||
logger.log(Level.INFO, serviceName + " status = " + status + " total results = " + total),
|
logger.log(Level.INFO, serviceName + " status = " + status + " total results = " + total),
|
||||||
record -> logger.log(Level.INFO, "record = " + record.toString(Charset.forName(client.getEncoding()))));
|
record -> logger.log(Level.INFO, "record = " + record.toString(Charset.forName(client.getEncoding()))),
|
||||||
|
() -> logger.log(Level.WARNING, "timeout"));
|
||||||
logger.log(Level.INFO, "returned records = " + count);
|
logger.log(Level.INFO, "returned records = " + count);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.log(Level.SEVERE, e.getMessage(), e);
|
logger.log(Level.SEVERE, e.getMessage(), e);
|
||||||
|
|
|
@ -30,7 +30,8 @@ class GBVZClientTest {
|
||||||
int count = client.searchPQF(query, from, size,
|
int count = client.searchPQF(query, from, size,
|
||||||
(status, total, returned, elapsedMillis) ->
|
(status, total, returned, elapsedMillis) ->
|
||||||
logger.log(Level.INFO, "total results = " + total + " millis = " + elapsedMillis),
|
logger.log(Level.INFO, "total results = " + total + " millis = " + elapsedMillis),
|
||||||
record -> logger.log(Level.INFO, "record = " + record.toString(StandardCharsets.UTF_8)));
|
record -> logger.log(Level.INFO, "record = " + record.toString(StandardCharsets.UTF_8)),
|
||||||
|
() -> logger.log(Level.WARNING, "timeout"));
|
||||||
logger.log(Level.INFO, "record count = " + count);
|
logger.log(Level.INFO, "record count = " + count);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.log(Level.SEVERE, e.getMessage(), e);
|
logger.log(Level.SEVERE, e.getMessage(), e);
|
||||||
|
@ -48,7 +49,8 @@ class GBVZClientTest {
|
||||||
int count = client.searchCQL(query, from, size,
|
int count = client.searchCQL(query, from, size,
|
||||||
(status, total, returned, elapsedMillis) ->
|
(status, total, returned, elapsedMillis) ->
|
||||||
logger.log(Level.INFO, serviceName + " total results = " + total),
|
logger.log(Level.INFO, serviceName + " total results = " + total),
|
||||||
record -> logger.log(Level.INFO, "record = " + record));
|
record -> logger.log(Level.INFO, "record = " + record),
|
||||||
|
() -> logger.log(Level.WARNING, "timeout"));
|
||||||
logger.log(Level.INFO, "returned records = " + count);
|
logger.log(Level.INFO, "returned records = " + count);
|
||||||
assertEquals(1, count);
|
assertEquals(1, count);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
|
@ -35,7 +35,8 @@ class SearchTest {
|
||||||
.build();
|
.build();
|
||||||
client.searchPQF(query, from, length,
|
client.searchPQF(query, from, length,
|
||||||
(status, total, returned, elapsedMillis) -> logger.log(Level.INFO, "total records = " + total),
|
(status, total, returned, elapsedMillis) -> logger.log(Level.INFO, "total records = " + total),
|
||||||
record -> logger.log(Level.INFO, "found record " + record));
|
record -> logger.log(Level.INFO, "found record " + record),
|
||||||
|
() -> logger.log(Level.WARNING, "timeout"));
|
||||||
client.close();
|
client.close();
|
||||||
} catch (NoRecordsReturnedException | MessageSizeTooSmallException e) {
|
} catch (NoRecordsReturnedException | MessageSizeTooSmallException e) {
|
||||||
logger.log(Level.SEVERE, e.getMessage(), e);
|
logger.log(Level.SEVERE, e.getMessage(), e);
|
||||||
|
|
|
@ -16,6 +16,7 @@ import io.netty.util.CharsetUtil;
|
||||||
import org.xbib.z3950.api.RecordListener;
|
import org.xbib.z3950.api.RecordListener;
|
||||||
import org.xbib.z3950.api.ScanListener;
|
import org.xbib.z3950.api.ScanListener;
|
||||||
import org.xbib.z3950.api.SearchListener;
|
import org.xbib.z3950.api.SearchListener;
|
||||||
|
import org.xbib.z3950.api.TimeoutListener;
|
||||||
import org.xbib.z3950.client.api.Client;
|
import org.xbib.z3950.client.api.Client;
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -59,17 +60,32 @@ public class NettyZClient implements Client, Closeable {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int searchCQL(String query, int offset, int length, SearchListener searchListener, RecordListener recordListener) throws IOException {
|
public int searchCQL(String query,
|
||||||
|
int offset,
|
||||||
|
int length,
|
||||||
|
SearchListener searchListener,
|
||||||
|
RecordListener recordListener,
|
||||||
|
TimeoutListener timoutListener) throws IOException {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int searchPQF(String query, int offset, int length, SearchListener searchListener, RecordListener recordListener) throws IOException {
|
public int searchPQF(String query,
|
||||||
|
int offset,
|
||||||
|
int length,
|
||||||
|
SearchListener searchListener,
|
||||||
|
RecordListener recordListener,
|
||||||
|
TimeoutListener timeoutListener) throws IOException {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void scanPQF(String query, int nTerms, int step, int position, ScanListener scanListener) throws IOException {
|
public void scanPQF(String query,
|
||||||
|
int nTerms,
|
||||||
|
int step,
|
||||||
|
int position,
|
||||||
|
ScanListener scanListener,
|
||||||
|
TimeoutListener timeoutListener) throws IOException {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.xbib.z3950.common.cql;
|
|
|
@ -1,4 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.xbib.z3950.common.exceptions;
|
|
|
@ -1,4 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.xbib.z3950.common.operations;
|
|
|
@ -1,4 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.xbib.z3950.common.pqf;
|
|
|
@ -1,4 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.xbib.z3950.common.v3;
|
|
Loading…
Reference in a new issue