powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot Thread Example
22 сообщений из 22, страница 1 из 1
Spring Boot Thread Example
    #39211994
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работаю с Spring Boot нужно разбиение книги на страницы BookReader.readDocFile readTxtFile выполнить в отдельном потоке.

Как это реализовать ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
@RestController
public class BookController {
	@Autowired
    private BookRepository bookrepository;
    
    @RequestMapping(value = "/addbook", method = RequestMethod.GET)
    public int addBook(@RequestParam(value = "name", required = true) String name,
    		@RequestParam(value = "author", required = true) String author,
    		@RequestParam(value = "description", required = true) String description,
    		@RequestParam(value = "category", required = true) String category,
    		@RequestParam(value = "login", required = true) String login,
    		@RequestParam(value = "fullpath", required = true) String fullpath) {
    	
    	File file = new File(fullpath);
    	
    	String extension = FilenameUtils.getExtension(fullpath);
    	
    	if( file.exists() && file.isFile() &&  ( extension.equals("doc") || extension.equals("txt") ) ) {
    	    File currDir = new File(".");
    	    String projectpath = currDir.getAbsolutePath();
    	    projectpath = projectpath.substring(0, projectpath.length()-1);
    	    projectpath = projectpath + "src\\main\\webapp\\";
    	    
    	    String librarypath = projectpath + "library" + "\\";
    	    String bookpath = librarypath + author + "\\" + name + "\\";
    	    
    	    new File(bookpath).mkdirs();
    	    
    	    int pages;
    	    // Нужно класть в папку library/login/категория//author/name для уникальности пути
    		if( extension.equals("doc") ) {
    			pages = BookReader.readDocFile(fullpath, bookpath + "book.html");
    		} else {
    			pages = BookReader.readTxtFile(fullpath, bookpath + "book.html");
    		}
    		
        	Book book = new Book(0, author, name, login, pages, 0, category, "library" + "/" + author + "/" + name + "/", description, null);
        	
        	int result = bookrepository.insertBook(book);
        	
        	return result;
    	} else
    		return 0;
    }
}



Как потоки в Java создаются знаю. Непонятно как выйти и вернуть результат из метода addBook.

Если я запущу поток то поток отработает поздно а нужно выйти из метода addBook.

Заранее спасибо за активность.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39211995
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey3k,

джоин, не?
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39211997
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Join не решает )

При джойне сначала отработает BookReader потом вернется результат из метода addbook.

Нужно наоборот чтобы метод addbook вернул результат раньше BookReader.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212010
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Andrey3k,
я видимо, сути не улавливаю тебе надо вернуть аддбук с какими то значениями, которые подготовятся параллельным тредом? но если ты адбук вернешь до того как результат треда появится то в чем суть? если надо вернуть результат треда - то или джойн или тупо лок. а если не надо - то и пофик. не понимаю сути проблемы.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212011
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а да, или вайт нотифай )
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212139
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kнужно разбиение книги на страницы BookReader.readDocFile readTxtFile выполнить в отдельном потоке.
Зачем.

Andrey3kКак потоки в Java создаются знаю.
Или думаете что знаете. Есть несколько причин на то чтобы не использовать new Thread() и ExecutorService в JEE и Spring контейнере.

Andrey3kНепонятно как выйти и вернуть результат из метода addBook.

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

Andrey3kЕсли я запущу поток то поток отработает поздно а нужно выйти из метода addBook.

Чиво? Новый поток чем мешает выйти из метода?
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212147
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kПри джойне сначала отработает BookReader потом вернется результат из метода addbook.
Нужно наоборот чтобы метод addbook вернул результат раньше BookReader.
Странно. С одной стороны вы пишете, что знаете как создавать потоки. С другой стороны, на эту тему нет ни одной строки кода.

Кстати, код вот такого вида
Код: java
1.
BookReader.readDocFile(fullpath, bookpath + "book.html");


Это надругательство над Spring Framework. Это решение стало передовиком идей Dependency Injection IoC в Java и за ее пределами. А вы так сразу шашкой "нахрен нам бины", давайте использовать процедуры и статические методы глобальной видимости.

Наиболее простым решением, мне кажется, будет рефакторинг BookReader в Bean и аннотирование его методов как @Async. Если спринг настроен полноценно, он поймет, что вы хотите вызов метода бина в фоновом потоке и сделает это за вас. К тому же это избавит вас от подвоных камней, связанных с созданием потоков самостоятельно.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212581
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAndrey3kПри джойне сначала отработает BookReader потом вернется результат из метода addbook.
Нужно наоборот чтобы метод addbook вернул результат раньше BookReader.
Странно. С одной стороны вы пишете, что знаете как создавать потоки. С другой стороны, на эту тему нет ни одной строки кода.

Кстати, код вот такого вида
Код: java
1.
BookReader.readDocFile(fullpath, bookpath + "book.html");


Это надругательство над Spring Framework. Это решение стало передовиком идей Dependency Injection IoC в Java и за ее пределами. А вы так сразу шашкой "нахрен нам бины", давайте использовать процедуры и статические методы глобальной видимости.

Наиболее простым решением, мне кажется, будет рефакторинг BookReader в Bean и аннотирование его методов как @Async. Если спринг настроен полноценно, он поймет, что вы хотите вызов метода бина в фоновом потоке и сделает это за вас. К тому же это избавит вас от подвоных камней, связанных с созданием потоков самостоятельно.
Спасибо за наводку и замечание.

@Async я как раз таки не учел.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212626
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2Andrey3k,
я видимо, сути не улавливаю тебе надо вернуть аддбук с какими то значениями, которые подготовятся параллельным тредом? но если ты адбук вернешь до того как результат треда появится то в чем суть? если надо вернуть результат треда - то или джойн или тупо лок. а если не надо - то и пофик. не понимаю сути проблемы.
Я подумал и решил, что если метод addBook будет ждать пока BookReader подготовит результат, то этот вариант не будет рабочим. Нужно чтобы addBook завершил работу раньше BookReader

