Java Spring有状态Bean等效-同步回调方法
我想将有状态会话Bean(EJB2.1)迁移到Springbean。有状态Bean和springbean都应该使用webspheretransactionmanager在websphereapplicationserver中运行(接口允许Spring访问它) 旧的有状态会话Bean实现了使用回调方法(特别是回调)的接口 我尝试为我的bean使用prototype作用域,因为据我所知,这模拟了有状态bean,并实现了Spring提供的接口 正如我后来理解的,这些回调不能被调用,因为“与其他作用域不同,Spring不管理原型bean的完整生命周期:容器实例化、配置和以其他方式组装原型对象,并将其交给客户机,而不再记录该原型实例” 会话范围可以是一个解决方案,但会话bean是从使用JMS队列中的消息的消息驱动Pojo调用的 编辑: 旧的会话bean只是一个纯Java类的“包装器”,它实现了对队列等的各种写入。因此,它获取现有类并从中生成一个bean,实现会话同步Java Spring有状态Bean等效-同步回调方法,java,spring,scope,stateful-session-bean,Java,Spring,Scope,Stateful Session Bean,我想将有状态会话Bean(EJB2.1)迁移到Springbean。有状态Bean和springbean都应该使用webspheretransactionmanager在websphereapplicationserver中运行(接口允许Spring访问它) 旧的有状态会话Bean实现了使用回调方法(特别是回调)的接口 我尝试为我的bean使用prototype作用域,因为据我所知,这模拟了有状态bean,并实现了Spring提供的接口 正如我后来理解的,这些回调不能被调用,因为“与其他作用域不
public class XXXMessageSenderBean extends MessageSenderBean implements javax.ejb.SessionBean, SessionSynchronization { }
我的想法是采用相同的Java类并创建一个Springbean(接口和实现类):
为什么?为什么需要这种显式回调?它的特殊之处在于您需要它,而单例(或原型)和使用声明性事务管理无法完成什么。您可以(而且应该是这样)始终使用
TransactionSynchronizationManager.registerSynchronization
方法手动注册实现TransactionSynchronization
的bean。当消息到达并开始处理时(或从上下文检索bean之后),可以轻松地执行一些清理操作,如调用javax.jms.MessageProducer.close()
。您能否在实现类似于TransactionSynchronization
的东西的想法中详细阐述一下?您为什么需要它?这已经由springs事务管理处理,并且假设您使用spring将MDP驱动到spring。所以基本上你是在尝试spring和声明式tx管理?如果您需要发送,请使用JmsTemplate
,它可以为您处理所有这些问题,无需通过回调进行修改。您可以用一些代码和配置来扩展您的答案吗?我想你不应该需要回调,这让事情变得复杂了。这是一个旧的应用程序,我目前的工作是仅展示是否可以用Spring实现类似的行为。如果发送到队列仅仅是通过一个MDP进行的,那么就不需要这样做,但是它是通过这个有状态Bean进行的,我现在无法重写整个代码库(不过稍后会这样做)。在检索bean之后,如何在春季进行清理?
public interface XXXMessageSenderPojo extends TransactionSynchronization
public class XXXMessageSenderPojoImpl extends MessageSenderBean implements XXXMessageSenderPojo