保持线程直到侦听器捕获事件

时间:2017-11-05 07:43:49

标签: java listener spring-transactions

情况:我有一个执行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轮询事件,(很快就会说)在成功交易之后从数据库获取对象。

1 个答案:

答案 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();
        }
    }
}