- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 SpringBoot 应用程序从数据库读取一些数据并将这些对象写入 jms 队列。我使用 XA 进行事务处理。但是当我将对象发送到队列时,出现以下异常:
2018-09-13 13:44:46 ERROR c.s.c.m2m.MachineMessageProcessor [] - Processing of messages failed
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is com.atomikos.jms.AtomikosTransactionRequiredJMSException: The JMS session you are using requires a JTA transaction context for the calling thread and none was found.
Please correct your code to do one of the following:
1. start a JTA transaction if you want your JMS operations to be subject to JTA commit/rollback, or
2. increase the maxPoolSize of the AtomikosConnectionFactoryBean to avoid transaction timeout while waiting for a connection, or
3. create a non-transacted session and do session acknowledgment yourself, or
4. set localTransactionMode to true so connection-level commit/rollback are enabled.
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:169)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:487)
at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:570)
at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:696)
at com.schaerer.coffeelink.m2m.MachineStatusReader.processMessages(MachineStatusReader.java:62)
at com.schaerer.coffeelink.m2m.BatchedMessageProcessor.processPage(BatchedMessageProcessor.java:70)
at com.schaerer.coffeelink.m2m.BatchedMessageProcessor.access$000(BatchedMessageProcessor.java:22)
at com.schaerer.coffeelink.m2m.BatchedMessageProcessor$1.doInTransactionWithoutResult(BatchedMessageProcessor.java:57)
at org.springframework.transaction.support.TransactionCallbackWithoutResult.doInTransaction(TransactionCallbackWithoutResult.java:34)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at com.schaerer.coffeelink.m2m.MachineMessageProcessor.executeInNewTransaction(MachineMessageProcessor.java:146)
at com.schaerer.coffeelink.m2m.BatchedMessageProcessor.processPageInTransaction(BatchedMessageProcessor.java:53)
at com.schaerer.coffeelink.m2m.BatchedMessageProcessor.execute(BatchedMessageProcessor.java:45)
at com.schaerer.coffeelink.m2m.DataReaderScheduler.runDataReader(DataReaderScheduler.java:31)
at com.schaerer.coffeelink.m2m.DataReaderScheduler$$FastClassBySpringCGLIB$$56ffc69e.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at com.schaerer.coffeelink.common.security.api.authorization.RunAsRoleAspect.aroundwithResourceAccessPermissionAnnotation(RunAsRoleAspect.java:51)
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.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.schaerer.coffeelink.m2m.DataReaderScheduler$$EnhancerBySpringCGLIB$$a8c5dee8.runDataReader(<generated>)
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.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
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)
JMS 配置如下:
@Configuration
@EnableJms
@EnableAutoConfiguration
@EnableTransactionManagement
public class JmsConfiguration {
@Value("${messaging.broker-url}")
private String brokerUrl;
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerFactory(DefaultJmsListenerContainerFactoryConfigurer configurer,
ConnectionFactory jmsConnectionFactory,
PlatformTransactionManager platformTransactionManager) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, jmsConnectionFactory);
factory.setTransactionManager(platformTransactionManager);
factory.setSessionTransacted(true);
factory.setSessionAcknowledgeMode(Session.DUPS_OK_ACKNOWLEDGE);
return factory;
}
@Bean
public ConnectionFactory jmsConnectionFactory() {
ActiveMQXAConnectionFactory activeMQXAConnectionFactory = new ActiveMQXAConnectionFactory(brokerUrl);
activeMQXAConnectionFactory.setTrustAllPackages(true);
AtomikosConnectionFactoryBean atomikosConnectionFactoryBean = new AtomikosConnectionFactoryBean();
atomikosConnectionFactoryBean.setLocalTransactionMode(false);
atomikosConnectionFactoryBean.setXaConnectionFactory(activeMQXAConnectionFactory);
return atomikosConnectionFactoryBean;
}
@Bean
public JmsTemplate JmsTemplate(ConnectionFactory jmsConnectionFactory) {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory(jmsConnectionFactory);
jmsTemplate.setSessionTransacted(true);
return jmsTemplate;
}
@Bean
public PlatformTransactionManager platformTransactionManager(UserTransactionManager atomikosUserTransactionManager,
UserTransaction atomikosUserTransaction) {
JtaTransactionManager manager = new JtaTransactionManager();
manager.setTransactionManager(atomikosUserTransactionManager);
manager.setUserTransaction(atomikosUserTransaction);
manager.setAllowCustomIsolationLevels(true);
return manager;
}
@Bean
UserTransactionManager atomikosUserTransactionManager() {
UserTransactionManager manager = new UserTransactionManager();
manager.setStartupTransactionService(true);
manager.setForceShutdown(false);
return manager;
}
@Bean
UserTransaction atomikosUserTransaction() {
return new UserTransactionImp();
}
}
调用代码为:
@Transactional
private void processMessages(List<MachineStatus> machineStatuses) {
if (machineStatuses != null && !machineStatuses.isEmpty()) {
jmsAdapter.convertAndSend(MACHINE_STATUS_QUEUE, machineStatuses, message -> {
message.setJMSCorrelationID(UUID.randomUUID().toString());
return message;
});
setLastId(machineStatuses.get(machineStatuses.size() - 1).getId());
}
}
有人知道我做错了什么吗?
最佳答案
您正在创建一次 jmsConnectionFactory。通过你的@Beans注释第二次而不是从 jmsTemplate 自动连接它:
@Bean
public JmsTemplate JmsTemplate(ConnectionFactory jmsConnectionFactory) {
// initialization code here
}
您正在第二次手动创建它:
jmsTemplate.setConnectionFactory(jmsConnectionFactory());
同样的情况
jmsListenerContainerFactory
不要多次创建,而是使用注入(inject)。
更新:您不能在私有(private)方法上使用 @Transactional 注释。将您的注释放在公共(public)监听器接口(interface)上。
关于java - 无法使用 JmsTemplate 发送到 XA JMS 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52315341/
我已经尝试运行简单的 spring jmstemplate 示例。这里是发件人的源代码, import javax.jms.Destination; import javax.jms.JMSExcep
我正在使用 Spring Boot 2.1.6 构建 REST API 应用程序。我想在我的应用程序中使用 JMS 消息传递和 Active MQ 包 (org.apache.activemq)。我有
我一直在寻找一些文档/示例来检查动态创建的主题是否存在,如果存在,如何获取该主题的订阅者计数。 我使用以下代码向主题发送消息 - jmsTemplate.send(destination, new M
到目前为止,我只能在 jms 连接工厂中找到并发设置: 是否可以配置单个队列的消费者数量?即类似: 谢谢!~ 最佳答案 不要使用命名空间,而是使用抽象父级 DefaultMessageLi
我有 JMS 应用程序 和 IBM MQ jars 配置,使用 spring 它在正确的队列信息下运行良好,但是当我提供错误的队列信息时 卡在 LOG.info("SENDING MESSAGE");
我正在尝试将消息头插入 amq。 JMSTemplate 中没有特定方法用于在 amq 中设置 header。当我这样设置时,它将保存在 StringProperty 而不是标题。保存到标题如何传递数
我想从 jmsTemplate.sendAndReceive 获取同步响应: Message responseMessage = producer.produceAndReceive(gzip
我想为连接到 ActiveMQ 代理的多个生产者共享 JMSTemplate 的单个实例。示例配置: 我可以使用上面的配置吗? 正如这里提到的:http://docs.sp
我正在使用 Spring boot,我想动态创建多个 JMS 模板,因为我想连接到不同的 JMS 实例。我知道使用注释的标准方法,将 ConnectionFactory 链接到 JMSTemplate
我的服务方法如下所示,我试图模拟 JmsTemplate 以便它可以在单元测试期间发送消息,但它不执行 jmsTemplate.send(...),它直接转到下一行,怎么可能我使用单元测试执行我的服务
我们当前使用 JmsTemplate 的 send(Destination, messageCreator) 方法将消息发送到 webMethods 队列。然而,有时 send 方法需要很长时间才能返
我编写了一个在 Glassfish 中的 Web 服务中运行的 JMS 应用程序(也将其部署在 JBoss 中),我注意到在我通过 MessageListener MDP 处理多条消息后,JMS 服务
我正在使用 Spring API 的 JmsTemplate 和 MappingJackson2MessageConverter(版本:spring-jms-4.3.4.RELEASE.jar)来发布
我刚刚重构了一些发布到 JMS 主题的代码以使用 Spring 的 JmsTemplate 类,现在我收到一个异常,指出我未通过身份验证。 之前我创建了工厂,建立了连接,然后是 session 等,如
需要模拟 JmsTemplate 以在我的应用程序中进行集成测试。 在我的 appcontext.xml 中
我需要在特定时间后删除一条消息,所以我启用了 explicitQosEnabled 并设置了生存时间。 但我注意到消息已被删除,但它花费的时间比指定的时间(一分钟)长,所以以前有人遇到过这个问题吗?
我相信我搞砸了配置,但我不知道在哪里以及如何修复它。 Here你可以找到代码。 org.springframework.jms.UncategorizedJmsException: Uncategor
我正在探索 jmsTemplate 实现并遇到一个问题。可以手动将 JMSMessageId 应用于消息,但回调会返回不同的 MessageId。 示例代码: log.debug("Sending r
在 asyncSend 设置为 true 的情况下发送持久消息是否有最佳实践或指南。 我们没有配置事务管理器 我们有 ~40k-50k 消息,这些消息是使用配置有 的 jmsTemplate 发送的
我有发送到 IBM MQ 队列的 JMS 消息,如果远程客户端(我无法控制远程客户端)在给定的时间(比如 1 分钟)内没有使用消息,消息应该过期(我有过期部分工作,“MQ 删除消息”在 JMSTemp
我是一名优秀的程序员,十分优秀!