Как отправлять сообщения с сервера на клиент?

Я собираюсь реализовать что-то похожее на уведомление Facebook и этот сайт (уведомление StackOverflow, которое уведомляет нас, если кто-то напишет комментарий/ответ и т. д. Для нашего вопроса). Обратите внимание, что пользователи будут использовать мое приложение в качестве веб-сайта, а не мобильного приложения.

я наткнулся на следующее ответ которые приносят результаты, но мне нужно нажать результаты не fetch.

на основе предложений я создал простой способ, на мой класс сущности и добавил к нему @PostPersist, но он не работал так на основе ответ я добавил настойчивость.xml-файл для определения прослушивателей, но после сеанса.сохранить(пользователь) метод aftersave не срабатывает.

пользователей.java

@Entity
public class User{
  .....
  @PostPersist
    public void aftersave(){
        System.err.println("*****this is post persist method****");
    }
}

настойчивость.в XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->

<property name="hibernate.ejb.event.pre-insert"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.pre-update"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.pre-delete"  value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-insert" value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-update" value="my.hibernate.events.listeners.Listener" />
<property name="hibernate.ejb.event.post-delete" value="my.hibernate.events.listeners.Listener" />

пом.в XML

 <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.2.1.Final</version>
            <type>jar</type>
        </dependency>

6 ответов


звучит как задача для WebSockets. Это часть Java EE 7, поэтому Glassfish должен быть одним из первых, так как это будет поддерживать его.

для перехвата доступа к БД вы можете использовать @PostUpdate и @PostPersist. Вот связанные вопрос.

существует много способов сделать так называемый сервер Push для уведомления подключенных клиентов:

EDIT: в Java мир, есть пара фреймворков, где сервер push (обратный ajax) реализован из коробки. Если вы знакомы с GWT, Я бы предложил Errai. Другой альтернативой является атмосфера. Недостатком Atmospere является тот факт, что он требует автономного запущенного процесса рядом с вашим обычным сервером приложений с вашим веб-приложением. Я играл с ним год назад, так что это, возможно, изменилось с тех пор.

В общем, это трудно предоставить вам конкретный фрагмент кода, потому что это зависит от структуры, которую вы выберете. Я знаком с Errai так вот пример в нем:

Сервер:

@ApplicationScoped
public class TickerService {

  @Inject
  private Event<Tick> tickEvent;

  private void sendTick() {
    tickEvent.fire(new Tick());
  }
} 

На Стороне Клиента:

@EntryPoint
public class TickerClient {
  public void tickHappened(@Observes Tick tick) {

    // update the UI with the new data
  }
}

другие преимущества использования Errai имеет CDI на сервере и на клиенте из коробки еще одна вещь, которая хороша, это использование веб-сокетов под крышками, если в противном случае он поддерживается и возвращается к другим решениям.

что бы вы ни выбрали, он должен соответствовать вашей существующей инфраструктуре и клиентской стороне UI framework.


mqtt можно использовать для сервера нажимая и широковещания сообщения.

более подробная информация в http://mqtt.org/.

======================================

Обновлено: 11 Июля 2013

Mqtt-это публикация / подписка, чрезвычайно простой и легкий протокол обмена сообщениями. Если сервер является издателем, а браузер клиента подписывается на тему, на которую публикуется сервер, сервер может напрямую отправлять сообщения клиенту.

полезные ресурсы:

Mosquitto - это сервер mqtt с открытым исходным кодом. Простота установки и настройки.

mqtt-client является проверенным мощным клиентом java mqtt.


использовать узел JS и гнездо.io

эта технология выбирает лучший способ транспортировки на основе браузера, который использует клиент.

для последних браузеров он использует веб-сокеты, а для других он изящно деградирует до Флэш-сокета или длительного объединения. подробнее здесь

Что вам нужно сделать, это настроить сервер с использованием этих технологий. Сервер будет работать в определенном порту. Все клиенты будут слушать этот порт и сервер может отправлять данные клиенту через этот порт.


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

Comet (он же долгоживущий http, сервер push) позволяет серверу начать отвечать на запрос браузера на информацию очень медленно и продолжать отвечать по расписанию, продиктованному сервером. For more информацию о комете смотрите ниже:

DWR - это библиотека Java, которая позволяет Java на сервере и JavaScript в браузере взаимодействовать и звонить друг другу как можно проще. С Reverse Ajax DWR позволяет Java-коду, работающему на сервере, использовать API на стороне клиента для публикации обновлений произвольных групп браузеров. Это позволяет взаимодействовать 2 способами-браузер вызывающий сервер и сервер вызывающий браузер. DWR поддерживает Comet, Polling и Piggyback (отправка данных с обычными запросами) как способы публикации в браузерах.

DWR обеспечивает интеграцию с пружиной, стойками, Guice, Hibernate и другими. Вы можете прочитать больше от здесь.

другие рамки Comet и Reverse AJAX:


но после сессии.сохранить(пользователь) метод aftersave не срабатывает.

  • @PostPersist является обратным вызовом JPA.
  • session.save() является не-JPA, hibernate собственный метод. В JPA используется entityManager.persist().
  • вы используете несовместимые функции

проверка для обновления от сервера на каждых 30 секундах или согласно требованию.

window.setInterval(function(){
  /// call your function here
 //Make AJAX call
 //Update Respective HTML Contact i,e, DIV

}, 30000);