情况:我有一个执行void方法的事务方法, 例如:
@Transactional
public void createCall() {
callManager.makeCall();
}
我们假设CallManager包含这样的方法:
public void makeCall() {
Call call = CallFactory.createCall();
CallListener listener = new CallListener();
call.addListener(listener);
call.connect();
}
如果connect()方法没有抛出异常,则makeCall()方法成功完成。
现在,在监听器中我们有处理程序方法,例如:
public void callTalking(AnyEvent event) {
//some logic
}
主要问题是:是否有一种漂亮的方式来保持我们的交易方法 createCall(),直到聆听者在 callTalking()中捕获事件而不使用超时?
修改 重要的信息,我正在使用gigaspace轮询事件,(很快就会说)在成功交易之后从数据库获取对象。
答案 0 :(得分:1)
这是同步的示例逻辑。请记住,如果它在一个线程上运行,它将永远阻止。在此示例中,主线程将阻塞,而Call工作的线程不会处理事件。
public void makeCall() {
Object semafor = new Object();
synchronized (semafor) {
try {
CallListener listener = new CallListener() {
@Override
public void callTalking(AnyEvent event) {
// some logic
synchronized (semafor) {
semafor.notify();
}
}
};
Call call = CallFactory.createCall();
call.addListener(listener);
call.connect();
semafor.wait();
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}