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即可。

0
0

分布式事务实践,从原理到实例,解决数据一致性

掌握分布式事务实现技术,是架构师必备技能。

1149 学习 · 153 问题

查看课程