【问题标题】:Startup bean is loading after calling Produces调用 Produces 后正在加载启动 bean
【发布时间】:2017-12-30 12:56:49
【问题描述】:

我的应用程序中有两个模块,其中第一个模块有一个单例启动 bean,我将本地服务绑定为 JNDI 资源。在第二个模块中,我有一个 Producer,我想在其中查找此资源,但在整个生命周期中遇到问题,因为 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();
    }

}

这是其他模块中的 Producer 类:

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 之后加载?

【问题讨论】:

    标签: java jakarta-ee ejb-3.0


    【解决方案1】:

    根据您使用的 ejb-3.0 的标签,它还没有提供 @Startup。 如果您使用的是 3.1,也许您可​​以同时创建 @Startup Singletons 并使用 @DependsOn 来定义 bean 的序列。 see

    【讨论】:

    • 你知道当两个 EJB 都在不同的模块中时@DependsOn 是如何应用的吗?
    • 模块应该不是问题,应该是 EJB 名称。 @Singleton(name = "某事")
    • 实际上它造成了一个问题,我有另一个单例 EJB(TestSingleton) 在 WebSocketServerActivator EJB 之前激活。我尝试在 TestSingleton 上使用 @DependsOn("WebSocketServerActivator") 并收到以下错误:java.lang.RuntimeException: Invalid DependsOn dependency 'WebSocketServerActivator' for EJB TestSingleton。它们都在单独的模块中。
    • 我从来没有遇到过这个问题,所以我只能写下,我将如何进行。是“命名问题”吗?在没有 DependsOn 的部署之后,我会查看名称是什么,因此部署可以工作。并使用该名称。它是依赖关系不明确的多模块问题吗?我会尝试通过避免圈子来解决这些问题。这是一个常见的多模块问题吗?我会尝试说服 maven,将所有内容放入一个模块中。也许进一步谷歌/搜索 EAR + DependsOn 也会有所帮助。
    • 将这些 EJB 组合在同一个模块中解决问题。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 2019-12-06
    • 2023-03-21
    • 1970-01-01
    • 2011-03-31
    • 2014-05-29
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多