2017-12-02 5 views
1

私は非常に簡単なtomcatとjerseyサーブレットのセットアップに取り組んでいます。私はサーブレットクラスがリクエストごとに構築されていることに気付きました。私がサーブレットについて読んだのは、init()、service()、destroy()を一度実行することです。なぜ私のセットアップの場合ではないですか?以下はすべてのリクエストでジャージーサーブレットクラスが構築されました

私のweb.xml

<!DOCTYPE web-app PUBLIC 
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
     "http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 

    <servlet> 
     <servlet-name>contact-dropbox-servlet</servlet-name> 
     <servlet-class> 
      org.glassfish.jersey.servlet.ServletContainer 
     </servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>com.inbhiwadi.services</param-value> 
     </init-param> 
     <init-param> 
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>contact-dropbox-servlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

そして、私のサーブレット・エントリ・クラスは、以下のようになりますされています。私は、複数の要求にサービスを提供ContactDropboxServiceの単一のインスタンスを持つことが

@Path("/contact") 
@Slf4j 
public class ContactDropboxService { 

    private ContactDAO contactDAO; 

    private NotificationPublisher notificationPublisher; 

    public ContactDropboxService() { 
     ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Module.xml"); 
     this.contactDAO = (ContactDAO) context.getBean("contactDAO"); 
     this.notificationPublisher = (NotificationPublisher) context.getBean("notificationPublisher"); 
     log.debug("ContactDropboxService constructed one more time"); 
    } 

    @GET 
    public String greet() { 
     log.info("Welcome to InBhiwadi contact services!"); 
     return "Welcome to InBhiwadi contact services"; 
    } 

    @POST 
    @Path("/drop") 
    public Response create(Contact contact) { 

     log.debug("Received contact is : [{}]", contact.toString()); 
     contactDAO.create(contact); 
     notificationPublisher.publish(contact.toString()); 
     return Response.accepted("Contact dropped in box").build(); 
    } 
} 

何をすべきでしょうか?

答えて

2

デフォルトでは、Jerseyは要求ごとにリソースクラスをインスタンス化します。リソースクラスのインスタンスを1つしか持たない場合は、@ Singletonで注釈を付ける必要があります。詳細はこちらをご覧ください。question

+0

同時リクエストをどのように処理するのか不思議です。別の要求が最初に処理される前に複数のスレッドがforkされるかどうか。はいの場合は、並行処理は手動で処理されますか? –

関連する問題