20
20
import java.net.Socket;
21
21
import java.util.concurrent.ConcurrentHashMap;
22
import java.util.concurrent.ConcurrentLinkedQueue;
23
import java.util.concurrent.atomic.AtomicInteger;
24
import java.util.concurrent.atomic.AtomicLong;
26
import javax.management.ObjectName;
28
import org.apache.coyote.RequestGroupInfo;
29
import org.apache.coyote.RequestInfo;
23
import org.apache.coyote.AbstractProtocol;
30
24
import org.apache.juli.logging.Log;
31
25
import org.apache.juli.logging.LogFactory;
32
26
import org.apache.tomcat.util.ExceptionUtils;
33
import org.apache.tomcat.util.modeler.Registry;
34
27
import org.apache.tomcat.util.net.AbstractEndpoint;
35
28
import org.apache.tomcat.util.net.JIoEndpoint;
36
29
import org.apache.tomcat.util.net.JIoEndpoint.Handler;
95
88
// -------------------------------------- AjpConnectionHandler Inner Class
98
protected static class AjpConnectionHandler implements Handler {
91
protected static class AjpConnectionHandler
92
extends AbstractConnectionHandler implements Handler {
100
94
protected AjpProtocol proto;
101
protected AtomicLong registerCount = new AtomicLong(0);
102
protected RequestGroupInfo global = new RequestGroupInfo();
104
96
protected ConcurrentHashMap<SocketWrapper<Socket>, AjpProcessor> connections =
105
97
new ConcurrentHashMap<SocketWrapper<Socket>, AjpProcessor>();
107
protected ConcurrentLinkedQueue<AjpProcessor> recycledProcessors =
108
new ConcurrentLinkedQueue<AjpProcessor>() {
109
private static final long serialVersionUID = 1L;
110
protected AtomicInteger size = new AtomicInteger(0);
112
public boolean offer(AjpProcessor processor) {
113
boolean offer = (proto.processorCache == -1) ? true : (size.get() < proto.processorCache);
114
//avoid over growing our cache or add after we have stopped
115
boolean result = false;
117
result = super.offer(processor);
119
size.incrementAndGet();
122
if (!result) unregister(processor);
127
public AjpProcessor poll() {
128
AjpProcessor result = super.poll();
129
if ( result != null ) {
130
size.decrementAndGet();
136
public void clear() {
137
AjpProcessor next = poll();
138
while ( next != null ) {
99
protected RecycledProcessors<AjpProcessor> recycledProcessors =
100
new RecycledProcessors<AjpProcessor>(this);
147
102
public AjpConnectionHandler(AjpProtocol proto) {
148
103
this.proto = proto;
152
public Object getGlobal() {
107
protected AbstractProtocol getProtocol() {
112
protected Log getLog() {
227
187
register(processor);
228
188
return processor;
231
protected void register(AjpProcessor processor) {
232
if (proto.getDomain() != null) {
233
synchronized (this) {
235
long count = registerCount.incrementAndGet();
236
RequestInfo rp = processor.getRequest().getRequestProcessor();
237
rp.setGlobalProcessor(global);
238
ObjectName rpName = new ObjectName
239
(proto.getDomain() + ":type=RequestProcessor,worker="
240
+ proto.getName() + ",name=AjpRequest" + count);
241
if (log.isDebugEnabled()) {
242
log.debug("Register " + rpName);
244
Registry.getRegistry(null, null).registerComponent(rp, rpName, null);
245
rp.setRpName(rpName);
246
} catch (Exception e) {
247
log.warn("Error registering request");
253
protected void unregister(AjpProcessor processor) {
254
if (proto.getDomain() != null) {
255
synchronized (this) {
257
RequestInfo rp = processor.getRequest().getRequestProcessor();
258
rp.setGlobalProcessor(null);
259
ObjectName rpName = rp.getRpName();
260
if (log.isDebugEnabled()) {
261
log.debug("Unregister " + rpName);
263
Registry.getRegistry(null, null).unregisterComponent(rpName);
265
} catch (Exception e) {
266
log.warn("Error unregistering request", e);