Java MSC服务正在处理WildFly 9,停止处理WildFly 10
我正在尝试将我们的web应用程序从Wildfly 9.0.2迁移到Wildfly 10.1.0 启动时,我们使用Flyway初始化数据库,并使用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,我了
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();
}