spring@transactional卡在gcp发布/订阅异步订阅服务器内部

biswetbf  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(269)

我正在开发一个进程,在这个进程中,它通过异步订阅服务器侦听gcp发布/子主题。当消息到达时,subscriber类调用@service类,该类使用daos将数据保存在postgresql数据库中。
问题是,当receiver类调用带有@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();
    }

}

对不起我的英语。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题