I have Infinispan 9.4 and this settings in infinispan.xml:
<local-cache name="localCache">
<locking isolation="READ_COMMITTED"/>
<transaction mode="BATCH"/>
<memory>
<object strategy="NONE"/>
</memory>
</local-cache>
and when i try to add new value in this cache in the transaction but in the beforeCompletion phase
tx.registerSynchronization(new Synchronization()
{
...
public void beforeCompletion()
{
cache.put(CACHE_KEY, value);
}
...
}
i got this exception:
...
at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76) ~[jbossjts-4.16.6.Final.jar:?]
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:273) ~[jbossjts-4.16.6.Final.jar:?]
at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:93) ~[jbossjts-4.16.6.Final.jar:?]
at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:164) ~[jbossjts-4.16.6.Final.jar:?]
at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1165) ~[jbossjts-4.16.6.Final.jar:?]
at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:117) ~[jbossjts-4.16.6.Final.jar:?]`
...
ERROR impl.InvocationContextInterceptor - ISPN000136: Error executing command PutKeyValueCommand on Cache 'localCache', writing keys [storage]
java.lang.UnsupportedOperationException: null
at org.infinispan.commons.util.ImmutableListCopy.add(ImmutableListCopy.java:124) ~[infinispan-commons-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.transaction.impl.LocalTransaction.addModification(LocalTransaction.java:66) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.TxInterceptor.lambda$handleWriteCommand$8(TxInterceptor.java:414) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndFinally(BaseAsyncInterceptor.java:165) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.TxInterceptor.handleWriteCommand(TxInterceptor.java:402) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.TxInterceptor.visitPutKeyValueCommand(TxInterceptor.java:235) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:73) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:56) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.CacheMgmtInterceptor.updateStoreStatistics(CacheMgmtInterceptor.java:217) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.CacheMgmtInterceptor.visitPutKeyValueCommand(CacheMgmtInterceptor.java:182) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:73) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndExceptionally(BaseAsyncInterceptor.java:125) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.InvocationContextInterceptor.visitCommand(InvocationContextInterceptor.java:90) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:58) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.BatchingInterceptor.handleDefault(BatchingInterceptor.java:69) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.BatchingInterceptor.visitPutKeyValueCommand(BatchingInterceptor.java:49) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:73) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.DDAsyncInterceptor.visitCommand(DDAsyncInterceptor.java:50) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.interceptors.impl.AsyncInterceptorChainImpl.invoke(AsyncInterceptorChainImpl.java:248) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.cache.impl.CacheImpl.executeCommandAndCommitIfNeeded(CacheImpl.java:1915) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.cache.impl.CacheImpl.put(CacheImpl.java:1430) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.cache.impl.CacheImpl.put(CacheImpl.java:2040) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.cache.impl.CacheImpl.put(CacheImpl.java:230) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.cache.impl.AbstractDelegatingCache.put(AbstractDelegatingCache.java:448) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Final]
at org.infinispan.cache.impl.EncoderCache.put(EncoderCache.java:729) ~[infinispan-core-9.4.24.Final.jar:9.4.24.Fina
i checked - if i do it without a beforeCompletion phase - it's ok.
But i need execute this in this phase - how i can fix it?
What is happening is that your cache is transactional and by invoking
put()insidebeforeCompletion(), Infinispan will try to register itself within the transaction. At this time, the transaction is preparing and modifications are not accepted.You need to configure your cache as nontransactional by setting
<transaction mode="NONE"/>.If you need your cache to be transactional, you need to suspend the transaction before invoking
put()and then resume the transaction.