The only direct calls to AprStatus.isAprAvailable() outside of the
APRLifecycleListener itself are actually in Connector.java. Replacing
those by calls to the listener seems to work for me:
diff --git a/java/org/apache/catalina/connector/Connector.java
b/java/org/apache/catalina/connector/Connector.java
index 1cc15802eb..53a210e6b2 100644
--- a/java/org/apache/catalina/connector/Connector.java
+++ b/java/org/apache/catalina/connector/Connector.java
@@ -29,6 +29,7 @@ import org.apache.catalina.Globals;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.LifecycleState;
import org.apache.catalina.Service;
+import org.apache.catalina.core.AprLifecycleListener;
import org.apache.catalina.core.AprStatus;
import org.apache.catalina.util.LifecycleMBeanBase;
import org.apache.coyote.AbstractProtocol;
@@ -80,7 +81,7 @@ public class Connector extends LifecycleMBeanBase {
public Connector(String protocol) {
- boolean apr = AprStatus.isAprAvailable() &&
+ boolean apr = AprLifecycleListener.isAprAvailable() &&
AprStatus.getUseAprConnector();
ProtocolHandler p = null;
try {
@@ -1020,11 +1021,11 @@ public class Connector extends LifecycleMBeanBase {
throw new
LifecycleException(sm.getString("coyoteConnector.protocolHandlerNoAprListener",
getProtocolHandlerClassName()));
}
- if (protocolHandler.isAprRequired() &&
!AprStatus.isAprAvailable()) {
+ if (protocolHandler.isAprRequired() &&
!AprLifecycleListener.isAprAvailable()) {
throw new
LifecycleException(sm.getString("coyoteConnector.protocolHandlerNoAprLibrary",
getProtocolHandlerClassName()));
}
- if (AprStatus.isAprAvailable() && AprStatus.getUseOpenSSL() &&
+ if (AprLifecycleListener.isAprAvailable() &&
AprStatus.getUseOpenSSL() &&
protocolHandler instanceof AbstractHttp11JsseProtocol) {
AbstractHttp11JsseProtocol<?> jsseProtocolHandler =
(AbstractHttp11JsseProtocol<?>) protocolHandler;
Feel free to apply.
Regards,
Rainer
Am 07.04.2021 um 14:32 schrieb Rainer Jung:
I think the reason is:
o.a.c.connector.Connector checks AprStatus.isAprAvailable(). It
previously checked AprLifecycleListener.isAprAvailable(). The difference
is, that the old AprLifecycleListener.isAprAvailable() triggers the
init() of AprLifecycleListener, whereas AprStatus.isAprAvailable() does
not.
I think isAprAvailable() is the only method with side effects that was
moved from AprLifecycleListener to AprStatus. Since it is still
available in AprLifecycleListener, I think it would be safest to
typically not call it in AprStatus but instead in AprLifecycleListener.
Regards,
Rainer
Am 07.04.2021 um 14:02 schrieb Rainer Jung:
Maybe related to f4dac6846c548144799b1c3f33aba4eb320a3413.
Am 07.04.2021 um 13:53 schrieb Rainer Jung:
Hi there,
a colleague of mine observed a change in behavior starting with TC
9.0.38: until 9.0.37 the default server.xml with the connector
protocol="HTTP/1.1", installed tcnative and attribute
useAprConnector="true" for the AprLifecycleListener actually starts
an APR connector as documented and expected:
INFO [main] org.apache.coyote.AbstractProtocol.init Initializing
ProtocolHandler ["http-apr-8080"]
Same situation starting with 9.0.38 (and at least until 9.0.44):
INFO [main] org.apache.coyote.AbstractProtocol.init Initializing
ProtocolHandler ["http-nio-8080"]
I increased log level for a coupe of packages to FINEST and see the
following differences during startup:
FINE [main] org.apache.tomcat.util.IntrospectionUtils.setProperty
IntrospectionUtils: setProperty(class
org.apache.catalina.core.AprLifecycleListener SSLEngine=on)
FINE [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin
[SetPropertiesRule]{Server/Listener} Setting property
'useAprConnector' to 'true'
FINE [main] org.apache.tomcat.util.IntrospectionUtils.setProperty
IntrospectionUtils: setProperty(class
org.apache.catalina.core.AprLifecycleListener useAprConnector=true)
### ONLY ADDRESS DIFFERENCE
-FINE [main] org.apache.tomcat.util.digester.SetNextRule.end
[SetNextRule]{Server/Listener} Call
org.apache.catalina.core.StandardServer.addLifecycleListener(org.apache.catalina.core.AprLifecycleListener@383534aa)
+FINE [main] org.apache.tomcat.util.digester.SetNextRule.end
[SetNextRule]{Server/Listener} Call
org.apache.catalina.core.StandardServer.addLifecycleListener(org.apache.catalina.core.AprLifecycleListener@136432db)
FINE [main] org.apache.tomcat.util.IntrospectionUtils.callMethod1
IntrospectionUtils: callMethod1
org.apache.catalina.core.StandardServer
org.apache.catalina.core.AprLifecycleListener
org.apache.catalina.LifecycleListener
FINE [main] org.apache.tomcat.util.digester.ObjectCreateRule.end
[ObjectCreateRule]{Server/Listener} Pop
org.apache.catalina.core.AprLifecycleListener
#### WRONG CLASS CHOSEN IN NEWER VERSIONS
-FINE [main] org.apache.tomcat.util.IntrospectionUtils.setProperty
IntrospectionUtils: setProperty(class
org.apache.coyote.http11.Http11AprProtocol port=8080)
+FINE [main] org.apache.tomcat.util.IntrospectionUtils.setProperty
IntrospectionUtils: setProperty(class
org.apache.coyote.http11.Http11NioProtocol port=8080)
FINE [main] org.apache.tomcat.util.digester.SetPropertiesRule.begin
[SetPropertiesRule]{Server/Service/Connector} Setting property
'protocol' to 'HTTP/1.1'
...
and after these lines the logs use consistenly APR versus NIO in the
two versions. Both startup logs show the same
INFO [main]
org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded
Apache Tomcat Native library [1.2.27] using APR version [1.7.0].
INFO [main]
org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR
capabilities: IPv6 [true], sendfile [true], accept filters [false],
random [true].
INFO [main]
org.apache.catalina.core.AprLifecycleListener.lifecycleEvent
APR/OpenSSL configuration: useAprConnector [true], useOpenSSL [true]
INFO [main]
org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL
successfully initialized [OpenSSL 1.1.1k 25 Mar 2021]
I didn't find an obvious reason in the changelog. Maybe an unwanted
backport part from 10 or some startup order change.
I have not yet checked 8.5 etc.
Regards,
Rainer
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org
--
kippdata
informationstechnologie GmbH Tel: 0228 98549 -0
Bornheimer Str. 33a Fax: 0228 98549 -50
53111 Bonn www.kippdata.de
HRB 8018 Amtsgericht Bonn / USt.-IdNr. DE 196 457 417
Geschäftsführer: Dr. Thomas Höfer, Rainer Jung, Sven Maurmann
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org