启动 bean 在调用 Produces 后加载
Startup bean is loading after calling Produces
我的应用程序中有两个模块,其中第一个模块有一个单例启动 bean,我将本地服务绑定为 JNDI 资源。在第二个模块中,我有一个生产者,我想在其中查找此资源,但在整个生命周期中遇到问题,因为 Produces 在启动 Bean 之前开始调用,结果加载资源失败。这是我的代码:
@Slf4j
@Singleton
@Startup
public class WebSocketServerActivator {
private static final Logger LOG = LoggerFactory.getLogger(WebSocketServerActivator.class);
private void startServer() {
try {
WebSocketServer webSocketServer = WebSocketServer.getInstance();
webSocketServer.setHost("localhost");
webSocketServer.setPort(9900);
webSocketServer.initialize();
InitialContext ic = new InitialContext();
ic.rebind(WebSocketSQLService.WEBSOCKET_SQL_JNDI, SQLRequestManager.getInstance());
} catch (Exception e) {
LOG.error("Error while starting webSocket in start activator ", e);
}
}
@PostConstruct
public void postConstruct() {
startServer();
}
}
这是其他模块中的生产者class:
public class WebSocketServiceLocator {
@Produces
public WebSocketSQLService getWebSocketService(
@JndiStringResource(value = "visma.websocket.server", defaultValue = WebSocketSQLService.WEBSOCKET_SQL_JNDI)
Supplier<String> websocketServerName
) {
return (WebSocketSQLService) lookupService(websocketServerName.get());
}
private Object lookupService(String lookupName) {
try {
InitialContext ic = new InitialContext();
return ic.lookup(lookupName);
} catch (NamingException e) {
throw new RuntimeException("Cannot find " + lookupName, e);
}
}
}
有人能告诉我为什么 @startup bean 在 WebSocketServiceLocator 之后加载吗?
根据标签,您使用的 ejb-3.0 尚未提供 @Startup。
如果您使用的是 3.1,也许您可以创建 @Startup Singletons 并使用 @DependsOn 来定义 bean 的序列。
see
我的应用程序中有两个模块,其中第一个模块有一个单例启动 bean,我将本地服务绑定为 JNDI 资源。在第二个模块中,我有一个生产者,我想在其中查找此资源,但在整个生命周期中遇到问题,因为 Produces 在启动 Bean 之前开始调用,结果加载资源失败。这是我的代码:
@Slf4j
@Singleton
@Startup
public class WebSocketServerActivator {
private static final Logger LOG = LoggerFactory.getLogger(WebSocketServerActivator.class);
private void startServer() {
try {
WebSocketServer webSocketServer = WebSocketServer.getInstance();
webSocketServer.setHost("localhost");
webSocketServer.setPort(9900);
webSocketServer.initialize();
InitialContext ic = new InitialContext();
ic.rebind(WebSocketSQLService.WEBSOCKET_SQL_JNDI, SQLRequestManager.getInstance());
} catch (Exception e) {
LOG.error("Error while starting webSocket in start activator ", e);
}
}
@PostConstruct
public void postConstruct() {
startServer();
}
}
这是其他模块中的生产者class:
public class WebSocketServiceLocator {
@Produces
public WebSocketSQLService getWebSocketService(
@JndiStringResource(value = "visma.websocket.server", defaultValue = WebSocketSQLService.WEBSOCKET_SQL_JNDI)
Supplier<String> websocketServerName
) {
return (WebSocketSQLService) lookupService(websocketServerName.get());
}
private Object lookupService(String lookupName) {
try {
InitialContext ic = new InitialContext();
return ic.lookup(lookupName);
} catch (NamingException e) {
throw new RuntimeException("Cannot find " + lookupName, e);
}
}
}
有人能告诉我为什么 @startup bean 在 WebSocketServiceLocator 之后加载吗?
根据标签,您使用的 ejb-3.0 尚未提供 @Startup。 如果您使用的是 3.1,也许您可以创建 @Startup Singletons 并使用 @DependsOn 来定义 bean 的序列。 see