我想将有状态会话 Bean (EJB 2.1) 迁移到 Spring bean。Stateful Bean 和 Spring Bean 都应使用 Websphere Transaction Manager(WebsphereUowTransactionManager
接口允许 Spring 访问它)在 Websphere Application Server 中运行。
旧的有状态会话 Bean 实现SessionSynchronization
接口以使用回调方法(特别是afterCompletion
回调)。
我尝试为我的 bean 使用原型范围,因为据我所知,它模拟了一个有状态的 bean,并实现了Spring 提供的TransansactionSynchronization接口。
正如我后来理解的那样,这些回调不能被调用,因为“与其他范围相比,Spring 不管理原型 bean 的完整生命周期:容器实例化、配置和以其他方式组装原型对象,并将其交给客户端,没有该原型实例的进一步记录” http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-scopes-prototype
会话范围可能是一个解决方案,但会话 bean 是从使用来自 JMS 队列的消息的消息驱动 Pojo 调用的。
编辑:旧的会话 bean 只是一个纯 Java 类的“包装器”,它实现了对队列的各种写入等。所以它采用现有的类并从中制作一个 bean,实现 SessionSynchronization。
public class XXXMessageSenderBean extends MessageSenderBean implements javax.ejb.SessionBean, SessionSynchronization { }
我的想法是采用相同的 Java 类并创建一个 Spring Bean(接口和实现类):
public interface XXXMessageSenderPojo extends TransactionSynchronization
public class XXXMessageSenderPojoImpl extends MessageSenderBean implements XXXMessageSenderPojo