Moje preferencje na coś takiego byłoby wykorzystanie Javy jak łatwiej zarządzać zadaniami tła jak co opisujesz.
Backend
Moje podejście byłoby użyć Java EE, aby utworzyć singleton wątku startowego, który implementuje usługę harmonogramu. Powodem użycia pojedynczego wątku startowego jest to, że twoje zadanie może działać jako proces w tle, a zatem nie jest blokowane, uwalniając zasoby dla reszty aplikacji. Dostęp do wątku można uzyskać również po prostu wywołując metodę na klasie. Możesz zaplanować, że zadanie będzie odczytywać twój plik co każde 'n' sekunda/minutę itd. Dla każdej aktualizacji, a następnie można je udostępnić w twoim interfejsie.
Podstawowe Przykład:
@Singleton
@Startup
public class Scheduler {
private static int count = 0;
private Weather weather;
public Weather getWeather() {
return weather;
}
@PostConstruct
public void onStartup() {
System.out.println("Initialization success.");
}
@Schedule(second="*/10", minute="*", hour="*")
public void execute() {
byte[] encoded = Files.readAllBytes(Paths.get("weather_updates.txt"));
String weatherUpdateStr = encoding.decode(ByteBuffer.wrap(encoded)).toString();
weather = new Weather();
weather.parse(weatherUpdateStr);
// Possible addition of logic for push to web socket
}
}
Ten prosty przykład tworzy wątek sigleton jako kontenera aplikacji internetowych (polecam przy użyciu JBoss 7) uruchamia. Następnie tworzy zaplanowane zadanie, które wykonuje się co 10 sekund. Podany kod wykonuje podstawowy plik Java 7 w postaci ciągu znaków, a kod weather.parse()
powinien zawierać pewną logikę, która przekształci ciąg znaków w obiekt Weather. Obiekt pogody jest następnie gotowy do przepchnięcia przez gniazdo sieciowe lub odpytywany przez niektóre żądania AJAX na interfejsie.
Frontend
Istnieją dwa możliwe podejścia Proponuję tutaj:
- gniazda sieci wykorzystujące HTML5
- AJAX wzywa
1. Gniazda sieci
Gniazda sieciowe zostały wprowadzone do HTML5 jako sposób dostarczania dynamicznej zawartości na stronie bez potrzeby odświeżania lub korzystania z wywołań AJAX. Here to świetne wprowadzenie do websockets w HTML5. Here is another great example of how to set up HTML5 websockets with Java.
2. AJAX wzywa
jQuery stanowi wielką API dla AJAX. W jQuery można wdrożyć zadanie Timeout, które będzie sporadycznie wykonywać niektóre funkcje. Funkcją, którą chcesz zaimplementować, jest i AJAX Get request.
Podstawowe przykład:
$.ajax({
url: "getWeatherUpdate.html",
error: function(){
// will fire when timeout is reached
},
success: function(){
// Update your webpage with weather info
},
timeout: 3000 // sets timeout to 3 seconds
});
Cóż, to nie działa, nadal ładuje się, nawet jeśli jest w trybie bez blokowania i nie można zrobić nic innego, gdy wciąż czeka na dane. Potrzebuję go do wyrzucenia danych po dokonaniu zmian w plikach i robieniu czegoś innego w php. – demic0de
Właściwie to działa, ale Layke zawierał także blokujące wywołanie odczytu. Poprawiłem kod. –