在Jerry的微信公众号文章里提到SAP Fiori应用以BSP应用的方式部署在ABAP Front-End Server上。那么这些BSP应用在运行时为什么能够接受和发送HTTP请求呢?
主要是下图的Internet Communication Manager(ICM)在起作用。
The Internet Communication Manager ensures that communication between the SAP System (SAP NetWeaver Application Server) and the outside world via HTTP, HTTPS and SMTP protocols works properly. The ICM is a component of the SAP NetWeaver Application Server. It is implemented as a separate process, which is started and monitored by the ABAP dispatcher.
即ICM作为沟通的桥梁,确保Netweaver应用服务器和外界能够通过HTTP,HTTPS等协议交互。ICM是Netweaver应用服务器的一个组件,作为一个单独的工作进程,由ABAP dispatcher启动并监控。
1. ICM本身维护了一个工作线程池。有一个专属的控制线程,负责接收进来的TCP/IP请求,然后从线程池中唤醒一个工作线程来响应该请求。 2. 每个工作线程包含一个I/O处理器,负责网络输入输出。工作线程通过各种各样的plugin处理HTTP,SMTP等协议。
假设我本地开发了一个Java Web应用,里面包含一个Servlet,部署到CloudFoundry后,该应用如何运行起来的? 细心观察cf push的日志,不难自己找出答案。 因为我的manifest.yml里定义的buildpack为java_buildpack:
这对应了cf push日志里高亮的这一行:
下载Open JDK JRE和Tomcat instance。
为什么会自动下载tomcat? 上面提到了原因:
The Tomcat Container allows servlet 2 and 3 web applications to be run. These applications are run as the root web application in a Tomcat container.
一旦buildpack检测到war包中存在WEB-INF,且不存在Java Main(实现了main方法的Java类),则决定使用Tomcat容器。
实际上从cf push的日志里也能观察到tomcat容器启动参数:
“JAVA_OPTS=\”-agentpath:PWD/.java−buildpack/openjdkjre/bin/jvmkill−1.13.0RELEASE=printHeapHistogram=1−Djava.io.tmpdir=PWD/.java−buildpack/openjdkjre/bin/jvmkill−1.13.0RELEASE=printHeapHistogram=1−Djava.io.tmpdir=PWD/.java-buildpack/open_jdk_jre/bin/jvmkill-1.13.0_RELEASE=printHeapHistogram=1 -Djava.io.tmpdir=TMPDIR -Djava.ext.dirs=PWD/.java−buildpack/containersecurityprovider:PWD/.java−buildpack/containersecurityprovider:PWD/.java-buildpack/container_security_provider:PWD/.java-buildpack/open_jdk_jre/lib/ext -Djava.security.properties=PWD/.java−buildpack/javasecurity/java.securityPWD/.java−buildpack/javasecurity/java.securityPWD/.java-buildpack/java_security/java.security JAVA_OPTS -Daccess.logging.enabled=false -Dhttp.port=PORT\" && CALCULATED_MEMORY=PORT\" && CALCULATED_MEMORY=PORT\" && CALCULATED_MEMORY=(PWD/.java−buildpack/openjdkjre/bin/java−buildpack−memory−calculator−3.13.0RELEASE−totMemory=PWD/.java−buildpack/openjdkjre/bin/java−buildpack−memory−calculator−3.13.0RELEASE−totMemory=PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-3.13.0_RELEASE -totMemory=MEMORY_LIMIT -loadedClasses=11021 -poolType=metaspace -stackThreads=250 -vmOptions=\”JAVA_OPTS\") && echo JVM Memory Configuration:JAVA_OPTS\") && echo JVM Memory Configuration:JAVA_OPTS\") && echo JVM Memory Configuration: CALCULATED_MEMORY && JAVA_OPTS=\”JAVAOPTSJAVAOPTSJAVA_OPTS CALCULATED_MEMORY\” && MALLOC_ARENA_MAX=2 JAVA_OPTS=JAVAOPTSJAVAHOME=JAVAOPTSJAVAHOME=JAVA_OPTS JAVA_HOME=PWD/.java-buildpack/open_jdk_jre exec $PWD/.java-buildpack/tomcat/bin/catalina.sh run”,
最后一行的$PWD/.java-buildpack/tomcat/bin/catalina.sh run是我们非常熟悉的tomcat启动脚本。