save方法会调用mq的发送方法吗
来源:4-9 JTA多数据源事务实例

weixin_慕尼黑2067412
2020-07-22
@Transactional
@JmsListener(destination = "customer:msg:new")
public Customer createByListener(String name) {
LOG.info("CustomerService In Annotation by Listener create customer:{}", name);
Customer customer = new Customer();
customer.setUsername("Annotation:" + name);
customer.setRole("USER");
customer.setPassword("111111");
String reply=customer.getUsername() + " created.";
//jmsTemplate.convertAndSend("customer:msg:reply", "123");
return customerRepository.save(customer);
}
这里把发送都注释掉了,还是报错
2020-07-22 19:51:37.043 INFO 15828 --- [enerContainer-1] c.i.s.s.CustomerServiceInAnnotation : CustomerService In Annotation by Listener create customer:imooc
2020-07-22 19:51:37.043 DEBUG 15828 --- [enerContainer-1] o.s.t.jta.JtaTransactionManager : Participating in existing transaction
2020-07-22 19:51:37.044 DEBUG 15828 --- [enerContainer-1] o.s.orm.jpa.EntityManagerFactoryUtils : Opening JPA EntityManager
2020-07-22 19:51:37.044 DEBUG 15828 --- [enerContainer-1] org.hibernate.SQL : call next value for hibernate_sequence
2020-07-22 19:51:37.044 DEBUG 15828 --- [enerContainer-1] .s.j.l.a.MessagingMessageListenerAdapter : Listener method returned result [com.imooc.springtxjta.domain.Customer@6b306f3b] - generating response message for it
2020-07-22 19:51:37.045 DEBUG 15828 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer : Rolling back transaction because of listener exception thrown: org.springframework.jms.listener.adapter.ReplyFailureException: Failed to send reply with payload [com.imooc.springtxjta.domain.Customer@6b306f3b]; nested exception is org.springframework.jms.support.converter.MessageConversionException: Cannot convert object of type [com.imooc.springtxjta.domain.Customer] to JMS message. Supported message payloads are: String, byte array, Map<String,?>, Serializable object.
2020-07-22 19:51:37.045 WARN 15828 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer : Execution of JMS message listener failed, and no ErrorHandler has been set.
org.springframework.jms.listener.adapter.ReplyFailureException: Failed to send reply with payload [com.imooc.springtxjta.domain.Customer@6b306f3b]; nested exception is org.springframework.jms.support.converter.MessageConversionException: Cannot convert object of type [com.imooc.springtxjta.domain.Customer] to JMS message. Supported message payloads are: String, byte array, Map<String,?>, Serializable object.
at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener.handleResult(AbstractAdaptableMessageListener.java:285)
at org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:79)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:736)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:696)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:245)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.springframework.jms.support.converter.MessageConversionException: Cannot convert object of type [com.imooc.springtxjta.domain.Customer] to JMS message. Supported message payloads are: String, byte array, Map<String,?>, Serializable object.
at org.springframework.jms.support.converter.SimpleMessageConverter.toMessage(SimpleMessageConverter.java:79)
at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener$MessagingMessageConverterAdapter.createMessageForPayload(AbstractAdaptableMessageListener.java:503)
at org.springframework.jms.support.converter.MessagingMessageConverter.toMessage(MessagingMessageConverter.java:111)
at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener.buildMessage(AbstractAdaptableMessageListener.java:313)
at org.springframework.jms.listener.adapter.AbstractAdaptableMessageListener.handleResult(AbstractAdaptableMessageListener.java:279)
... 10 common frames omitted
2020-07-22 19:51:37.045 DEBUG 15828 --- [enerContainer-1] o.s.t.jta.JtaTransactionManager : Transactional code has requested rollback
2020-07-22 19:51:37.045 DEBUG 15828 --- [enerContainer-1] org.apache.activemq.TransactionContext : End: 192.168.101.6.tm159541869603900213192.168.101.6.tm220, flags: TMSUCCESS
2020-07-22 19:51:37.046 DEBUG 15828 --- [enerContainer-1] org.apache.activemq.TransactionContext : TransactionContext{transactionId=XID:[1096044365,globalId=3139322e3136382e3130312e362e746d313539353431383639363033393030323133,branchId=3139322e3136382e3130312e362e746d323230],connection=ActiveMQConnection {id=ID:luaj-53402-1595418494724-4:1,clientId=ID:luaj-53402-1595418494724-3:2,started=true}} ended XA transaction XID:[1096044365,globalId=3139322e3136382e3130312e362e746d313539353431383639363033393030323133,branchId=3139322e3136382e3130312e362e746d323230]
2020-07-22 19:51:37.046 DEBUG 15828 --- [calhost] Task-3] org.apache.activemq.broker.region.Queue : queue://customer:msg:new, subscriptions=1, memory=0%, size=1, pending=0 toPageIn: 0, force:false, Inflight: 1, pagedInMessages.size 1, pagedInPendingDispatch.size 0, enqueueCount: 2, dequeueCount: 1, memUsage:1034, maxPageSize:200
2020-07-22 19:51:37.046 DEBUG 15828 --- [enerContainer-1] o.s.t.jta.JtaTransactionManager : Initiating transaction rollback
2020-07-22 19:51:37.046 DEBUG 15828 --- [calhost] Task-3] org.apache.activemq.broker.region.Queue : queue://customer:msg:new, subscriptions=1, memory=0%, size=1, pending=0 toPageIn: 0, force:false, Inflight: 1, pagedInMessages.size 1, pagedInPendingDispatch.size 0, enqueueCount: 2, dequeueCount: 1, memUsage:1034, maxPageSize:200
2020-07-22 19:51:37.046 DEBUG 15828 --- [enerContainer-1] org.apache.activemq.TransactionContext : Rollback: 192.168.101.6.tm159541869603900213192.168.101.6.tm220
写回答
1回答
-
大漠风
2020-08-06
这个在视频里面可能没有着重说明,这个@JmsListener标记的方法,如果有返回值,它的返回值会被序列号后发送到设置的目标队列上。所以,这里的错误,不是因为你的代码里的jmsTemplate.convertAndSend() 发生的错误,而是Jms框架将这个方法返回的结果试图发到MQ上。所以只需要修改它的返回类型为void即可。
00
相似问题