Java 使用Spring在weblogic中启动服务器时启动线程
我想在服务器启动时启动一个线程。我的线程从数据库中提取数据并将其放入JMS队列中。所有bean都在Spring配置文件中定义。JMS队列和DB连接工厂(connection-factory)在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: 用户匿名没
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>