java—如何在spring中配置activemq和h2数据库以使用xa连接(比特罗尼克斯)

d4so4syb  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(331)

应用程序引发异常:原因:javax.jms.jmsexception:会话的xaresource尚未登记到分布式事务中。
如何修复?

  1. import bitronix.tm.BitronixTransactionManager;
  2. import bitronix.tm.TransactionManagerServices;
  3. import bitronix.tm.resource.jms.PoolingConnectionFactory;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.context.annotation.DependsOn;
  8. import org.springframework.transaction.PlatformTransactionManager;
  9. import org.springframework.transaction.annotation.EnableTransactionManagement;
  10. import org.springframework.transaction.jta.JtaTransactionManager;
  11. import javax.jms.ConnectionFactory;
  12. import javax.transaction.TransactionManager;
  13. @Configuration
  14. @EnableTransactionManagement
  15. public class BitronixConfig {
  16. @Value("${spring.activemq.broker-url}")
  17. private String brokerUrl;
  18. @Bean(name = "bitronixCfg")
  19. public bitronix.tm.Configuration configuredBitronix() {
  20. bitronix.tm.Configuration conf
  21. = TransactionManagerServices.getConfiguration();
  22. conf.setServerId("TanderTask");
  23. conf.setLogPart1Filename("./tx-logs/part1.btm");
  24. conf.setLogPart2Filename("./tx-logs/part2.btm");
  25. return conf;
  26. }
  27. @Bean(name = "bitronixTransactionManager", destroyMethod="shutdown")
  28. //@DependsOn("bitronixCfg")
  29. public BitronixTransactionManager bitronixTransactionManager() throws Throwable {
  30. BitronixTransactionManager bitronixTransactionManager = TransactionManagerServices.getTransactionManager();
  31. //bitronixTransactionManager.setTransactionTimeout(10000);
  32. return bitronixTransactionManager;
  33. }
  34. @Bean(name = "transactionManager")
  35. //@DependsOn("bitronixTransactionManager")
  36. public PlatformTransactionManager transactionManager(TransactionManager bitronixTransactionManager) throws Throwable {
  37. return new JtaTransactionManager(bitronixTransactionManager);
  38. }
  39. @Bean("xaJmsConnectionFactory")
  40. //@DependsOn("bitronixTransactionManager")
  41. public ConnectionFactory connectionFactoryLocal() {
  42. PoolingConnectionFactory btmPoolingConnectionFactory = new PoolingConnectionFactory();
  43. btmPoolingConnectionFactory.setClassName("org.apache.activemq.ActiveMQXAConnectionFactory");
  44. btmPoolingConnectionFactory.setUniqueName("AMQLocal");
  45. btmPoolingConnectionFactory.setMinPoolSize(1);
  46. btmPoolingConnectionFactory.setMaxPoolSize(5);
  47. btmPoolingConnectionFactory.setAllowLocalTransactions(true);
  48. btmPoolingConnectionFactory.getDriverProperties().setProperty("brokerURL", brokerUrl);
  49. btmPoolingConnectionFactory.init();
  50. return btmPoolingConnectionFactory;
  51. }
  52. import org.slf4j.Logger;
  53. import org.slf4j.LoggerFactory;
  54. import org.springframework.beans.factory.annotation.Value;
  55. import org.springframework.jms.annotation.JmsListener;
  56. import org.springframework.stereotype.Component;
  57. import org.springframework.stereotype.Service;
  58. import org.springframework.transaction.annotation.EnableTransactionManagement;
  59. import org.springframework.transaction.annotation.Transactional;
  60. import javax.jms.BytesMessage;
  61. @Service
  62. public class JmsFileListener {
  63. private static Logger logger = LoggerFactory.getLogger(JmsListener.class);
  64. @Transactional
  65. @JmsListener(destination = "${spring.activemq.destination}")
  66. public void receiveXmlFile(BytesMessage bytesMessage) {
  67. try {
  68. byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
  69. bytesMessage.readBytes(bytes);
  70. String out = new String(bytes);
  71. logger.info(
  72. String.format(" Queue = %s; File contains = %s",
  73. "${spring.activemq.destination}", out)
  74. );
  75. } catch (Exception e) {
  76. logger.error("Error in JmsFileListener class!!", e);
  77. }
  78. }
  79. }

路线.等级

  1. import com.almod.springjta.db.H2Repo;
  2. import org.apache.camel.builder.RouteBuilder;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. public class Route extends RouteBuilder {
  7. @Override
  8. public void configure() throws Exception {
  9. from("file:data?noop=true")
  10. .to("jms:example");
  11. /*.choice()
  12. .when(header("CamelFileName").endsWith(".xml"))
  13. .to("jms:example")
  14. .when(header("CamelFileName").endsWith(".txt"))
  15. .bean(H2Repo.class, "writeInDB")
  16. .to("jms:example")
  17. .otherwise()
  18. .throwException(new Exception(" Wrong extension !"))
  19. .to("jms:invalid-queue")
  20. .end();*/
  21. }
  22. }

应用程序属性

  1. # ActiveMQ
  2. spring.activemq.broker-url=vm://embedded-broker
  3. spring.activemq.destination=example
  4. spring.jms.template.default-destination=example
  5. # H2 Database
  6. spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;
  7. spring.datasource.driverClassName=org.h2.Driver
  8. spring.datasource.username=sa
  9. spring.datasource.password=password
  10. spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
  11. spring.datasource.schema=db/schema.sql

pom.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.4.0</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.almod</groupId>
  12. <artifactId>springjta</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>SpringJTA</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <apache-camel-version>2.22.1</apache-camel-version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-activemq</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.apache.activemq</groupId>
  27. <artifactId>activemq-kahadb-store</artifactId>
  28. <version>5.15.4</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-data-jdbc</artifactId>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-jta-bitronix</artifactId>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-devtools</artifactId>
  41. <scope>runtime</scope>
  42. <optional>true</optional>
  43. </dependency>
  44. <dependency>
  45. <groupId>com.h2database</groupId>
  46. <artifactId>h2</artifactId>
  47. <scope>runtime</scope>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-starter-test</artifactId>
  52. <scope>test</scope>
  53. </dependency>
  54. <dependency>
  55. <groupId>org.apache.camel</groupId>
  56. <artifactId>camel-spring-boot-starter</artifactId>
  57. <version>${apache-camel-version}</version> <!-- use the same version as your Camel core version -->
  58. </dependency>
  59. <dependency>
  60. <groupId>org.apache.camel</groupId>
  61. <artifactId>camel-core</artifactId>
  62. <version>${apache-camel-version}</version>
  63. </dependency>
  64. <dependency>
  65. <groupId>org.apache.camel</groupId>
  66. <artifactId>camel-spring</artifactId>
  67. <version>${apache-camel-version}</version>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.apache.camel</groupId>
  71. <artifactId>camel-stream</artifactId>
  72. <version>${apache-camel-version}</version>
  73. </dependency>
  74. <dependency>
  75. <groupId>org.apache.camel</groupId>
  76. <artifactId>camel-spring-javaconfig</artifactId>
  77. <version>${apache-camel-version}</version>
  78. </dependency>
  79. <!-- https://mvnrepository.com/artifact/org.apache.camel/camel-jms -->
  80. <dependency>
  81. <groupId>org.apache.camel</groupId>
  82. <artifactId>camel-jms</artifactId>
  83. <version>${apache-camel-version}</version>
  84. </dependency>
  85. <!-- https://mvnrepository.com/artifact/org.apache.camel/camel-context -->
  86. <dependency>
  87. <groupId>org.apache.camel</groupId>
  88. <artifactId>camel-context</artifactId>
  89. <version>${apache-camel-version}</version>
  90. </dependency>
  91. <dependency>
  92. <groupId>org.apache.camel</groupId>
  93. <artifactId>camel-mail</artifactId>
  94. <version>${apache-camel-version}</version>
  95. </dependency>
  96. <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
  97. <dependency>
  98. <groupId>commons-io</groupId>
  99. <artifactId>commons-io</artifactId>
  100. <version>2.4</version>
  101. </dependency>
  102. </dependencies>
  103. <build>
  104. <plugins>
  105. <plugin>
  106. <groupId>org.springframework.boot</groupId>
  107. <artifactId>spring-boot-maven-plugin</artifactId>
  108. </plugin>
  109. </plugins>
  110. </build>
  111. </project>

日志
消息历史记录

smdnsysy

smdnsysy1#

--routeid processorid processor elapsed(ms)[route1][route1][file://data?noop=true ][3][route1][to1][jms:example ] [ 2]

堆栈跟踪

  1. org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Session's XAResource has not been enlisted in a distributed transaction.
  2. at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:311) ~[spring-jms-5.3.1.jar:5.3.1]
  3. at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:185) ~[spring-jms-5.3.1.jar:5.3.1]
  4. at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:507) ~[spring-jms-5.3.1.jar:5.3.1]
  5. at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.send(JmsConfiguration.java:526) ~[camel-jms-2.22.1.jar:2.22.1]
  6. at org.apache.camel.component.jms.JmsProducer.doSend(JmsProducer.java:440) ~[camel-jms-2.22.1.jar:2.22.1]
  7. at org.apache.camel.component.jms.JmsProducer.processInOnly(JmsProducer.java:394) ~[camel-jms-2.22.1.jar:2.22.1]
  8. at org.apache.camel.component.jms.JmsProducer.process(JmsProducer.java:157) ~[camel-jms-2.22.1.jar:2.22.1]
  9. at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148) ~[camel-core-2.22.1.jar:2.22.1]
  10. at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548) ~[camel-core-2.22.1.jar:2.22.1]
  11. at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [camel-core-2.22.1.jar:2.22.1]
  12. at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201) [camel-core-2.22.1.jar:2.22.1]
  13. at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:454) [camel-core-2.22.1.jar:2.22.1]
  14. at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:223) [camel-core-2.22.1.jar:2.22.1]
  15. at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:187) [camel-core-2.22.1.jar:2.22.1]
  16. at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174) [camel-core-2.22.1.jar:2.22.1]
  17. at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101) [camel-core-2.22.1.jar:2.22.1]
  18. at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_241]
  19. at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_241]
  20. at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_241]
  21. at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_241]
  22. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_241]
  23. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_241]
  24. at java.lang.Thread.run(Thread.java:748) [na:1.8.0_241]
  25. Caused by: javax.jms.JMSException: Session's XAResource has not been enlisted in a distributed transaction.
  26. at org.apache.activemq.ActiveMQXASession.doStartTransaction(ActiveMQXASession.java:101) ~[activemq-client-5.16.0.jar:5.16.0]
  27. at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1919) ~[activemq-client-5.16.0.jar:5.16.0]
  28. at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:288) ~[activemq-client-5.16.0.jar:5.16.0]
  29. at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:223) ~[activemq-client-5.16.0.jar:5.16.0]
  30. at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:241) ~[activemq-client-5.16.0.jar:5.16.0]
  31. at bitronix.tm.resource.jms.MessageProducerWrapper.send(MessageProducerWrapper.java:79) ~[btm-2.1.4.jar:2.1.4]
  32. at org.springframework.jms.core.JmsTemplate.doSend(JmsTemplate.java:634) ~[spring-jms-5.3.1.jar:5.3.1]
  33. at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSend(JmsConfiguration.java:634) ~[camel-jms-2.22.1.jar:2.22.1]
  34. at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSendToDestination(JmsConfiguration.java:573) ~[camel-jms-2.22.1.jar:2.22.1]
  35. at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.access$100(JmsConfiguration.java:515) ~[camel-jms-2.22.1.jar:2.22.1]
  36. at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate$1.doInJms(JmsConfiguration.java:529) ~[camel-jms-2.22.1.jar:2.22.1]
  37. at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:504) ~[spring-jms-5.3.1.jar:5.3.1]
  38. ... 20 common frames omitted
展开查看全部

相关问题