📄 jk_worker_status.c
字号:
} s->jkprintf(env, s, "</table>\n"); jk2_worker_status_displayAggregate( env, s, totalReq, totalErr, totalTime, maxTime);}/** Use 'introspection' data to find what getters an type support, * and display the information in a table */static void jk2_worker_status_displayRuntimeType(jk_env_t *env, jk_ws_service_t *s, jk_workerEnv_t *wenv, char *type){ jk_map_t *map=wenv->initData; int i; int needHeader=JK_TRUE; for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) { char *name=env->_objects->nameAt( env, env->_objects, i ); jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i ); int j; /* Don't display aliases */ if( strchr(name, ':')==NULL ) continue; if( mbean==NULL || mbean->getAttributeInfo==NULL ) continue; if( mbean->getAttribute == NULL ) continue; if( strncmp( type, mbean->type, 5 ) != 0 ) continue; if( needHeader ) { s->jkprintf(env, s, "<H3>%s runtime info</H3>\n", JK_CHECK_NULL(type) ); s->jkprintf(env, s, "<p>%s information, using getAttribute() </p>\n", JK_CHECK_NULL(type) ); s->jkprintf(env, s, "<table border>\n"); s->jkprintf(env, s, "<tr><th>id</th>\n"); s->jkprintf(env, s, "<th>name</th>\n"); for( j=0; mbean->getAttributeInfo[j] != NULL; j++ ) { char *pname=mbean->getAttributeInfo[j]; s->jkprintf(env, s, "<th>%s</th>", JK_CHECK_NULL(pname) ); } needHeader = JK_FALSE; } s->jkprintf(env, s, "</tr><tr><td>%d</td><td>%s</td>\n", mbean->id, JK_CHECK_NULL(mbean->localName)); for( j=0; mbean->getAttributeInfo[j] != NULL; j++ ) { char *pname=mbean->getAttributeInfo[j]; s->jkprintf(env, s, "<td>%s</td>", JK_CHECK_NULL(mbean->getAttribute( env, mbean, pname))); } } if( ! needHeader ) { s->jkprintf( env,s , "</table>\n" ); }}static void jk2_worker_status_resetScoreboard(jk_env_t *env, jk_ws_service_t *s, jk_workerEnv_t *wenv){ int i, j; if( wenv->shm==NULL || wenv->shm->head==NULL) { return; } for( i=1; i < wenv->shm->head->lastSlot; i++ ) { jk_shm_slot_t *slot= wenv->shm->getSlot( env, wenv->shm, i ); if( slot==NULL ) continue; if( strncmp( slot->name, "epStat", 6 ) == 0 ) { /* This is an endpoint slot */ void *data=slot->data; for( j=0; j<slot->structCnt ; j++ ) { jk_stat_t *statArray=(jk_stat_t *)data; jk_stat_t *stat=statArray + j; stat->reqCnt=0; stat->errCnt=0;#ifdef HAS_APR stat->totalTime=0; stat->maxTime=0;#endif } } } }/** That's the 'bulk' data - everything that was configured, after substitution */static void jk2_worker_status_displayActiveProperties(jk_env_t *env, jk_ws_service_t *s, jk_workerEnv_t *wenv){ jk_map_t *map=wenv->initData; int i; s->jkprintf(env, s, "<H3>Processed config</H3>\n"); s->jkprintf(env, s, "<p>All settings ( automatic and configured ), after substitution</p>\n"); s->jkprintf(env, s, "<table border>\n"); s->jkprintf(env, s, "<tr><th>Name</th><th>Value</td></tr>\n"); for( i=0; i< map->size( env, map ) ; i++ ) { char *name=map->nameAt( env, map, i ); char *value=(char *)map->valueAt( env, map,i ); s->jkprintf(env, s, "<tr><td>%s</td><td>%s</td></tr>", JK_CHECK_NULL(name), JK_CHECK_NULL(value)); } s->jkprintf(env, s, "</table>\n");}/** persistent configuration */static void jk2_worker_status_displayConfigProperties(jk_env_t *env, jk_ws_service_t *s, jk_workerEnv_t *wenv){ int i; s->jkprintf(env, s, "<H3>Configured Properties</H3>\n"); s->jkprintf(env, s, "<p>Original data set by user</p>\n"); s->jkprintf(env, s, "<table border>\n"); s->jkprintf(env, s, "<tr><th>Object name</th><th>Property</th><th>Value</td></tr>\n"); for( i=0; i < env->_objects->size( env, env->_objects ); i++ ) { char *name=env->_objects->nameAt( env, env->_objects, i ); jk_bean_t *mbean=env->_objects->valueAt( env, env->_objects, i ); int j; int propCount; /* Don't display aliases */ if( strchr(name, ':')==NULL ) continue; if( mbean==NULL || mbean->settings==NULL ) continue; propCount=mbean->settings->size( env, mbean->settings ); if( propCount==0 ) { s->jkprintf(env, s, "<tr><th>%s</th><td></td></tr>", JK_CHECK_NULL(mbean->name) ); } else { s->jkprintf(env, s, "<tr><th rowspan='%d'>%s</th><td>%s</td><td>%s</td></tr>", propCount, JK_CHECK_NULL(mbean->name), JK_CHECK_NULL(mbean->settings->nameAt( env, mbean->settings, 0)), JK_CHECK_NULL(mbean->settings->valueAt( env, mbean->settings, 0))); for( j=1; j < propCount ; j++ ) { char *pname=mbean->settings->nameAt( env, mbean->settings, j); /* Don't save redundant information */ if( strcmp( pname, "name" ) != 0 ) { s->jkprintf(env, s, "<tr><td>%s</td><td>%s</td></tr>", JK_CHECK_NULL(pname), JK_CHECK_NULL(mbean->settings->valueAt( env, mbean->settings, j))); } } } } s->jkprintf( env,s , "</table>\n" );} static int JK_METHOD jk2_worker_status_service(jk_env_t *env, jk_worker_t *w, jk_ws_service_t *s){ char *uri=s->req_uri; int didUpdate; if( w->mbean->debug > 0 ) env->l->jkLog(env, env->l, JK_LOG_DEBUG, "status.service() %s %s\n", JK_CHECK_NULL(uri), JK_CHECK_NULL(s->query_string)); /* Generate the header */ s->status=200; s->msg="OK"; s->headers_out->put(env, s->headers_out, "Content-Type", "text/html", NULL); s->head(env, s ); /** Process the query string. */ if( s->query_string == NULL ) { s->query_string="get=*"; } if( strcmp( s->query_string, "scoreboard.reset" ) == 0 ) { jk2_worker_status_resetScoreboard(env, s, s->workerEnv ); } w->workerEnv->config->update( env, w->workerEnv->config, &didUpdate ); if( didUpdate ) { jk_shm_t *shm=w->workerEnv->shm; /* Update the scoreboard's version - all other jk2 processes will see this and update */ if( shm!=NULL && shm->head!=NULL ) shm->head->lbVer++; s->jkprintf(env, s, "Updated config %d", shm->head->lbVer ); } s->jkprintf(env, s, "Status information for child %d", s->workerEnv->childId ); /* Body */ jk2_worker_status_displayRuntimeType(env, s, s->workerEnv, "ajp13" ); jk2_worker_status_displayScoreboardInfo(env, s, s->workerEnv ); jk2_worker_status_displayEndpointInfo( env, s, s->workerEnv ); jk2_worker_status_displayRuntimeType(env, s, s->workerEnv, "uri" ); jk2_worker_status_displayConfigProperties(env, s, s->workerEnv ); jk2_worker_status_displayActiveProperties(env, s, s->workerEnv ); s->afterRequest( env, s); return JK_OK;}int JK_METHOD jk2_worker_status_factory(jk_env_t *env, jk_pool_t *pool, jk_bean_t *result, const char *type, const char *name){ jk_worker_t *_this; _this = (jk_worker_t *)pool->calloc(env, pool, sizeof(jk_worker_t)); if(_this==NULL) { env->l->jkLog(env, env->l, JK_LOG_ERROR, "status_worker.factory() OutOfMemoryException\n"); return JK_ERR; } _this->service = jk2_worker_status_service; result->object=_this; _this->mbean=result; _this->workerEnv=env->getByName( env, "workerEnv" ); _this->workerEnv->addWorker( env, _this->workerEnv, _this ); return JK_OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -