在websphere中的Spring commonj.Workmanager

Fry*_*der 3 websphere spring

在websphere中运行spring的workmanager任务执行程序时收到异常.以下是我的代码

<bean id="workManager" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
    <property name="workManagerName" value="wm/MyWorkManager"/>
    <property name="resourceRef" value="false"/>
</bean>

<bean name="myWorkManager" class="com.spring.test.services.concurrent.ConcurrentWorkManager" />
<bean name="myWorkListener" class="com.spring.test.services.concurrent.ConcurrentWorkListener" />
Run Code Online (Sandbox Code Playgroud)

我的ConcurrentWorkManager中的代码

@Autowired
private WorkManagerTaskExecutor workManager;

@Autowired
private WorkListener myWorkListener;

    if(workList==null){
     throw new WorkException("There are no works present in worklist to do work");
    }

    ArrayList<WorkItem> workItems = new ArrayList<WorkItem>();
    for(Work work : workList){
        workItems.add(workManager.schedule(work,myWorkListener));
    }
    workManager.waitForAll(workItems,WorkManager.INDEFINITE);


    for(WorkItem work:workItems){
        ConcurrentWorker worker=(ConcurrentWorker)work.getResult();
        resultString.add(worker.getResult());
    }
Run Code Online (Sandbox Code Playgroud)

现在当我执行我的代码时,它在workmanager.schedule(work)方法中给出了stackoverflow异常

stackoverflow异常

at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.schedule(WorkManagerTaskExecutor.java:202)
Run Code Online (Sandbox Code Playgroud)

yle*_*lev 6

如何在IBM Websphere(WS)应用程序服务器下设置和使用Spring WorkManagerTaskExecutor

(由Yosi Lev提供)

在WS-AS下开发应用程序并且必须运行线程时,您应该创建并使用名为"Work-Manager"的特殊WS内部资源.这是在IBM Websphere应用程序服务器下运行托管线程的方法.

遵循以下阶段:首先,在Websphere上定义工作管理器资源,然后在Spring中连接并使用它:
1.登录到WS管理控制台
2.选择:资源 - >异步bean - >工作管理器.
3.选择范围服务器+单元格
4.按[new]按钮
5.定义工作管理器
还定义工作管理器JNDI名称,
例如:wm/taskex11
6.在spring-config-file.xml中添加一个如下:

    <bean id="myTaskExecutor" 
       class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
      <property name="workManagerName" value="wm/taskex11" />
    </bean> 
Run Code Online (Sandbox Code Playgroud)

注意 !
请参阅"workManagerName"属性值.
这里最重要的是定义您
在第5阶段(上面)的Websphere管理控制台中指定的相同工作管理器JNDI名称.
这就是Spring工作管理器如何知道它应该定位哪个WS JNDI
以利用WS定义的资源.

似乎这是在IBM WS AS下运行托管线程的唯一方法.
7.当你在Spring中定义了这个(第6阶段)infra-bean时,你可以
在注入任何其他bean或资源时将它注入到其他应用程序bean中:

@Autowired
private WorkManagerTaskExecutor workManagerTaskExecutor;
Run Code Online (Sandbox Code Playgroud)


8.创建一个Runnable对象并将其提供给workManagerTaskExecutor的execute()
方法:

Runnable r1 = new Runnable(){
@Override
public void run() {
for(int i = 0 ;  i < 100;i++){
            logger.info("run() method of Runnable. i=["+i+"], thread:[" 
                                   + Thread.currentThread().getName()+"]");
            try {
                Thread.sleep(500L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }//run
};//anonymous
workManagerTaskExecutor.execute(r1);
workManagerTaskExecutor.execute(r1);
Run Code Online (Sandbox Code Playgroud)


祝你好运,
Yosi Lev