Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot Thread Example / 22 сообщений из 22, страница 1 из 1
10.04.2016, 19:14
    #39211994
Andrey3k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
Работаю с 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
10.04.2016, 19:16
    #39211995
lor2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
Andrey3k,

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

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

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

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

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

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

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

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

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


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

Наиболее простым решением, мне кажется, будет рефакторинг BookReader в Bean и аннотирование его методов как @Async. Если спринг настроен полноценно, он поймет, что вы хотите вызов метода бина в фоновом потоке и сделает это за вас. К тому же это избавит вас от подвоных камней, связанных с созданием потоков самостоятельно.
...
Рейтинг: 0 / 0
11.04.2016, 14:39
    #39212581
Andrey3k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
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
11.04.2016, 14:59
    #39212626
Andrey3k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
lor2Andrey3k,
я видимо, сути не улавливаю тебе надо вернуть аддбук с какими то значениями, которые подготовятся параллельным тредом? но если ты адбук вернешь до того как результат треда появится то в чем суть? если надо вернуть результат треда - то или джойн или тупо лок. а если не надо - то и пофик. не понимаю сути проблемы.
Я подумал и решил, что если метод addBook будет ждать пока BookReader подготовит результат, то этот вариант не будет рабочим. Нужно чтобы addBook завершил работу раньше BookReader

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

Делается это потому что BookReader может долго разбивать книгу на страницы, а addBook должен отрабатывать сразу.
...
Рейтинг: 0 / 0
11.04.2016, 15:10
    #39212660
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
Andrey3kЯ подумал и решил, что если метод addBook будет ждать
ты в реальном контейнере тестировал?
Если сервлетный контейнер, то никто никого ждать не будет. На новый запрос будет новый поток для addBook.
...
Рейтинг: 0 / 0
11.04.2016, 15:17
    #39212683
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
Andrey3kПоэтому не нужно возвращать результат треда.
Да? А что тогда делать с переменной pages?
...
Рейтинг: 0 / 0
11.04.2016, 15:20
    #39212692
Andrey3k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
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
11.04.2016, 15:27
    #39212702
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
Andrey3k,
и весь код выше тоже в этот поток, т.к. они ничего не делает.
...
Рейтинг: 0 / 0
11.04.2016, 17:33
    #39212896
Andrey3k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
Переписал код с использованием @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
11.04.2016, 18:14
    #39212933
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
@Autowired
BookThread bookthread;
...
Рейтинг: 0 / 0
11.04.2016, 18:20
    #39212940
Andrey3k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
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
11.04.2016, 19:05
    #39212977
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
Andrey3kВ чем может быть дело ?
Код: plaintext
1.
[ ] знает, что такое пошаговая отладка
[x] не знает, что такое пошаговая отладка
...
Рейтинг: 0 / 0
11.04.2016, 19:35
    #39212988
Andrey3k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
chpashaAndrey3kВ чем может быть дело ?
Код: plaintext
1.
[ ] знает, что такое пошаговая отладка
[x] не знает, что такое пошаговая отладка

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

Как раз помогает и объясняет в чем именно проблема, что намного информативнее NPE. Че там спринговых конфигах? Классы прописаны или сканирование пакетов?
...
Рейтинг: 0 / 0
12.04.2016, 10:26
    #39213294
Andrey3k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
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
12.04.2016, 12:44
    #39213498
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot Thread Example
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot Thread Example / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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