gpt4 book ai didi

java - SpringBoot Tomcat内嵌全局JNDI资源

转载 作者:行者123 更新时间:2023-11-28 22:25:39 25 4
gpt4 key购买 nike

我知道有很多关于tomcat embedded中JNDI Resources的问题,但是我尝试了所有我找到的解决方案都没有成功。

我有一个为我的客户公开 Rest API 的应用程序。在这个应用程序中,我们有一个使用 JMS 和 Amazon SQS 的异步解决方案。该应用程序使用第三方库,使用 JNDI 获取 sql.Datasource,因此,我需要使用 JNDI 数据源。

问题是,当应用程序在 Rest Controller 的同一线程中调用此库时,JNDI 查找工作,并获取数据源。

当我的@JmsListener 调用这个库时,我得到一个 NamingNotFoungException。

我在代码的两点中使用了 context.list("java") 并确认在 JmsListener 内部没有 JNDI 上下文。

我的tomcat工厂类: 配置公共(public)类 CustomTomcatEmbeddedServletContainerFactory {

@Value("${spring.log.datasource.jndiName}")
private String logJndiName;

@Value("${spring.log.datasource.password}")
private String logPassword;

@Value("${spring.log.datasource.url}")
private String logUrl;

@Value("${spring.log.datasource.username}")
private String logUsername;

@Bean
public TomcatEmbeddedServletContainerFactory tomcatFactory() {
return new TomcatEmbeddedServletContainerFactory() {

@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
tomcat.enableNaming();

return super.getTomcatEmbeddedServletContainer(tomcat);
}

@Override
protected void postProcessContext(Context context) {
// LogDS
context.getNamingResources()
.addResource(
getContextResource(logJndiName, logUrl, logUsername, logPassword)
);
ContextResourceLink contextResourceLink = new
ContextResourceLink();
contextResourceLink.setGlobal(logJndiName);
contextResourceLink.setName(logJndiName);
contextResourceLink.setType("javax.sql.DataSource");
context.getNamingResources().addResourceLink(contextResourceLink);

}

private ContextResource getContextResource(
final String name
, final String url
, final String username
, final String password
) {
ContextResource resource = new ContextResource();
resource.setName(name);
resource.setType(DataSource.class.getName());
resource.setProperty("factory", "com.zaxxer.hikari.HikariJNDIFactory");
resource.setProperty("jdbcUrl", url);
resource.setProperty("dataSource.user", username);
resource.setProperty("dataSource.password", AESCrypto.decrypt(password));
resource.setScope("Sharable");
return resource;
}
};
}
}

知道这个问题吗?

--------更新------------

当我使用下面的代码时,JMSListener 中的上下文解决了,但我的 RestController 不再响应,出现 404 http 状态。

 protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(Tomcat tomcat) {
tomcat.enableNaming();
TomcatEmbeddedServletContainer container = super.getTomcatEmbeddedServletContainer(tomcat);
for (Container child : container.getTomcat().getHost().findChildren()) {
if (child instanceof Context) {
ClassLoader contextClassLoader = ((Context) child).getLoader().getClassLoader();
Thread.currentThread().setContextClassLoader(contextClassLoader);
break;
}
}
return container;
}

--------更新2--------我的问题已解决。我没有像上面说的那样返回“容器”,而是返回 super.getTomcatEmbeddedServletContainer(tomcat);我的第一次更新中的手动 GlobalContext 运行良好!

最佳答案

我的问题已经解决了。我没有像上面说的那样返回“容器”,而是返回 super.getTomcatEmbeddedServletContainer(tomcat);我的第一次更新中的手动 GlobalContext 运行良好!

关于java - SpringBoot Tomcat内嵌全局JNDI资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46259504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com