Jar文件在独立运行时工作但在Windows服务

时间:2017-08-14 01:52:04

标签: java c# windows windows-services executable-jar

我有一个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代码,请告诉我,我会在这里更新。 任何帮助将不胜感激。

0 个答案:

没有答案