TI CC981H Sensium™芯片SFR配置实战:从寄存器原理到ECG/温度传感驱动开发
2026/6/30 8:14:36
xml
<Server port="8005" shutdown="SHUTDOWN"> <!-- 1.属性说明 port:指定一个端口,这个端口负责监听关闭Tomcat的请求 shutdown:向以上端口发送的关闭服务器的命令字符串 --> <!-- 2.Listener 相关 --> <Listener className="org.apache.catalina.core.AprLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/> <!-- 3.GlobalNamingResources 相关 --> <GlobalNamingResources> <Environment name="simpleValue" type="java.lang.Integer" value="30"/> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <!-- 4.service 相关 --> <Service name="Catalina"> </Service> </Server>
java
/** * @return the port number we listen to for shutdown commands. * * @see #getPortOffset() * @see #getPortWithOffset() */ public int getPort(); /** * Set the port number we listen to for shutdown commands. * * @param port The new port number * * @see #setPortOffset(int) */ public void setPort(int port); /** * Get the number that offsets the port used for shutdown commands. * For example, if port is 8005, and portOffset is 1000, * the server listens at 9005. * * @return the port offset */ public int getPortOffset(); /** * Set the number that offsets the server port used for shutdown commands. * For example, if port is 8005, and you set portOffset to 1000, * connector listens at 9005. * * @param portOffset sets the port offset */ public void setPortOffset(int portOffset); /** * Get the actual port on which server is listening for the shutdown commands. * If you do not set port offset, port is returned. If you set * port offset, port offset + port is returned. * * @return the port with offset */ public int getPortWithOffset(); /** * @return the address on which we listen to for shutdown commands. */ public String getAddress(); /** * Set the address on which we listen to for shutdown commands. * * @param address The new address */ public void setAddress(String address); /** * @return the shutdown command string we are waiting for. */ public String getShutdown(); /** * Set the shutdown command we are waiting for. * * @param shutdown The new shutdown command */ public void setShutdown(String shutdown); /** * Get the utility thread count. * @return the thread count */ public int getUtilityThreads(); /** * Set the utility thread count. * @param utilityThreads the new thread count */ public void setUtilityThreads(int utilityThreads);
| 属性 | 描述 |
|---|---|
| className | 使用的Java类名称。此类必须实现org.apache.catalina.Server接口。如果未指定类名,则将使用标准实现。 |
| address | 该服务器等待关闭命令的TCP / IP地址。如果未指定地址,localhost则使用。 |
| port | 该服务器等待关闭命令的TCP / IP端口号。设置为-1禁用关闭端口。注意:当使用Apache Commons Daemon启动Tomcat (在Windows上作为服务运行,或者在un * xes上使用jsvc运行)时,禁用关闭端口非常有效。但是,当使用标准shell脚本运行Tomcat时,不能使用它,因为它将阻止shutdown.bat |
| portOffset | 应用于port和嵌套到任何嵌套连接器的端口的偏移量。它必须是一个非负整数。如果未指定,0则使用默认值。 |
| shutdown | 为了关闭Tomcat,必须通过与指定端口号的TCP / IP连接接收的命令字符串。 |
| utilityThreads | 此service中用于各种实用程序任务(包括重复执行的线程)的线程数。特殊值0将导致使用该值 Runtime.getRuntime().availableProcessors()。Runtime.getRuntime().availableProcessors() + value除非小于1,否则将使用负值, 在这种情况下将使用1个线程。预设值是1。 |
java
/** * @return the global naming resources. */ public NamingResourcesImpl getGlobalNamingResources(); /** * Set the global naming resources. * * @param globalNamingResources The new global naming resources */ public void setGlobalNamingResources (NamingResourcesImpl globalNamingResources); /** * @return the global naming resources context. */ public javax.naming.Context getGlobalNamingContext();
java
/** * Add a new Service to the set of defined Services. * * @param service The Service to be added */ public void addService(Service service); /** * Wait until a proper shutdown command is received, then return. */ public void await(); /** * Find the specified Service * * @param name Name of the Service to be returned * @return the specified Service, or <code>null</code> if none exists. */ public Service findService(String name); /** * @return the set of Services defined within this Server. */ public Service[] findServices(); /** * Remove the specified Service from the set associated from this * Server. * * @param service The Service to be removed */ public void removeService(Service service);
java
// 此service中用于各种实用程序任务(包括重复执行的线程)的线程数 @Override public int getUtilityThreads() { return utilityThreads; } /** * 获取内部进程数计算逻辑: * > 0时,即utilityThreads的值。 * <=0时,Runtime.getRuntime().availableProcessors() + result... */ private static int getUtilityThreadsInternal(int utilityThreads) { int result = utilityThreads; if (result <= 0) { result = Runtime.getRuntime().availableProcessors() + result; if (result < 2) { result = 2; } } return result; } @Override public void setUtilityThreads(int utilityThreads) { // Use local copies to ensure thread safety int oldUtilityThreads = this.utilityThreads; if (getUtilityThreadsInternal(utilityThreads) < getUtilityThreadsInternal(oldUtilityThreads)) { return; } this.utilityThreads = utilityThreads; if (oldUtilityThreads != utilityThreads && utilityExecutor != null) { reconfigureUtilityExecutor(getUtilityThreadsInternal(utilityThreads)); } } // 线程池 private synchronized void reconfigureUtilityExecutor(int threads) { // The ScheduledThreadPoolExecutor doesn't use MaximumPoolSize, only CorePoolSize is available if (utilityExecutor != null) { utilityExecutor.setCorePoolSize(threads); } else { ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(threads, new TaskThreadFactory("Catalina-utility-", utilityThreadsAsDaemon, Thread.MIN_PRIORITY)); scheduledThreadPoolExecutor.setKeepAliveTime(10, TimeUnit.SECONDS); scheduledThreadPoolExecutor.setRemoveOnCancelPolicy(true); scheduledThreadPoolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); utilityExecutor = scheduledThreadPoolExecutor; utilityExecutorWrapper = new org.apache.tomcat.util.threads.ScheduledThreadPoolExecutor(utilityExecutor); } } /** * Get if the utility threads are daemon threads. * @return the threads daemon flag */ public boolean getUtilityThreadsAsDaemon() { return utilityThreadsAsDaemon; } /** * Set the utility threads daemon flag. The default value is true. * @param utilityThreadsAsDaemon the new thread daemon flag */ public void setUtilityThreadsAsDaemon(boolean utilityThreadsAsDaemon) { this.utilityThreadsAsDaemon = utilityThreadsAsDaemon; }里面的方法都很简单。
java
/** * Add a new Service to the set of defined Services. * * @param service The Service to be added */ @Override public void addService(Service service) { service.setServer(this); synchronized (servicesLock) { Service results[] = new Service[services.length + 1]; System.arraycopy(services, 0, results, 0, services.length); results[services.length] = service; services = results; if (getState().isAvailable()) { try { service.start(); } catch (LifecycleException e) { // Ignore } } // Report this property change to interested listeners support.firePropertyChange("service", null, service); } } public void stopAwait() { stopAwait=true; Thread t = awaitThread; if (t != null) { ServerSocket s = awaitSocket; if (s != null) { awaitSocket = null; try { s.close(); } catch (IOException e) { // Ignored } } t.interrupt(); try { t.join(1000); } catch (InterruptedException e) { // Ignored } } } /** * Wait until a proper shutdown command is received, then return. * This keeps the main thread alive - the thread pool listening for http * connections is daemon threads. */ @Override public void await() { // Negative values - don't wait on port - tomcat is embedded or we just don't like ports if (getPortWithOffset() == -2) { // undocumented yet - for embedding apps that are around, alive. return; } if (getPortWithOffset() == -1) { try { awaitThread = Thread.currentThread(); while(!stopAwait) { try { Thread.sleep( 10000 ); } catch( InterruptedException ex ) { // continue and check the flag } } } finally { awaitThread = null; } return; } // Set up a server socket to wait on try { awaitSocket = new ServerSocket(getPortWithOffset(), 1, InetAddress.getByName(address)); } catch (IOException e) { log.error(sm.getString("standardServer.awaitSocket.fail", address, String.valueOf(getPortWithOffset()), String.valueOf(getPort()), String.valueOf(getPortOffset())), e); return; } try { awaitThread = Thread.currentThread(); // Loop waiting for a connection and a valid command while (!stopAwait) { ServerSocket serverSocket = awaitSocket; if (serverSocket == null) { break; } // Wait for the next connection Socket socket = null; StringBuilder command = new StringBuilder(); try { InputStream stream; long acceptStartTime = System.currentTimeMillis(); try { socket = serverSocket.accept(); socket.setSoTimeout(10 * 1000); // Ten seconds stream = socket.getInputStream(); } catch (SocketTimeoutException ste) { // This should never happen but bug 56684 suggests that // it does. log.warn(sm.getString("standardServer.accept.timeout", Long.valueOf(System.currentTimeMillis() - acceptStartTime)), ste); continue;