Взаимодействие между разными приложениями Java можно сделать с помощью файловой системы, базы данных и JMS. Рассмотрим случай ФС - в Java SE 7 появился новый и очень интересный механизм отслеживания изменений файловой системы в заданном каталоге - так называемый Watch Service, позволяющий остлеживать события создания / удаления / изменения файлов в реальном времени. То есть вы можете например создать каталоги /tmp/tasks/task1, /tmp/tasks/task2 и тогда к примеру одно приложение будет вносить в эти каталоги какие-либо изменения - а другое приложение будет отслеживать эти изменения в real-time и в зависимости от каталога и характера изменений запускать соответствующие задачи. Вот метод из десктопного проекта с использованием Spring, который работает в отдельном потоке от основного и отслеживает изменения в каталоге /tmp/tasks/task1 и когда вы руками (вместо другого приложения:)) кладете / удаляете файл в /tmp/tasks/task1 - выводится соответствующее сообщение.
// async-метод для получения задач
@Async // СКАНИРУЕМ НА НОВОЕ ЗАДАНИЕ в отдельном потоке
public void receiveTaskChecker() {
try {
WatchService watcher = FileSystems.getDefault().newWatchService();
// сканируем на изменения соотв каталог для задачи номер 1:
Path dir = FileSystems.getDefault().getPath("/tmp/tasks/task1");
WatchKey key = dir.register(watcher,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE);
// Экземпляры WatchKey потокобезопасны.
while (true) {
key = watcher.take(); // блокирует поток пока не появится событие
// есть также неблокирующий способ получения key:
//key = watcher.poll(5, TimeUnit.SECONDS);
for (WatchEvent<?> event : key.pollEvents()) {
if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
// запускаем выполнение нужной задачи
@Async // СКАНИРУЕМ НА НОВОЕ ЗАДАНИЕ в отдельном потоке
public void receiveTaskChecker() {
try {
WatchService watcher = FileSystems.getDefault().newWatchService();
// сканируем на изменения соотв каталог для задачи номер 1:
Path dir = FileSystems.getDefault().getPath("/tmp/tasks/task1");
WatchKey key = dir.register(watcher,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE);
// Экземпляры WatchKey потокобезопасны.
while (true) {
key = watcher.take(); // блокирует поток пока не появится событие
// есть также неблокирующий способ получения key:
//key = watcher.poll(5, TimeUnit.SECONDS);
for (WatchEvent<?> event : key.pollEvents()) {
if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
// запускаем выполнение нужной задачи
System.out.println("File task created \n");
}
if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
// запускаем выполнение нужной задачи
System.out.println("File task deleted \n");
}
}
key.reset();
}
} catch (IOException | InterruptedException ex) { }
}
}
if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
// запускаем выполнение нужной задачи
System.out.println("File task deleted \n");
}
}
key.reset();
}
} catch (IOException | InterruptedException ex) { }
}
demo-пример с исходниками - https://github.com/harp077/Watch-Service-Demo
Комментариев нет:
Отправить комментарий