com.gemstone.gemfire.cache.client.internal.SingleHopOperationCallable Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gemfire-core Show documentation
Show all versions of gemfire-core Show documentation
SnappyData store based off Pivotal GemFireXD
The newest version!
/*
* Copyright (c) 2010-2015 Pivotal Software, Inc. All rights reserved.
*
* 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. See accompanying
* LICENSE file.
*/
package com.gemstone.gemfire.cache.client.internal;
import java.util.concurrent.Callable;
import com.gemstone.gemfire.cache.client.AllConnectionsInUseException;
import com.gemstone.gemfire.cache.client.internal.ExecuteRegionFunctionOp.ExecuteRegionFunctionOpImpl;
import com.gemstone.gemfire.cache.client.internal.ExecuteRegionFunctionSingleHopOp.ExecuteRegionFunctionSingleHopOpImpl;
import com.gemstone.gemfire.distributed.internal.ServerLocation;
/**
*
* @author ymahajan
*
*/
public class SingleHopOperationCallable implements Callable {
final private ServerLocation server;
final private PoolImpl pool;
final private AbstractOp op;
final private UserAttributes securityAttributes;
public SingleHopOperationCallable(ServerLocation server, PoolImpl pool,
AbstractOp op, UserAttributes securityAttributes) {
this.server = server;
this.pool = pool;
this.op = op;
this.securityAttributes = securityAttributes;
}
public Object call() throws Exception {
op.initMessagePart();
Object result = null;
boolean onlyUseExistingCnx = ((pool.getMaxConnections() != -1 && pool
.getConnectionCount() >= pool.getMaxConnections()) ? true : false);
try {
UserAttributes.userAttributes.set(securityAttributes);
result = this.pool.executeOn(server, op, true, onlyUseExistingCnx);
}
catch (AllConnectionsInUseException ex) {
// if we reached connection limit and don't have available connection to
// that server,then execute function on one of the connections available
// from other servers instead of creating new connection to the original
// server
if (op instanceof ExecuteRegionFunctionSingleHopOpImpl){
ExecuteRegionFunctionSingleHopOpImpl newop = (ExecuteRegionFunctionSingleHopOpImpl)op;
result = this.pool.execute(new ExecuteRegionFunctionOpImpl(newop));
}else {
result = this.pool.execute(this.op);
}
}
finally {
UserAttributes.userAttributes.set(null);
}
return result;
}
public ServerLocation getServer() {
return this.server;
}
public AbstractOp getOperation() {
return this.op;
}
}