Безопасно ли вызывать и уведомлять об объектах, управляемых PlayFramework (JPA / Hibernate backend)? - PullRequest
2 голосов
/ 13 апреля 2011

Предположим, у меня есть простая модель

package models;

import javax.persistence.Entity;
import play.db.jpa.Model;

@Entity
public class Chart extends Model {

    public String name;

    @Lob
    public String json;
}

Теперь, если бы мне нужно было извлечь объект из класса Chart с помощью метода следующим образом

Chart c = Chart.findById(1L);
doSomethingWithChartAndLetMeKnow(c)
c.wait();

Теперь в этом методе doSomethingWithChartAndLetMeKnow,Как только я закончу обработку, я могу вызвать c.notifyAll (), и предположительно оригинальный метод продолжит выполняться.

Однако, что если совершенно другой метод сделает следующее

Chart c = Chart.findById(1L);
c.notifyAll();

, будет ли вообще вызван исходный поток, ожидающий метода doSomethingWithChartAndLetMeKnow?

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Нет, это не разбудит оригинальную тему.

Два запроса обрабатываются отдельными сессиями.Объекты, полученные в разных сеансах, не являются одним и тем же объектом Java.

Однако вы должны проверить асинхронную поддержку Play! Вместо использования notify () и wait (): http://www.playframework.org/documentation/1.2/asynchronous

0 голосов
/ 13 апреля 2011

Я думаю, что это неправильно:

Теперь в этом doSomethingWithChartAndLetMeKnow метод, как только я закончу обработку, я может вызвать c.notifyAll () и предположительно оригинальный метод будет продолжен выполнение.

как бы вы ни звонили, оповестите до ожидания. Как только он дойдет до ожидания при вызове метода, он будет ждать другого уведомления.

Тем не менее, я бы не рекомендовал использовать потоки в любом веб-приложении таким образом. Проверьте Akka или некоторую Actor-model библиотеку. Это сделает вещи проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...