我有一个java项目,它符合可执行jar文件v-agent-exe.jar。这个jar是一个日志服务器,日志行被发送到它进行处理。 我可以使用以下命令执行它:
`java -jar v-agent-exe.jar -a watch -f config.ini`.
执行后,此jar文件将在端口1235创建一个ServerSocket,并侦听来自客户端的传入数据。收到数据后,程序将处理数据并将结果发送回客户端。当我从CMD窗口执行jar时,处理工作正常。
现在我尝试将Jar文件包装为Windows服务(我使用的是Windows 10)。我创建了一个" Windows服务项目" 在Visual Studio中,如下所示: - 来电类有 call()方法来使用进程执行jar文件。 - AgentService 是在另一个线程中执行 Caller-> call()的服务。 - 计划是加载 AgentService 的主要条目。
Caller.cs
public class Caller
{
static Process proc;
public Process GetProcess(){
return proc;
}
public void call() {
try
{
String dir = AppDomain.CurrentDomain.BaseDirectory;
proc = new Process
{
StartInfo = new ProcessStartInfo
{
WorkingDirectory = dir,
FileName = "java.exe",
Arguments = @"-jar v-agent-exe.jar -a watch -f config.ini",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true,
CreateNoWindow = true
}
};
proc.Start();
while (!proc.StandardError.EndOfStream)
{
string line = proc.StandardError.ReadLine();
}
}
catch (Exception ex) {
VAgentService.writeLog("Error when call process: " + ex.Message);
}
}
}
AgentService
public partial class AgentService : ServiceBase
{
private string jarPath;
private string iniPath;
static Process proc;
Caller caller;
public AgentService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
writeLog("On start");
try
{
caller = new Caller();
writeLog("Prepare to launch thread");
Thread t = new Thread(new ThreadStart(caller.call));
t.Start();
}
catch (Exception ex)
{
EventLog.WriteEntry("Demo error: " + ex.Message);
}
}
protected override void OnStop()
{
proc = caller.GetProcess();
if (proc != null && !proc.HasExited)
{
proc.Kill();
}
else
{
...
}
}
}
Program.cs的
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main(String[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new AgentService()
};
ServiceBase.Run(ServicesToRun);
}
}
构建服务项目后,我有AgentService.exe。 我使用以下命令将其安装到我的系统中:
sc create VAgentLogging binpath= %CD%\AgentService.exe depend= lmhosts start= auto
在service.msc中启动服务后,我可以telnet到端口&#34; 1235&#34; java进程正在监听(我确定 只有在这个端口运行的jar)。根据 java程序的日志,它仍然可以接收部分数据,但似乎无法发送回客户端或其他东西, 导致后续过程无法完成。 我认为我的问题是:jar文件可以作为独立执行,但在我的服务项目中包装时,它会以某种方式糟透了。 我尚未发布jar代码,因为我认为该错误与Windows服务项目有关。如果你需要java代码,请告诉我,我会在这里更新。 任何帮助将不胜感激。