0

リソース/状態を既存のトランザクションに追加/取得する方法を見つけようとしています。これは春に可能ですか?

私が達成しようとしているのは、以下の疑似コードに似ています。

@Service
@Transactional("txManager")
public class ServiceImpl implements Service {

    @Override
    @AddResourceHere
    public TestObj doSomething(){
        ...
    }

    @Override
    @AddResourceHere
    public TestObj doSomethingAgain(){
        ...
    }
}

@Aspect
@Component
public class Interceptor {

    private static final Logger logger = LogManager.get(Interceptor.class);

    @Before("@annotation(my.package.AddResourceHere)")
    public void switchDatabase(JoinPoint joinPoint){
        MyResource resource = TransactionResouceAdder.getResource("transactionSpecificResource");
        if(resource == null){
            TransactionResouceAdder.addResource(new MyResource("A new resource"));
            ...
        }

        else
            log.info("resource has already been added for this transaction");
    }
}

public class Test {
    ...
    @Test
    @Transactional("txManager")
    public void doSomethingTest(){
        serviceImpl.doSomething();
        serviceImpl.doSomethingAgain();
    }
}

似たようなの見つけた

org.springframework.transaction.support.TransactionSynchronizationManager#getResouce(Object)
org.springframework.transaction.support.TransactionSynchronizationManager#bindResource(Object, Object)

ただし、これにより、トランザクションの現在のスレッドにリソースが追加されます。リソース トランザクションをバインドのみにする方法はありますか?

私の実際のコードでは、Spring jdbc の DataSourceTransactionManager をトランザクション マネージャーとして使用しています。

助けてくれてありがとう:)

4

1 に答える 1

0

TransactionSynchronizationManagerはこの目的のために設計されており、リソースはトランザクションの最後にクリアされます ( を参照AbstractPlatformTransactionManager)。アスペクトを使用してカスタム注釈に接続する必要がありますが、その方法は既に知っているようです。

于 2014-02-26T08:45:07.203 に答える