WebSphere, it’s a thing.

Spring, it’s another thing.

They generally play together nicely except for async. That’s a little harder. It’s especially harder when you can’t rely on EJB or the Spring-provided work manager, and your async methods aren’t actually spring-managed.

I have a spring-managed factory class, class ContextFactory that has a Context getInstance() method for newing up these stack-scoped objects. My Context class has a boolean commit() method that runs a series of async tasks. Because Context isn’t spring-managed, I can’t take advantage of AsyncResult or the Async annotation.

Solution: Inject my java.util.concurrency.ExecutorService into ContextFactory and expose a getExecutor so I can async manually from Context.

Problem: WebSphere explicitly requests that developers not use Spring’s async facilities directly, but instead load them from the WebSphere asynch beans work managers.

Well, after a few days of searching, here’s how:

<beans xmlns:jee="http://www.springframework.org/schema/jee"
	   xsi:schemaLocation="
		 http://www.springframework.org/schema/jee
		 http://www.springframework.org/schema/jee/spring-jee.xsd">

<jee:jndi-lookup jndi-name="wm/default" id="taskExecutor"></jee:jndi-lookup>

<bean id="contextFactor" class="com.example.factory.ContextFactory">
	<constructor-arg index="0" ref="taskExecutor"/>
</bean>
    
</beans>

WebSphere provides a TaskExecutorWorkManager-compatible and ExecutorService-compatible bean at the default jndi of “wm/default”. You can create your own, and there’s some other stuff to do if you use Liberty profile, but I don’t know anything about that part.

Just a heads up, this doesn’t work on WebSphere 7.x, and the only other version I have to test (where it does) is WebSphere 8.5.5.