【问题标题】:Using @Transactional on actors class definition with Akka 2.X.X?在 Akka 2.X.X 的演员类定义上使用 @Transactional?
【发布时间】:2014-04-18 16:33:52
【问题描述】:

我曾经在我的 bean 上使用 Spring 事务注解。 然而,来自 Akka 的演员不情愿。 这是我在 Scala 中的代码 sn-p:

@Service
@Transactional
@Scope("prototype")
class MyActor extends Actor with ActorLogging { 

   def receive = {
     //......  throwing a NotInTransaction (no matter what the calling lib is)
   }
}

但是,@Transactional 适用于我所有其他非演员 bean。

我将 Java 添加为标记,因为我猜这可能与 Akka for Java 有类似的问题。

我错过了什么吗?

我指出我事先遵循了这项技术(我在 Scala 中进行了改编)以使我的演员创作意识到 Spring: http://www.typesafe.com/activator/template/akka-java-spring

更新示例------------

@Service("eventsListenerActor")
@Scope("prototype")
class EventsListenerActor @Autowired()(val eventRepository: EventRepository) extends Actor {

  def receive = {
    case RetrieveNewEvents =>
      val newEvents = eventRepository.findNewEvents(EventBatchSizeProperty)
  }

}

@Repository
class MyEventRepository extends EventRepository {

   @Transactional       //transactional annotation here
   def findNewEvents(batchSize: Int): List[Event] = {
    //................    code warning that transaction context is not present here !
  }
}

对参与者外部的findNewEvents 的任何调用都会很好地构建事务上下文。

正如我在下面的 cmets 中所问的,它可能与 actor 及其线程方式有关吗?

【问题讨论】:

    标签: java spring scala akka


    【解决方案1】:

    应用程序容器中的事务跟踪基于 ThreadLocal 变量,因此它不适用于 Actor。冲突并非巧合,因为让参与者参与更大的交易与意图背道而驰:参与者不应共享任何内容,只能使用消息进行通信。如果不违反此规则,两个参与者永远不可能在内部保持一致。

    遵循这条规则的好处很多:适当的封装、位置透明、跨 CPU 或节点的无痛分布、健全的故障处理模型。

    【讨论】:

    • 如果整个演员不是事务性的(正如您所解释的:)),我正在努力解释为什么演员对带有 @Transactional 注释的 Spring Bean 的调用不起作用。例如,我有一个包含 save() 方法的 bean。此方法需要一个事务(受我使用的库的限制)。当我从演员外部进行完全相同的调用时,它可以工作,这意味着创建了事务。否则,我得到一个NotInTransactionException。跟演员有关系吗??我不知道怎么......谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多