用什么方法是java应用程序作为一个后台服务运行
wrapper
~
~
~
~
你指的是什么后台,你可以自己搭个tomcat服务器发布web项目。
在Windows中,无法直接用Java产生Service程序;但是可能通过编写DCOM 或 MTS COM 或 COM+(Window2000) 组件 或 Corba 来模拟Service程序,可以实现透明远程过程调用;StdAfx.h
#if !defined(AFX_STDAFX_H__7CCCEEAD_83A0_11D4_B105_000021E19FBF__INCLUDED_)
#define AFX_STDAFX_H__7CCCEEAD_83A0_11D4_B105_000021E19FBF__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsvc.h>
#endif
//----------------------------------------------------------------
service.h
// Service.h: interface for the CService class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SERVICE_H__7CCCEEB1_83A0_11D4_B105_000021E19FBF__INCLUDED_)
#define AFX_SERVICE_H__7CCCEEB1_83A0_11D4_B105_000021E19FBF__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
typedef struct T_SERVICE
{
char ServiceName[128];
char DisplayName[128];
char ExecutePath[_MAX_PATH];
}T_SERVICE;
BOOL LoadServiceSetting(const char* ServiceName,T_SERVICE* pService);
BOOL SaveServiceSetting(T_SERVICE* pService);
void DeleteServiceSetting(const char* ServiceName);
int outputerr(DWORD nErr=0);
inline BOOL outputerr(long nErr)
{
outputerr((DWORD)nErr);
return FALSE;
}
#ifdef _DEBUGLOG
#define WRITELOG writelog
void writelog(const char* fmt,...);
#else
#define WRITELOG
#endif
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
#endif // !defined(AFX_SERVICE_H__7CCCEEB1_83A0_11D4_B105_000021E19FBF__INCLUDED_)
//----------------------------------------------------------------
StdAfx.cpp
#include "stdafx.h"
//----------------------------------------------------------------
Service.cpp
// Service.cpp: implementation of the CService class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Service.h"
const char REG_PATH[] = "Software\\Free\\ServiceAny";
const char REG_DISPLAYNAME[] = "DisplayName";
const char REG_SERVICENAME[] = "ServiceName";
const char REG_EXECUTEPATH[] = "ExecutePath";
void DeleteServiceSetting(const char* ServiceName)
{
char temp[1024];
sprintf(temp,"%s\\%s",REG_PATH,ServiceName);
::RegDeleteKey(HKEY_LOCAL_MACHINE,temp);
}
BOOL LoadServiceSetting(const char* ServiceName,T_SERVICE* pService)
{
char temp[1024];
sprintf(temp,"%s\\%s",REG_PATH,ServiceName);
HKEY hKey=NULL;
long r = ::RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
temp,NULL,KEY_READ,&hKey);
if (r != 0)
return outputerr(r);
DWORD Type=0;
DWORD cbtemp = sizeof(temp);
r = ::RegQueryValueEx(hKey,REG_SERVICENAME,NULL,&Type,(LPBYTE)temp,&cbtemp);
if (r != 0 || Type != REG_SZ)
{
::RegCloseKey(hKey);
return outputerr(r);
}
strcpy(pService->ServiceName,temp);
cbtemp = sizeof(temp);
r = ::RegQueryValueEx(hKey,REG_DISPLAYNAME,NULL,&Type,(LPBYTE)temp,&cbtemp);
if (r == 0 && Type == REG_SZ)
strcpy(pService->DisplayName,temp);
else
strcpy(pService->DisplayName,pService->ServiceName);
cbtemp = sizeof(temp);
r = ::RegQueryValueEx(hKey,REG_EXECUTEPATH,NULL,&Type,(LPBYTE)temp,&cbtemp);
if (r != 0 || Type != REG_SZ)
{
::RegCloseKey(hKey);
return outputerr(r);
}
strcpy(pService->ExecutePath,temp);
::RegCloseKey(hKey);
return TRUE;
}
static LONG SetRegValue(HKEY hKey,const char* Name,const char* Value)
{
return ::RegSetValueEx(hKey,Name,NULL,REG_SZ,(CONST BYTE*)Value,strlen(Value)+1);
}
BOOL SaveServiceSetting(T_SERVICE* pService)
{
char temp[1024];
sprintf(temp,"%s\\%s",REG_PATH,pService->ServiceName);
HKEY hKey=NULL;
DWORD cbtemp=0;
long r = ::RegCreateKeyEx(
HKEY_LOCAL_MACHINE,temp,NULL,
"",NULL,KEY_WRITE,NULL,&hKey,&cbtemp);
if (r != 0)
return outputerr(r);
if (strlen(pService->DisplayName)==0)
{
strcpy(pService->DisplayName,pService->ServiceName);
}
r = SetRegValue(hKey,REG_SERVICENAME,pService->ServiceName);
if (r != 0)
{
::RegCloseKey(hKey);
return outputerr(r);
}
r = SetRegValue(hKey,REG_DISPLAYNAME,pService->DisplayName);
if (r != 0)
{
::RegCloseKey(hKey);
return outputerr(r);
}
r = SetRegValue(hKey,REG_EXECUTEPATH,pService->ExecutePath);
if (r != 0)
{
::RegCloseKey(hKey);
return outputerr(r);
}
::RegCloseKey(hKey);
return TRUE;
}
#ifdef _DEBUGLOG
void writelog(const char* fmt,...)
{
char msg[2048];
va_list arg;
va_start(arg, fmt);
vsprintf(msg, fmt, arg);
va_end(arg);
FILE* f = fopen("f:\\SrvAny.log","at");
fprintf(f,"%s",msg);
fclose(f);
}
#endif
static char ServiceName[128];
BOOL bLogError = FALSE;
void LogEvent(const char* fmt,...)
{
char msg[2048];
HANDLE hEventSource;
LPTSTR lpszStrings[1];
va_list arg;
va_start(arg, fmt);
vsprintf(msg, fmt, arg);
va_end(arg);
lpszStrings[0] = msg;
hEventSource = RegisterEventSource(NULL, ServiceName);
if (hEventSource != NULL)
{
/* Write to event log. */
ReportEvent(hEventSource,
bLogError?EVENTLOG_ERROR_TYPE:EVENTLOG_INFORMATION_TYPE,
0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
DeregisterEventSource(hEventSource);
}
printf("%s",msg);
}
static SERVICE_STATUS_HANDLE hServiceStatus=NULL;
static SERVICE_STATUS ServiceStatus;
static T_SERVICE Service;
static HANDLE hShutdownEvent=NULL;
static HANDLE hThread=NULL;
DWORD MainThreadId=0;
void SetServiceStatus(DWORD status)
{
ServiceStatus.dwCurrentState = status;
::SetServiceStatus(hServiceStatus,&ServiceStatus);
}
void LogError(DWORD nErr=0)
{
if (nErr==0)
nErr = ::GetLastError();
char temp[1024];
DWORD dwLen = ::FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,
nErr,NULL,temp,sizeof(temp),NULL);
if (dwLen > 0)
temp[dwLen] = NULL;
else
temp[0] = NULL;
bLogError = TRUE;
LogEvent("Win32 Error(%d) %s\n",nErr,temp);
ServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
ServiceStatus.dwServiceSpecificExitCode = nErr;
}
static void WINAPI ServiceHandler(DWORD dwOpcode)
{
switch (dwOpcode)
{
case SERVICE_CONTROL_STOP:
case SERVICE_CONTROL_SHUTDOWN:
SetServiceStatus(SERVICE_STOP_PENDING);
PostThreadMessage(MainThreadId, WM_QUIT, 0, 0);
break;
case SERVICE_CONTROL_PAUSE:
case SERVICE_CONTROL_CONTINUE:
case SERVICE_CONTROL_INTERROGATE:
default:
break;
}
}
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
char CommandLine[2048];
strcpy(CommandLine,Service.ExecutePath);
if (lpParameter != NULL && strlen((const char*)lpParameter)>0)
{
strcat(CommandLine," ");
strcat(CommandLine,(const char*)lpParameter);
}
char exedir[_MAX_PATH];
strcpy(exedir,Service.ExecutePath);
int n = strlen(exedir);
for(int i=n-1;i>=0;i--)
{
char c = exedir[i];
exedir[i] = NULL;
if (c == '\\')
break;
}
if (!::CreateProcess(
Service.ExecutePath,CommandLine,
NULL,NULL,TRUE,
NULL,NULL,exedir,&si,&pi))
{
LogError();
LogEvent("can't CreateProcess %s\n",CommandLine);
::PostThreadMessage(MainThreadId, WM_QUIT, 0, 0);
return (DWORD)-1;
}
SetServiceStatus(SERVICE_RUNNING);
HANDLE events[2];
events[0] = pi.hProcess;
events[1] = hShutdownEvent;
DWORD r = ::WaitForMultipleObjects(2,events,FALSE,INFINITE);
if (r != WAIT_OBJECT_0)
{
::PostThreadMessage(pi.dwThreadId,WM_QUIT,0,0);
DWORD r1 = ::WaitForSingleObject(pi.hProcess,10000);
if (r1 == WAIT_TIMEOUT)
{
LogEvent("Can't stop %s normally.\n",Service.ExecutePath);
::TerminateProcess(pi.hProcess,-1);
}
}
if (r != WAIT_OBJECT_0 + 1)
{
::PostThreadMessage(MainThreadId, WM_QUIT, 0, 0);
}
DWORD ec=-1;
::GetExitCodeProcess(pi.hProcess,&ec);
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
return ec;
}
VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
WRITELOG("in ServiceMain,argc=%d\n",dwArgc);
for(DWORD ii=0;ii<dwArgc;ii++)
{
WRITELOG("argv[%d] = %s\n",ii,lpszArgv[ii]);
}
WRITELOG("\n");
strcpy(ServiceName, lpszArgv[0]);
char param[2048];
param[0] = NULL;
for (DWORD i=1;i<dwArgc;i++)
{
if (i > 1)
strcat(param," ");
if (strchr(lpszArgv[i],' ') == NULL)
strcat(param,lpszArgv[i]);
else
{
strcat(param,"\"");
strcat(param,lpszArgv[i]);
strcat(param,"\"");
}
}
MainThreadId = ::GetCurrentThreadId();
ZeroMemory(&ServiceStatus,sizeof(ServiceStatus));
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
hServiceStatus = RegisterServiceCtrlHandler(ServiceName, ServiceHandler);
SetServiceStatus(SERVICE_START_PENDING);
if (!LoadServiceSetting(ServiceName,&Service))
LogEvent("Can't find Service Setting for '%s'\n",ServiceName);
else
{
hShutdownEvent = ::CreateEvent(NULL,TRUE,FALSE,NULL);
DWORD ThreadId=0;
hThread = ::CreateThread(NULL,NULL,ThreadProc,param,NULL,&ThreadId);
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
SetEvent(hShutdownEvent);
WaitForSingleObject(hThread,INFINITE);
::CloseHandle(hThread);
::CloseHandle(hShutdownEvent);
}
SetServiceStatus(SERVICE_STOPPED);
}
//----------------------------------------------------------------
SrvAny.cpp
// SrvAny.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <crtdbg.h>
#include "Service.h"
int RegisterService(const char* ServiceName,const char* DisplayName,const char* ExecutePath);
int UnregisterService(const char* ServiceName);
int outputerr(DWORD nErr)
{
if (nErr==0)
nErr = ::GetLastError();
_ASSERT(nErr != 0);
char temp[1024];
DWORD dwLen = ::FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,
nErr,NULL,temp,sizeof(temp),NULL);
printf("Win32 Error(%d)",nErr);
if (dwLen > 0)
printf("\t%s",temp);
printf("\n");
return -1;
}
int usage()
{
printf("SrvAny usage\n");
printf("\t/s ServiceName [DisplayName] ExecutePath\tRegister Service\n");
printf("\t/u ServiceName \tUnregister Service\n");
printf("\n");
return -1;
}
int main(int argc, char* argv[])
{
WRITELOG("in main,argc=%d\n",argc);
for(int i=0;i<argc;i++)
{
WRITELOG("argv[%d] = %s\n",i,argv[i]);
}
WRITELOG("\n");
if (argc == 1)
{
SERVICE_TABLE_ENTRY st[] =
{
{ "", ServiceMain },
{ NULL, NULL }
};
if (!::StartServiceCtrlDispatcher(st))
return usage();
else
return 0;
}
if (strcmp(argv[1],"/?")==0)
return usage();
if (strcmp(argv[1],"/s")==0)
{
if (argc == 4)
return RegisterService(argv[2],argv[2],argv[3]);
if (argc == 5)
return RegisterService(argv[2],argv[3],argv[4]);
return usage();
}
if (strcmp(argv[1],"/u")==0)
{
if (argc != 3)
return usage();
else
wrapper ~~~~~~~ 这个工具不错
java是什么?
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
JAVA中的方法是什么意思
Java中的方法就是将用户将数据和数据的操作定义为一个整体,可以这样定义:返回类型 方法名(参数){方法体} 比如:int add(int a,int b){ return a+b;}
java中main()方法是哪个类里面的方法?
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方 法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等。在看Java中的main()方法之前,先看一个...
什么是“JAVA”?
从此,开始了Java应用的新篇章。 Java的诞生是对传统计算机模式的挑战,对计算机软件开发和软件产业都产生了深远的影响: (1)软件4A目标要求软件能达到任何人在任何地方在任何时间对任何电子设备都能应用。这样能满足软件平台上互相操作,具有可伸缩性和重用性并可即插即用等分布式计算模式的需求。 (2)基于构建开发方法...
java中main()方法是哪个类里面的方法?
java中main()方法是哪个类里面的方法? 在Java中,main()方法是Java应用程式的入口方法,也就是说,程式在执行的时候,第一个执行的方法就是main()方法,这个方法和其他的方 法有很大的不同,比如方法的名字必须是main,方法必须是public static void 型别的,方法必须接收一个字串阵列的引数等等...
java中什么是方法,方法的作用是什么
按照抽象来理解,方法是实现具体的功能的。方法:方法名()属性:属性名 例如:数组中的属性是:length String中的方法是:length();
Java中方法介绍?
注意:在一些其它语言中方法指过程和函数。一个返回非void类型返回值的方法称为函数;一个返回void类型返回值的方法叫做过程。实例 下面的方法包含2个参数num1和num2,它返回这两个参数的最大值。\/**返回两个整型变量数据的较大值*\/ 在Java中,方法的定义方式类似于其他语言,尤其与C和C++很类似。
JAVA中构造方法,例项方法,类方法,有什么区别?
至于例项方法可以理解为类的中普通方法,就是我们在类中自己建立定义的。 行为差异:构造方法,建立物件后自动呼叫构造方法,例项方法必须物件.例项方法进行呼叫。 功能差异:构造方法多用于初始化物件状态,对属性赋初值,例项方法用于实现某个功能 java中构造方法和方法有什么区别 我不知道怎么和你解释,所以在网上找了点...
学习java最好的方法是什么?
因此,仅仅提高编程技术还不够,你还需要注意提高单元测试的技术。学习单元测试的途径有很多,比如线上和线下的课程。但是,最好的方法是实践单元测试,并确保你的测试技术能够达到要求。4、移动Java开发 预计在未来几年中,移动应用程序的开发将以飞快的速度增长。有报告称,2020年,全球智能手机的销量有...
java到底是什么?
●Java应用程序接口(Java API)。(3)Java分为三个体系,分别为Java SE(J2SE,Java2 Platform Standard Edition,标准版),JavaEE(J2EE,Java 2 Platform, Enterprise Edition,企业版),Java ME(J2ME,Java 2 Platform Micro Edition,微型版)。(4)java相关 抽象类:规定一个或多个抽象方法的...
右卖格来: wrapper ~~~~~~~ 这个工具不错
尤溪县19634527887: java中main()方法是哪个类里面的方法? - ?
右卖格来: 在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方 法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须...
尤溪县19634527887: 一个JAVA程序是从什么方法开始执行的 - ?
右卖格来: mian方法是程序的入口,先执行它
尤溪县19634527887: 学习JAVA后能编出什么样的程序 - ?
右卖格来: 可以的,你所见的所有程序都可以用Java开发,之所以有些程序不用Java是考虑平台结合性和效率的问题,和FoxPro一样开发管理系统当然可以,Oracle就是用Java开发的
尤溪县19634527887: 如何用Eclipse建立一个Java应用程序 - ?
右卖格来: 首先要在eclipse上安装JDT,然后再新建java程序
尤溪县19634527887: 编译java程序的命令是什么?运行java应用程序的命令是什么?? - ?
右卖格来: 当前默认目录为C盘Users文件夹下的Administrator文件夹.一般而言,我们习惯改变当前目录.由于windows有磁盘分区,若要跳到其他磁盘,例如E盘,有几种方法: 1、输入命令: pushd 路径(此命令可将当前目录设为所希望的任一个已存...
尤溪县19634527887: Java Application是什么,怎么编写相应程序 - ?
右卖格来: java Application 就是Java应用程序 public class Student {public static void main(String[] args) {Student student = new Student();} }
尤溪县19634527887: 如何将java应用程序做成类似可执行文件的形式 - ?
右卖格来: 工具exe4j.exe可以实现.并且生成的执行文件可以在任何未安装JAVA虚拟机的机器上运行.1、打开exe4j.exe,根据引导界面,配置“Project Type”,设置为exe模式;2、选择相应的项目路径;3、设置编译的虚拟机,最后点击完成即可;除此之外,还可以使用maven工具,maven下的assemble可帮助把项目打包成带bat或者sh可执行文件的目录结构,运行即可.