跳至主要内容

JAX-RS 2.1: Async improvements

Async improvements

In JAXRS 2.0, you can build an asynchronous RESTful APIs as the following.
@GET
public void getAsync(final @Suspended AsyncResponse res) {
 res.setTimeoutHandler(
   (ar) -> {
    ar.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE)
      .entity("Operation timed out --- please try again.").build());
   }
 );
 res.setTimeout(1000, TimeUnit.MILLISECONDS);
 executor.submit(() -> {
  //do long run operations.
  try {
   LOG.log(Level.INFO, " execute long run task in AsyncResource");
   //Thread.sleep(new Random().nextInt(1005));
   Thread.sleep(500);
  } catch (InterruptedException ex) {
   LOG.log(Level.SEVERE, "error :" + ex.getMessage());
  }
  res.resume(Response.ok("asynchronous resource").build());
 });
}
Inject @Suspended AsyncResponse res as the method parameter, call res.resume() to return response result asynchronously.
Or combined with EJB @Asynchronous.
@GET
@Asynchronous
public void getAsync(final @Suspended AsyncResponse res) {

 //perform long run operations.
 try {
  LOG.log(Level.INFO, " execute long run task in EjbAsyncResource");
  Thread.sleep(500);
 } catch (InterruptedException ex) {
  LOG.log(Level.SEVERE, "error :" +ex.getMessage());
 }

 res.resume(Response.ok("Asynchronus EJB resource").build());
}
JAXRS 2.1 allow you return a CompletionStage directly.
@GET
public CompletionStage<String> getAsync() {
 CompletionStage<String> cs = CompletableFuture
   .<String>supplyAsync(
     () -> {
      try {
       LOG.log(Level.INFO, " execute long run task in CompletionStageResource");
       Thread.sleep(500);
      } catch (InterruptedException ex) {
       LOG.log(Level.SEVERE, "error :" +ex.getMessage());
      }
      return "return CompletableFuture instead of @Suspended";
     }
       // , executor
   );

 return cs;
}
Grab the source codes from my github account, and have a try.

评论

此博客中的热门博文

Build a Reactive application with Angular 5 and Spring Boot 2.0

I have created a post to describe Reactive programming supports in Spring 5 and its subprojects, all codes of this article are updated the latest Spring 5 RELEASE, check spring-reactive-sample under my Github account.
In this post, I will create a simple blog system, including:
A user can sign in and sign out.An authenticated user can create a post.An authenticated user can update a post.Only the user who has ADMIN role can delete a post.All users(including anonymous users) can view post list and post details.An authenticated user can add his comments to a certain post. The backend will be built with the latest Spring 5 reactive stack, including:
Spring Boot 2.0, at the moment the latest version is 2.0.0.M7Spring Data MongoDB supports reactive operations for MongoDBSpring Session adds reactive support for WebSessionSpring Security 5 aligns with Spring 5 reactive stack The frontend is an Angular based SPA and it will be generated by Angular CLI.
The source code is hosted on Github, …

Activating CDI in JSF 2.3

Activating CDI in JSF 2.3 When I upgraed my Java EE 7 sample to the newest Java EE 8, the first thing confused me is the CDI beans are not recoganized in Facelects template in a JSF 2.3 based web applicaiton, which is working in the development version, but in the final release version, they are always resolved as null. I filed an issue on Mojarra and discussed it with the developers from communities and the JSF experts.
According to the content of README, In a JSF 2.3 application, to activate CDI support, declaring a 2.3 versioned faces-config.xml and adding javax.faces.ENABLE_CDI_RESOLVER_CHAIN in web.xml is not enough, you have to declare @FacesConfig annotated class to enable CDI.
Here is the steps I created a workable JSF 2.3 applicatoin in Java EE 8.
Create a Java web application, this can be done easily by NetBeans IDE, or generated by Maven archetype, for exmaple.
$ mvn archetype:generate -DgroupId=com.example -DartifactId=demo -DarchetypeArtifactId=maven-archetype-w…

JPA 2.1: Attribute Converter

JPA 2.1: Attribute Converter If you are using Hibernate, and want a customized type is supported in your Entity class, you could have to write a custom Hibernate Type. JPA 2.1 brings a new feature named attribute converter, which can help you convert your custom class type to JPA supported type. Create an Entity Reuse thePostentity class as example. @Entity @Table(name="POSTS") public class Post implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name="ID") private Long id; @Column(name="TITLE") private String title; @Column(name="BODY") private String body; @Temporal(javax.persistence.TemporalType.DATE) @Column(name="CREATED") private Date created; @Column(name="TAGS") private List<String> tags=new ArrayList<>(); } Create an attribute converter In this example…