Поэтому не нужно возвращать результат треда. Задача сводится к тому, чтобы просто запустить BookReader в отдельном потоке.

Делается это потому что BookReader может долго разбивать книгу на страницы, а addBook должен отрабатывать сразу.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212660
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kЯ подумал и решил, что если метод addBook будет ждать
ты в реальном контейнере тестировал?
Если сервлетный контейнер, то никто никого ждать не будет. На новый запрос будет новый поток для addBook.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212683
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kПоэтому не нужно возвращать результат треда.
Да? А что тогда делать с переменной pages?
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212692
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAndrey3kПоэтому не нужно возвращать результат треда.
Да? А что тогда делать с переменной pages?
Можно
Код: java
1.
2.
3.
Book book = new Book(0, author, name, login, pages, 0, category, "library" + "/" + author + "/" + name + "/", description, null);
        	
int result = bookrepository.insertBook(book);



сделать внутри потока где будет работать BookReader.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212702
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3k,
и весь код выше тоже в этот поток, т.к. они ничего не делает.
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212896
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал код с использованием @Async методов.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
@RestController
public class BookController {
	BookThread bookthread;
	  
    @RequestMapping(value = "/addbook", method = RequestMethod.GET)
    public int addBook(@RequestParam(value = "name", required = true) String name,
    		@RequestParam(value = "author", required = true) String author,
    		@RequestParam(value = "description", required = true) String description,
    		@RequestParam(value = "category", required = true) String category,
    		@RequestParam(value = "login", required = true) String login,
    		@RequestParam(value = "fullpath", required = true) String fullpath) {
    	
    	File file = new File(fullpath);
    	
    	String extension = FilenameUtils.getExtension(fullpath);
    	
    	if( file.exists() && file.isFile() && ( extension.equals("doc") || extension.equals("txt") ) ) {
    		File currDir = new File(".");
    	    String projectpath = currDir.getAbsolutePath();
    	    projectpath = projectpath.substring(0, projectpath.length()-1);
    	    projectpath = projectpath + "src\\main\\webapp\\";
    	    
    	    String librarypath = projectpath + "library" + "\\";
    	    String bookpath = librarypath + author + "\\" + name + "\\";
    	    
    	    new File(bookpath).mkdirs();

    	    // Нужно класть в папку library/login/категория/author/name для уникальности пути
        	Book book = new Book(0, author, name, login, 0, 0, category, "library" + "/" + author + "/" + name + "/", description, null);
        	
        	if( extension.equals("doc") ) {
        		bookthread.readDocBook(fullpath, bookpath + "book.html", book);
			} else if( extension.equals("txt") ) {
        		bookthread.readTxtBook(fullpath, bookpath + "book.html", book);
			}
    	    
    	    return 1;
    	} else
    		return 0;
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
@Service
public class BookThread {
	@Autowired
    private BookRepository bookrepository;

    @Async
    public void readDocBook(String fullpath, String bookpath, Book book) {
    	System.out.println("//----------- readTxtBook starts");

    	int pages = BookReader.readTxtFile(fullpath, bookpath);
    	
    	book.setPages(pages);
		
		bookrepository.insertBook(book);
		
    	System.out.println("//----------- readTxtBook ends");
    }
	
    @Async
    public void readTxtBook(String fullpath, String bookpath, Book book) {
    	System.out.println("//----------- readTxtBook starts");

    	int pages = BookReader.readTxtFile(fullpath, bookpath);
    	
    	book.setPages(pages);
		
		bookrepository.insertBook(book);
		
    	System.out.println("//----------- readTxtBook ends");
    }
}



При запуске проекта ошибка:
Код: java
1.
2.
java.lang.NullPointerException: null
	at com.andrey3k.springboot.controller.BookController.addBook(BookController.java:84)



В чем может быть дело ?
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212933
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@Autowired
BookThread bookthread;
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212940
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT@Autowired
BookThread
bookthread;
Пробовал не помогает.

Вещает.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.andrey3k.book.BookThread com.andrey3k.springboot.controller.BookController.bookthread; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.andrey3k.book.BookThread] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212977
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kВ чем может быть дело ?
Код: plaintext
1.
[ ] знает, что такое пошаговая отладка
[x] не знает, что такое пошаговая отладка
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39212988
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaAndrey3kВ чем может быть дело ?
Код: plaintext
1.
[ ] знает, что такое пошаговая отладка
[x] не знает, что такое пошаговая отладка

пошаговая отладка ниче не дает. Тут Nullpointer
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39213067
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kпошаговая отладка ниче не дает. Тут Nullpointer
эвоно как
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39213175
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kПробовал не помогает.

Как раз помогает и объясняет в чем именно проблема, что намного информативнее NPE. Че там спринговых конфигах? Классы прописаны или сканирование пакетов?
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39213294
Andrey3k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAndrey3kПробовал не помогает.

Как раз помогает и объясняет в чем именно проблема, что намного информативнее NPE. Че там спринговых конфигах? Классы прописаны или сканирование пакетов?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Controller
@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableAsync
public class Application extends SpringBootServletInitializer {

    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}
...
Рейтинг: 0 / 0
Spring Boot Thread Example
    #39213498
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey3kBlazkowiczпропущено...

Как раз помогает и объясняет в чем именно проблема, что намного информативнее NPE. Че там спринговых конфигах? Классы прописаны или сканирование пакетов?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
@Controller
@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableAsync
public class Application extends SpringBootServletInitializer {

    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}



@ComponentScan(basePackageClasses =
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot Thread Example
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]