Как отправлять сообщения с сервера на клиент?
Я собираюсь реализовать что-то похожее на уведомление 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 для уведомления подключенных клиентов:
- опрос (ссылка, которую вы предоставили в вопросе ( " мы уже там? Мы уже там? ..."))
- опроса (более умный способ опроса-долгоживущая техника HTTP с использованием keepalive сообщений)
- WebSockets (JSR 356)
- контрейлерные
- SPDY(wiki)
- Сервер-Отправлено Событий (обзоры ответа, wiki)
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:
- Grizzly Comet API
- атмосфера
- AJAX push с ICEfaces
- асинхронный сервлет с использованием сервлета 3.0
но после сессии.сохранить(пользователь) метод 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);