Java Spring@Transactional卡在GCP发布/订阅异步订阅服务器内部

Java Spring@Transactional卡在GCP发布/订阅异步订阅服务器内部,java,spring,google-cloud-platform,transactions,publish-subscribe,Java,Spring,Google Cloud Platform,Transactions,Publish Subscribe,我正在开发一个过程,在这个过程中,它通过异步订阅者侦听GCP发布/子主题。当消息到达时,订户类调用@Service类,该类使用DAO将数据保存在postgreSQL数据库中 问题是,当接收方类调用带有@Transactional注释的@Service class方法时,流程会被卡住 我尝试了以下方法: 从方法中删除@Transactional注释并使用异步订阅服务器,它可以正常工作 使用@Transactional注释和同步订阅服务器而不是异步订阅服务器,它可以工作 我知道异步订阅使用守护进

我正在开发一个过程,在这个过程中,它通过异步订阅者侦听GCP发布/子主题。当消息到达时,订户类调用@Service类,该类使用DAO将数据保存在postgreSQL数据库中

问题是,当接收方类调用带有@Transactional注释的@Service class方法时,流程会被卡住

我尝试了以下方法:

  • 从方法中删除@Transactional注释并使用异步订阅服务器,它可以正常工作
  • 使用@Transactional注释和同步订阅服务器而不是异步订阅服务器,它可以工作
我知道异步订阅使用守护进程线程,我认为这是进程卡住的原因

我调试了这个过程,发现它卡在了一个名为CglibAopProxy的类中

以下是我使用的方法的代码,出于简化的原因对其进行了修改:

@Component
public class Subscriber {
    
    private void listen() {
        
        Subscriber subscriber = null;
        try {
            subscriber = Subscriber.newBuilder(subscriptionName, receiver)
                    .build();
            subscriber.startAsync().awaitRunning();
            subscriber.awaitTerminated();
        } catch (Exception e) {
            LOG.warn("An error ocurred listening messages : ", e);
        }
    }
}


@Component
public class Receiver implements MessageReceiver {
        
    @Override
    public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
        
        Event event = gson.fromJson(message.getData().toStringUtf8(), Event.class);
        service.create(event);
        
    }

}

@Service
public class Service {

    @Transactional
    public void create(Event event) {
        DAO1.save();
        DAO2.save();
        DAO3.save();
        DAO4.save();
    }

}

对不起,我的英语不好。

你是收到错误还是只是被绊倒了?。如果你收到了错误,你能分享一下错误信息吗?它只是被卡住了,没有显示错误(不要为没有掌握作为第一语言学习英语的成年人所期望的英语而感到悲伤。不过,请向拼写检查人员寻求帮助。)似乎它可能与源代码有关,我建议您在SpringRepo中直接提出一个问题,以获得处理该问题的团队的支持。此外,由于没有显示错误,可能您可以尝试使用探查器从卡住的线程获取堆栈跟踪。这将有助于缩小根本原因。