use of org.apache.openejb.client.ServerMetaData in project tomee by apache.
the class BasicClusterableRequestHandler method updateServer.
@Override
public void updateServer(final BeanContext beanContext, final ClusterableRequest req, final ClusterableResponse res) {
final Container container = beanContext.getContainer();
if (container instanceof ClusteredRPCContainer) {
final ClusteredRPCContainer clusteredContainer = (ClusteredRPCContainer) container;
final URI[] locations = clusteredContainer.getLocations(beanContext);
if (null != locations) {
final ServerMetaData server = new ServerMetaData(locations);
if (req.getServerHash() != server.buildHash()) {
res.setServer(server);
}
}
}
}
use of org.apache.openejb.client.ServerMetaData in project tomee by apache.
the class EjbDaemon method service.
public void service(final InputStream rawIn, final OutputStream rawOut) throws IOException {
final ProtocolMetaData clientProtocol = new ProtocolMetaData();
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
RequestType requestType = null;
byte requestTypeByte = RequestType.NOP_REQUEST.getCode();
try {
final RequestInfos.RequestInfo info = RequestInfos.info();
info.setInputStream(countStreams ? new CountingInputStream(rawIn) : rawIn);
// Read client Protocol Version
final InputStream cis = info.getInputStream();
clientProtocol.readExternal(cis);
ois = new EjbObjectInputStream(cis);
// Read ServerMetaData
final ServerMetaData serverMetaData = new ServerMetaData();
serverMetaData.readExternal(ois);
ClientObjectFactory.serverMetaData.set(serverMetaData);
// Read request type
requestTypeByte = ois.readByte();
requestType = RequestType.valueOf(requestTypeByte);
if (requestType == RequestType.NOP_REQUEST) {
return;
}
ClusterResponse clusterResponse = null;
if (requestType == RequestType.CLUSTER_REQUEST) {
clusterResponse = clusterHandler.processRequest(ois, clientProtocol);
//Check for immediate failure
final Throwable failure = clusterResponse.getFailure();
if (null != clusterResponse && null != failure) {
clusterHandler.getLogger().debug("Failed to write to ClusterResponse", failure);
try {
info.setOutputStream(countStreams ? new CountingOutputStream(rawOut) : rawOut);
oos = new ObjectOutputStream(info.getOutputStream());
clusterResponse.setMetaData(clientProtocol);
clusterResponse.writeExternal(oos);
oos.flush();
} catch (IOException ie) {
final String m = "Failed to write to ClusterResponse: " + ie.getMessage();
clusterHandler.getLogger().error(m, ie);
throw Exceptions.newIOException(m, ie);
}
throw failure;
}
}
requestTypeByte = ois.readByte();
requestType = RequestType.valueOf(requestTypeByte);
if (requestType == RequestType.NOP_REQUEST) {
return;
}
// Exceptions should not be thrown from these methods
// They should handle their own exceptions and clean
// things up with the client accordingly.
final Response response;
switch(requestType) {
case EJB_REQUEST:
response = processEjbRequest(ois, clientProtocol);
break;
case JNDI_REQUEST:
response = processJndiRequest(ois, clientProtocol);
break;
case AUTH_REQUEST:
response = processAuthRequest(ois, clientProtocol);
break;
case LOGOUT_REQUEST:
response = processLogoutRequest(ois, clientProtocol);
break;
default:
logger.error("\"" + requestType + " " + clientProtocol.getSpec() + "\" FAIL \"Unknown request type " + requestType);
return;
}
try {
info.setOutputStream(countStreams ? new CountingOutputStream(rawOut) : rawOut);
final OutputStream cos = info.getOutputStream();
//Let client know we are using the requested protocol to respond
clientProtocol.writeExternal(cos);
cos.flush();
oos = new ObjectOutputStream(cos);
clusterHandler.processResponse(clusterResponse, oos, clientProtocol);
oos.flush();
} finally {
switch(requestType) {
case EJB_REQUEST:
processEjbResponse(response, oos, clientProtocol);
break;
case JNDI_REQUEST:
processJndiResponse(response, oos, clientProtocol);
break;
case AUTH_REQUEST:
processAuthResponse(response, oos, clientProtocol);
break;
case LOGOUT_REQUEST:
processLogoutResponse(response, oos, clientProtocol);
break;
default:
//Should never get here...
logger.error("\"" + requestType + " " + clientProtocol.getSpec() + "\" FAIL \"Unknown response type " + requestType);
}
}
} catch (IllegalArgumentException iae) {
final String msg = "\"" + clientProtocol.getSpec() + "\" FAIL \"Unknown request type " + requestTypeByte;
if (logger.isDebugEnabled()) {
logger.debug(msg, iae);
} else {
logger.warning(msg + " - Debug for StackTrace");
}
} catch (SecurityException e) {
final String msg = "\"" + requestType + " " + clientProtocol.getSpec() + "\" FAIL \"Security error - " + e.getMessage() + "\"";
if (logger.isDebugEnabled()) {
logger.debug(msg, e);
} else {
logger.warning(msg + " - Debug for StackTrace");
}
} catch (Throwable e) {
final String msg = "\"" + requestType + " " + clientProtocol.getSpec() + "\" FAIL \"Unexpected error - " + e.getMessage() + "\"";
if (logger.isDebugEnabled()) {
logger.debug(msg, e);
} else {
logger.warning(msg + " - Debug for StackTrace");
}
} finally {
try {
ClientObjectFactory.serverMetaData.remove();
} finally {
if (null != oos) {
try {
oos.flush();
} catch (Throwable e) {
//Ignore
}
try {
oos.close();
} catch (Throwable e) {
//Ignore
}
}
if (null != ois) {
try {
ois.close();
} catch (Throwable e) {
//Ignore
}
}
// enforced in case of exception
securityService.disassociate();
}
}
}
use of org.apache.openejb.client.ServerMetaData in project tomee by apache.
the class BasicClusterableRequestHandlerTest method testUpdateServerWhenRequestHashDiffersFromServerSideHash.
public void testUpdateServerWhenRequestHashDiffersFromServerSideHash() throws Exception {
final int port = SystemInstance.get().getOptions().get("ejbd.port", 4201);
final URI[] locations = new URI[] { new URI("ejbd://localhost:" + port) };
ServerMetaData server = new ServerMetaData(locations);
beanContext.setContainer(clusteredContainer);
request.getServerHash();
modify().returnValue(server.buildHash() + 1);
response.setServer(null);
modify().args(new AbstractExpression() {
@Override
public void describeWith(ExpressionDescriber arg0) throws IOException {
}
@Override
public boolean passes(Object arg0) {
ServerMetaData actualServer = (ServerMetaData) arg0;
assertSame(locations, actualServer.getLocations());
return true;
}
});
clusteredContainer.getLocations(beanContext);
modify().returnValue(locations);
startVerification();
requestHandler.updateServer(beanContext, request, response);
}
use of org.apache.openejb.client.ServerMetaData in project tomee by apache.
the class BasicClusterableRequestHandlerTest method testServerIsNotUpdatedWhenRequestHashEqualsServerSideHash.
public void testServerIsNotUpdatedWhenRequestHashEqualsServerSideHash() throws Exception {
final int port = SystemInstance.get().getOptions().get("ejbd.port", 4201);
URI[] locations = new URI[] { new URI("ejbd://localhost:" + port) };
ServerMetaData server = new ServerMetaData(locations);
beanContext.setContainer(clusteredContainer);
request.getServerHash();
modify().returnValue(server.buildHash());
clusteredContainer.getLocations(beanContext);
modify().returnValue(locations);
startVerification();
requestHandler.updateServer(beanContext, request, response);
}
Aggregations