2016-01-20 7 views
1

Я пытаюсь создать службу Async REST с помощью RestEasy, но я не могу найти документацию, которая показывает чистый способ сделать это. Единственный пример, который я нашел здесь:RestEasy Async Controller Правильное использование

https://github.com/resteasy/Resteasy/blob/master/jaxrs/async-http-servlet-3.0/async-http-servlet-3.0-test/src/main/java/org/jboss/resteasy/test/async/JaxrsResource.java

@GET 
    @Produces("text/plain") 
    public void get(@Suspended final AsyncResponse response) throws Exception 
    { 
     response.setTimeout(2000, TimeUnit.MILLISECONDS); 
     Thread t = new Thread() 
     { 
     @Override 
     public void run() 
     { 
      try 
      { 
       System.out.println("STARTED!!!!"); 
       Thread.sleep(100); 
       Response jaxrs = Response.ok("hello").type(MediaType.TEXT_PLAIN).build(); 
       response.resume(jaxrs); 
      } 
      catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     }; 
     t.start(); 
    } 

Создание нового потока в методе не кажется, что лучший способ сделать что-то в производственной среде. Я чувствую, что должен получать поток из пула потоков или что-то в этом роде.

Любые предложения или ссылки на лучшие примеры были бы очень полезными.

ответ

0

Вы правы в использовании пула потоков. Пусть Весна позаботится об этом для вас.

Предполагая, что вы используете Spring как выбор для своего приложения, вы можете сделать что-то вроде.

Вы можете определить класс конфигурации для исполнителей Async.

@EnableAsync 
@Configuration 
public class AsyncConfiguration implements AsyncConfigurer { 

    @Inject 
    private Environment env; 

    @Bean 
    @Override 
    @Singleton 
    public Executor getAsyncExecutor() { 
     ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); 
     taskExecutor.setCorePoolSize(env.getProperty("controller.threadPoolTaskExecutor.corePoolSize", Integer.class, 10)); 
     taskExecutor.setMaxPoolSize(env.getProperty("controller.threadPoolTaskExecutor.maxPoolSize", Integer.class, 100)); 
     taskExecutor.setKeepAliveSeconds(env.getProperty("controller.threadPoolTaskExecutor.keepAliveSeconds", Integer.class, 60*5)); 
     taskExecutor.setQueueCapacity(env.getProperty("controller.threadPoolTaskExecutor.queueCapacity", Integer.class, 10000)); 
     taskExecutor.setThreadNamePrefix("controller-async-task-executor"); 
     return taskExecutor; 
    } 

    @Override 
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
     return new AsyncExceptionHandler(); 
    } 

} 

Вот как вы можете определить Exception Handler:

public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler { 

    private static final Logger logger = LoggerFactory.getLogger(AsyncExceptionHandler.class); 

    @Override 
    public void handleUncaughtException(Throwable ex, Method method, Object... params) { 
     logger.error("Error processing async request in method: " + method.getName(), ex); 
    } 
} 

Вот как ваш контроллер может выглядеть следующим образом:

@Inject 
private AsyncTaskExecutor asyncTaskExecutor; 

@GET 
@Produces("text/plain") 
public void get(@Suspended final AsyncResponse response) throws Exception 
{ 
    response.setTimeout(2000, TimeUnit.MILLISECONDS); 
    asyncTaskExecutor.submit(() -> { 
     System.out.println("STARTED!!!!"); 
     Thread.sleep(100); 
     Response jaxrs = Response.ok("hello").type(MediaType.TEXT_PLAIN).build(); 
     response.resume(jaxrs); 
    }); 
} 
Смежные вопросы