Java 使用Spring在weblogic中启动服务器时启动线程

Java 使用Spring在weblogic中启动服务器时启动线程,java,multithreading,spring,weblogic,Java,Multithreading,Spring,Weblogic,我想在服务器启动时启动一个线程。我的线程从数据库中提取数据并将其放入JMS队列中。所有bean都在Spring配置文件中定义。JMS队列和DB连接工厂(connection-factory)在weblogic上配置。 我正在尝试将我的线程起始代码放入contextInitialized方法的ContextLoaderListener或init方法的servlet。但是,在启动服务器时,我遇到以下异常: 嵌套异常是 javax.naming.NoPermissionException: 用户匿名没

我想在服务器启动时启动一个线程。我的线程从数据库中提取数据并将其放入JMS队列中。所有bean都在Spring配置文件中定义。JMS队列和DB连接工厂(connection-factory)在weblogic上配置。 我正在尝试将我的线程起始代码放入
contextInitialized
方法的
ContextLoaderListener
init
方法的
servlet
。但是,在启动服务器时,我遇到以下异常

嵌套异常是 javax.naming.NoPermissionException: 用户匿名没有 连接到工厂的权限 执行查找操作

如果我将代码放在Servlet的doGet方法中,并在服务器启动后点击url,那么我的代码就可以完美地工作。但是我不想手动启动线程

我认为我得到这个错误是因为所有bean都没有正确初始化


我应该将代码放在哪里,以便在服务器启动后线程自动启动?

如果您正在创建自己的线程,则最有可能出现问题。在任何应用程序服务器中,您都应该让容器管理线程池,并安排您可能想要运行的任何作业

将此添加到web.xml:

<resource-ref>
    <res-ref-name>timer/MyTimer/res-ref-name>
    <res-type>commonj.timers.TimerManager</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
在你的语境中,(……)做什么

在我的项目中,我找不到任何关于在应用服务器级别配置计时器的信息,所以我猜它“正常工作”

如果要异步生成作业(通过
java.lang.concurrent.Executor
接口),过程类似,但需要在Weblogic中配置线程池:

在web.xml中

<resource-ref>
    <res-ref-name>wm/MyWorkManager</res-ref-name>
    <res-type>commonj.work.WorkManager</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

有关此特定应用程序服务器的更多作业计划相关信息,请阅读。

找到了此应用程序服务器的解决方案。对于exception
javax.naming.NoPermissionException
,我们应该在
weblogic.xml
中添加以下行。它使用用户初始化webapp,并在部署时启用JNDI查找

<weblogic-web-app>
    <context-root>testApp</context-root>    
    <servlet-descriptor>
        <servlet-name>SchedulerServlet</servlet-name>
        <init-as-principal-name>tour_weblogic_user_name</init-as-principal-name>
    </servlet-descriptor>
</weblogic-web-app> 

特斯塔普
SchedulerServlet
巡更网络逻辑用户名称

它仍然失败。。在服务器启动时。我的代码不是在运行时失败,而是在初始化时创建bean时失败。我在查询中附加了stacktrace
scheduledFuture.cancel(true);
<resource-ref>
    <res-ref-name>wm/MyWorkManager</res-ref-name>
    <res-type>commonj.work.WorkManager</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<bean id="executor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor" scope="singleton">
    <property name="workManagerName" value="java:comp/env/wm/MyWorkManager"/>
</bean>
<work-manager>
    <name>wm/MyWorkManager</name>
    <min-threads-constraint>
        <name>minThreads</name>
        <count>1</count>
    </min-threads-constraint>
    <max-threads-constraint>
        <name>maxThreads</name>
        <count>20</count>
    </max-threads-constraint>
</work-manager>    
executor.execute(new MyRunnable());
<weblogic-web-app>
    <context-root>testApp</context-root>    
    <servlet-descriptor>
        <servlet-name>SchedulerServlet</servlet-name>
        <init-as-principal-name>tour_weblogic_user_name</init-as-principal-name>
    </servlet-descriptor>
</weblogic-web-app>