I need help on my as400 and java connection.
I am experiencing problem on receiving late response during SocketTimeoutExceptions. So what happen is that when i send the first request and response timeout occured, after sending my second request, the response for the first request is received, which creates discrepancy.
Is there a way that after the timeout exception, the response should not cache or should not be received upon next request?
Below is the snippet of my code to connect to the as400 server:
public synchronized static byte[] sendRequestAndGetResponse(byte[] requestBytes) {
try {
if(checkHostConnection()){
LOG.debug("Sending request bytes to Host: {}", Hexifier.toHex(requestBytes));
IOUtils.write(requestBytes, dos);
long startTime = System.currentTimeMillis();
LOG.info("Request sent to host.");
LOG.info("Waiting on host response");
byte[] responseLengthBuffer = new byte[4];
IOUtils.readFully(dis, responseLengthBuffer);
ByteBuffer bb = ByteBuffer.wrap(responseLengthBuffer);
int msgLength = bb.getInt();
byte[] responseRemBytes = new byte[msgLength];
IOUtils.readFully(dis, responseRemBytes);
long endTime = System.currentTimeMillis();
byte[] fullResponseBytes = new byte[responseLengthBuffer.length + responseRemBytes.length];
System.arraycopy(responseLengthBuffer, 0, fullResponseBytes, 0, responseLengthBuffer.length);
System.arraycopy(responseRemBytes, 0, fullResponseBytes, responseLengthBuffer.length, responseRemBytes.length);
LOG.debug("Response from server is received. Time elapsed at {} millis.", (endTime - startTime));
LOG.debug("Bytes received: {}", Hexifier.toHex(fullResponseBytes));
return fullResponseBytes;
} else {
reconnectToHost();
}
} catch (SocketTimeoutException ste){
LOG.error("Reading response from socket timeout: {}", ste.getClass().getName());
try {
LOG.warn("Waiting for Host reply from its socket timeout.");
socket.shutdownInput();
socket.shutdownOutput();
int hostResponsefromTimeout = dis.read();
if (hostResponsefromTimeout == -1){
LOG.debug("Host has responded with -1");
} else {
LOG.debug("Host responded with: {}", hostResponsefromTimeout);
}
} catch (Exception e){
LOG.error("Error encountered while trying to validate if Host responded with last timeout.");
LOG.error(e.getMessage(), e);
}
reconnectToHost();
} catch (EOFException eofe) {
LOG.debug("An error occurred while reading stream from Host socket connection: {}", eofe.getClass().getName());
LOG.error(eofe.getMessage(), eofe);
if (eofe.getMessage() != null && eofe.getMessage().contains("actual: 0")){
LOG.warn("No bytes were found at stream. Host did not respond.");
}
reconnectToHost();
} catch (SocketException e) {
LOG.error("An error occurred while attempting to connect to Host: {}", e.getClass().getName());
LOG.error(e.getMessage(), e);
if (e.getMessage().contains("Broken pipe")){
LOG.debug("Connection to Host was lost.");
}
reconnectToHost();
} catch (Exception e) {
LOG.error(e.getMessage(), e);
LOG.debug("An error occurred while attempting to connect to Host: {}", e.getClass().getName());
reconnectToHost();
}
return null;
}