赞
踩
项目使用 spring boot 框架构建,持久层使用 hibernate,用 atomikos 做分布式事务管理,今天在写一个业务时,因为是需要从腾讯地图api接口拿到数据循环保存到自己本地库中,所以耗时比较长,在最后 commit 阶段控制台抛出异常信息如下:
- org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: Prepare: NO vote
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
- at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
- at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
- at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
- at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
- at com.sailing.messageservice.common.SwaggerCorsFilter.doFilter(SwaggerCorsFilter.java:38)
- at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
- at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
- at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
- at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
- at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
- at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
- at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
- at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
- at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
- at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
- at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
- at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:64)
- at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
- at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
- at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
- at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
- at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
- at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
- at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
- at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
- at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
- at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
- at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
- at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
- at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
- at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
- at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
- at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
- at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
- at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
- at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
- at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
- at io.undertow.server.Connectors.executeRootHandler(Connectors.java:332)
- at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:812)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
- at java.lang.Thread.run(Thread.java:748)
- Caused by: org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: Prepare: NO vote
- at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1026)
- at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
- at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
- at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504)
- at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)
- at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
- at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
- at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
- at com.sailing.messageservice.model.wxapp.service.WxAppService$$EnhancerBySpringCGLIB$$4d634a5c.insertMapData(<generated>)
- at com.sailing.messageservice.ws.wxapp.WxAppController.insertMapData(WxAppController.java:160)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.lang.reflect.Method.invoke(Method.java:498)
- at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
- at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
- at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
- at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
- at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
- at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
- at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
- at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
- ... 65 common frames omitted
- Caused by: javax.transaction.RollbackException: Prepare: NO vote
- at com.atomikos.icatch.jta.TransactionImp.rethrowAsJtaRollbackException(TransactionImp.java:66)
- at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:206)
- at com.atomikos.icatch.jta.TransactionManagerImp.commit(TransactionManagerImp.java:436)
- at com.atomikos.icatch.jta.UserTransactionManager.commit(UserTransactionManager.java:177)
- at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1023)
- ... 87 common frames omitted
- Caused by: com.atomikos.icatch.RollbackException: Prepare: NO vote
- at com.atomikos.icatch.imp.ActiveStateHandler.prepare(ActiveStateHandler.java:231)
- at com.atomikos.icatch.imp.CoordinatorImp.prepare(CoordinatorImp.java:681)
- at com.atomikos.icatch.imp.CoordinatorImp.terminate(CoordinatorImp.java:970)
- at com.atomikos.icatch.imp.CompositeTerminatorImp.commit(CompositeTerminatorImp.java:82)
- at com.atomikos.icatch.imp.CompositeTransactionImp.commit(CompositeTransactionImp.java:336)
- at com.atomikos.icatch.jta.TransactionImp.commit(TransactionImp.java:190)
- ... 90 common frames omitted

网上找了好久,仅有的几篇文章也是说配置 com.atomikos.icatch.max_timeout和com.atomikos.icatch.default_jta_timeout,但是我在 application.properties 文件中配置以后还是报错,肯定的是并没有起到作用,最后在spring boot jar包下发现 AtomikosProperties 这个类,原来spring boot 自己使用 atomikos 对 JTA (Java事务API(Java Transaction API,简称JTA ) 是一个Java企业版 的应用程序接口,在Java环境中,允许完成跨越多个XA资源的分布式事务) 进行了实现,我们可以看到配置前缀为:spring.jta.atomikos.properties, 至此我们就知道应该在配置文件 application.properties 中增加配置为:
spring.jta.atomikos.properties.default-jta-timeout = 600000 (默认为10000) 和
spring.jta.atomikos.properties.max-timeout = 600000 (默认为300000,网上说这个配置为0指的无限超时时间,测试设置为0还是报错)
default_jta_timeout与max_timeout的区别:default_jta_timeout表示开启事务时,默认的超时时间,max_timeout表示最大的超时时间,如果default_jta_timeout设置的值大于max_timeout,会自动将超时时间截断,使用max_timeout的值(日志会打印出来),如果小于的话,将使用default_jta_timeout的时间。
- package org.springframework.boot.jta.atomikos;
-
- import java.util.Properties;
-
- import org.springframework.boot.context.properties.ConfigurationProperties;
-
- /**
- * Bean friendly variant of
- * <a href="http://www.atomikos.com/Documentation/JtaProperties">Atomikos configuration
- * properties</a>. Allows for setter based configuration and is amiable to relaxed data
- * binding.
- *
- * @author Phillip Webb
- * @author Stephane Nicoll
- * @since 1.2.0
- * @see #asProperties()
- */
- @ConfigurationProperties(prefix = "spring.jta.atomikos.properties")
- public class AtomikosProperties {
-
- /**
- * Transaction manager implementation that should be started.
- */
- private String service;
-
- /**
- * Maximum timeout (in milliseconds) that can be allowed for transactions.
- */
- private long maxTimeout = 300000;
-
- /**
- * Default timeout for JTA transactions.
- */
- private long defaultJtaTimeout = 10000;

至此问题解决。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。