【问题标题】:Websphere JNDI lookup fails while tried to create a thread from servlet to listen the rabbitmq queue尝试从 servlet 创建线程以侦听 rabbitmq 队列时,Websphere JNDI 查找失败
【发布时间】:2021-12-15 15:52:24
【问题描述】:

1

在查找 jdbc 数据源的 JNDI 连接时出现以下错误:

javax.naming.ConfigurationException:无法完成对“java:”名称的 JNDI 操作,因为服务器运行时无法将操作的线程与任何 J2EE 应用程序组件相关联。当使用“java:”名称的 JNDI 客户端未在服务器应用程序请求的线程上执行时,可能会发生这种情况。确保 J2EE 应用程序不会在静态代码块或由该 J2EE 应用程序创建的线程中对“java:”名称执行 JNDI 操作。此类代码不一定在服务器应用程序请求的线程上运行,因此对“java:”名称的 JNDI 操作不支持。 [根异常是 javax.naming.NameNotFoundException: Name not found in context "java:"。]

在服务器启动时,我创建了一个 servlet init 方法,我使用它来启动我的兔子 MQ 队列侦听器线程的线程池。每当队列中有消息时,我必须处理该消息并将其插入数据库。当尝试使用现有的插入数据库的代码时,在 WebSphere 服务器中获取上述 JNDI 异常。任何指针都会有所帮助。

【问题讨论】:

    标签: multithreading rabbitmq websphere jndi


    【解决方案1】:

    像您这样的非托管线程(从应用程序产生的线程)不受应用服务器的控制,并且无法访问托管 Java EE 上下文信息,因此不支持对“java:”名称进行 JNDI 操作。不要创建自己的线程池,而是使用 appserver 的。为了向您提供有关如何执行此操作的更多信息,我需要知道您使用的是 WebSphere 传统版还是 Liberty。

    【讨论】:

    • 请举一些例子来说明如何创建托管线程? ExecutorService 工作经理会工作吗?
    • 试过这个 InitialContext ctx = new InitialContext(); java.util.concurrent.ExecutorService execSvc = (java.util.concurrent.ExecutorService)ctx.lookup("java:comp/env/UserTransaction");但是得到相同的 NameNotFound 异常
    • ExecutorService 是 Java SE 的一部分,您需要 Java EE 版本 ManagedExecutorService。此页面提供了为 Liberty 应用服务器配置和使用此服务的示例。
    • 忘记添加上述评论的网址:ibm.com/docs/en/was-liberty/…
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多