我正在开发一个进程,在这个进程中,它通过异步订阅服务器侦听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();
}
}
对不起我的英语。
暂无答案!
目前还没有任何答案,快来回答吧!