Java MSC服务正在处理WildFly 9,停止处理WildFly 10

Java MSC服务正在处理WildFly 9,停止处理WildFly 10,java,service,wildfly-10,Java,Service,Wildfly 10,我正在尝试将我们的web应用程序从Wildfly 9.0.2迁移到Wildfly 10.1.0 启动时,我们使用Flyway初始化数据库,并使用org.jboss.msc.service.service进行初始化。它在WF9上运行良好,但在WF10上失败了,我不知道我们做错了什么 在ApplicationScoped类中,我们这样调用服务(为了问题的清晰,我稍微重写了代码): 试图查看ServiceController实现,它似乎没有等待,因为它认为服务已经启动 通过阅读服务javadoc,我了

我正在尝试将我们的web应用程序从Wildfly 9.0.2迁移到Wildfly 10.1.0

启动时,我们使用Flyway初始化数据库,并使用
org.jboss.msc.service.service
进行初始化。它在WF9上运行良好,但在WF10上失败了,我不知道我们做错了什么

在ApplicationScoped类中,我们这样调用服务(为了问题的清晰,我稍微重写了代码):

试图查看
ServiceController
实现,它似乎没有等待,因为它认为服务已经启动

通过阅读服务javadoc,我了解到如果
start()
方法正在执行一些可能阻塞或等待的操作,我们必须调用
context.asynchronous()
,但我找不到任何正确使用该方法的示例。我试过了,但没有成功:

public void start(StartContext context) throws StartException
{
    context.asynchronous();
    context.execute(new Runnable()
    {
        @Override
        public void run()
        {
            check = check();
        }
    });
    context.complete();
}

是什么导致WF10中出现此问题,而WF9中没有?我做错了什么?

最简单的解决方案可能是使方法
同步化
。对我来说似乎有点像黑客,但它确实有效:)不太好。我的意思是服务应该是线程安全的,因为代码片段看起来不像是线程安全的。我不知道
waitvalue
方法是什么样子的,所以您可能在那里处理它。有点晚了,但对于其他可能有类似问题的方法:
context.complete()
/
context.failed(…)
必须在
可运行的
中调用。这些方法表示服务初始化已完成。您的
context.complete()
可能在线程拾取
Runnable
之前被调用。另外:不要使用
context.execute(…)
来阻止任务,如javadoc中所述。更好的方法是解析服务器
Executor服务
Services.addServerExecutorDependency(…)
/
服务.requireServerExecutor(…)
)。最后,
awaitValue
在当前的WildFly版本中被弃用最简单的解决方案可能是使方法
同步化。我的意思是服务应该是线程安全的,因为代码片段看起来不像是线程安全的。我不知道
waitvalue
方法是什么样子的,所以您可能在那里处理它。有点晚了,但对于其他可能有类似问题的方法:
context.complete()
/
context.failed(…)
必须在
可运行的
中调用。这些方法表示服务初始化已完成。您的
context.complete()
可能在线程拾取
Runnable
之前被调用。另外:不要使用
context.execute(…)
来阻止任务,如javadoc中所述。更好的方法是解析服务器
Executor服务
Services.addServerExecutorDependency(…)
/
服务.requireServerExecutor(…)
)。最后,
waitvalue
在当前的WildFly版本中被弃用
public class DatabaseSingletonService implements Service<Boolean>
{
    private Boolean check;

    @Override
    public Boolean getValue() throws IllegalStateException, IllegalArgumentException
    {
        System.out.println("getValue: " + check);
        return check;
    }

    @Override
    public void start(StartContext context) throws StartException
    {
        System.out.println("start");
        check = /* flyway calls and other processes, returning true */
        System.out.println("check now is: " + check);
    }
}
> (MSC service thread 1-4) start
> (thread-1,ee,pc-xp)      getValue: null
> (MSC service thread 1-4) check now is: true
public void start(StartContext context) throws StartException
{
    context.asynchronous();
    context.execute(new Runnable()
    {
        @Override
        public void run()
        {
            check = check();
        }
    });
    context.complete();
}