2010-08-30 1 views
2

У меня есть простой веб-сервис, созданный с помощью Netbeans 6.5, и развернутый на 2 серверах 2-го уровня V2.1 и V3. У ws есть базовый метод GetInstanceID, который я вызываю 3 раза от клиента.Могу ли я обладать веб-сервисом lifecycle oneton на стеклянную рыбку V3?

@WebService() 
public class FirstWS { 

private long m_instanceID = 0; //instance id 

//Log 
private void WriteLog(String cadena){ 
    String msg = ""; 
    DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss:SSS"); 
    Date fecha = new Date(); 
    msg = dateFormat.format(fecha) + " ***** " + this.getClass().getName() + " (m_instanceID=" + m_instanceID + "): " + cadena + 
      "   " + "ThreadID=" + Thread.currentThread().getId() + " ThreadName=" + Thread.currentThread().getName(); 
    Logger.getLogger(this.getClass().getName()).log(Level.INFO,msg); 
} 

//Constructor 
public FirstWS() { 
    Random rnd = new Random(); 
    m_instanceID = rnd.nextLong(); 
    WriteLog("Executing Constructor"); 
} 

//PostConstruct 
@PostConstruct 
public void ThisIsThePostConstruct() { 
    WriteLog("Executing PostConstruct"); 
} 

//PreDestroy 
@PreDestroy 
public void ThisIsThePreDestroy() { 
    WriteLog("Executing PreDestroy"); 
} 

//Method 
@WebMethod(operationName = "GetInstanceID") 
@WebResult(name="InstanceID") 
public long GetInstanceID() { 
    //TODO write your implementation code here: 
    WriteLog("Executing GetInstanceID"); 
    return m_instanceID; 
} 

} 

Я всегда, хотя эти веб-службы были по умолчанию одиночными.

На сервере GlassFish V2.1 WS работает, как ожидалось, с одноплодной жизненного цикла:

  • только один экземпляр создается.
  • Только одно исполнение метода конструктора.
  • Только одно исполнение, если метод postconstructor.
  • Только одно исполнение метода predestroy, когда ws не используется.

журнала Client

InstanceID = -4747957096764272596

InstanceID = -4747957096764272596

InstanceID = -4747957096764272596

журнала сервера

26/08/2010 13: 08: 15: 146 ***** first.test.FirstWS (m_instanceID = -4747957096764272596): Выполнение Конструктор ThreadID = 68 ThreadName = httpSSLWorkerThread-8080-0

26/08/2010 13: 08: 15: 161 ***** first.test.FirstWS (m_instanceID = -4747957096764272596): Выполнение PostConstruct ThreadID = 68 ThreadName = httpSSLWorkerThread-8080-0

26/08/2010 13:08: 15: 364 ***** first.test.FirstWS (m_instanceID = -4747957096764272596): Выполнение GetInstanceID ThreadID = 69 ThreadName = httpSSLWorkerThread-8080-1

26/08/2010 13: 08: 15: 380 ** *** first.test.FirstWS (m_instanceID = -4747957096764272596): Выполнение GetInstanceID ThreadID = 69 ThreadNa я = httpSSLWorkerThread-8080-1

26/08/2010 13: 08: 15: 396 ***** first.test.FirstWS (m_instanceID = -4747957096764272596): Выполнение GetInstanceID ThreadID = 69 ThreadName = httpSSLWorkerThread-8080 -1

26/08/2010 13: 08: 38: 849 ***** first.test.FirstWS (m_instanceID = -4747957096764272596): Выполнение PreDestroy ThreadID = 626 ThreadName = тема-540

Но на сервере glassfish V3 сервер ws работает не так, как ожидалось, потому что новый экземпляр ws создается для КАЖДОГО вызова GetInstanceID:

  • Один экземпляр создается для каждого вызова.
  • Одно исполнение метода конструктора для каждого вызова.
  • Два (!?!?!) Исполнения метода postconstructor для каждого вызова.
  • Метод предопределения не вызывается, когда ws не используется.

журнала Client

InstanceId = 7754248300017958713

InstanceId = -1714184485890589231

InstanceId = -4156829683887899017

журнала сервера

INFO: 26/08/2010 15: 16: 11: 429 ***** first.test.FirstWS (m_instanceID = 7754248300017958713): Выполнение конструктора ThreadID = 103 ThreadName = http-thread-pool-8080- (2)

INFO: 26/08/2010 15: 16: 11: 429 ***** first.test.FirstWS (m_instanceID = 7754248300017958713): Выполнение PostConstruct ThreadID = 103 ThreadName = http-thread-pool-8080- (2)

INFO: 26/08/2010 15: 16: 11: 429 ***** first.test.FirstWS (m_instanceID = 7754248300017958713): Выполнение PostConstruct ThreadID = 103 ThreadName = http-thread-pool-8080- (2)

INFO: 26/08/2010 15: 16: 12: 429 ***** first.test.FirstWS (m_instanceID = 7754248300017958713): Выполнение GetInstanceID T hreadID = 103 ThreadName = http-thread-pool-8080- (2)

INFO: 26/08/2010 15: 16: 12: 460 ***** first.test.FirstWS (m_instanceID = -1714184485890589231) : Выполнение конструктора ThreadID = 102 ThreadName = http-thread-pool-8080- (1)

INFO: 26/08/2010 15: 16: 13: 429 ***** first.test.FirstWS (m_instanceID = -1714184485890589231): Выполнение PostConstruct ThreadID = 102 ThreadName = http-thread-pool-8080- (1)

INFO: 26/08/2010 15: (m_instanceID = -1714184485890589231): Выполнение PostConstruct ThreadID = 102 ThreadName = http-thread-pool-8080- (1)

INFO: 26/08/2010 15: 16: 14: 429 ***** first.test.FirstWS (m_instanceID = -1714184485890589231): Выполнение GetInstanceID ThreadID = 102 ThreadName = http-thread-pool-8080- (1)

INFO: 26/08/2010 15: 16: 14: 445 ***** first.test.FirstWS (m_instanceID = -4156829683887899017): Выполнение конструктора ThreadID = 103 ThreadName = http-thread-pool-8080 - (2)

INFO: 26/08/2010 15: 16: 15: 429 ***** first.test.FirstWS (m_instanceID = -4156829683887899017): Выполнение PostConstruct ThreadID = 103 ThreadName = http-thread- pool-8080- (2)

INFO: 26/08/2010 15: 16: 15: 429 ***** first.test.FirstWS (m_instanceID = -4156829683887899017): Выполнение Pos tConstruct ThreadID = 103 ThreadName = http-thread-pool-8080- (2)

INFO: 26/08/2010 15: 16: 15: 429 ***** first.test.FirstWS (m_instanceID = -4156829683887899017): Выполнение GetInstanceID ThreadID = 103 ThreadName = http-thread-pool-8080- (2)

INFO: Закрытие контроля мониторинга Metro: amx: pp =/mon/server-mon [server], type = WSEndpoint, name =/FirstWebApplication-FirstWSService-FirstWSPort

Итак, почему это поведение на стеклянную рыбку V3? Как я могу получить веб-сервис singleton на стеклянной планете V3?

+0

Можете ли вы загрузить свой проект где-нибудь, чтобы мы могли его запустить? –

+0

Спасибо, но я нашел проблему, см. Мой ответ. Очевидно, что я новичок с java и веб-сервисами :-) – user434969

ответ

0

Наконец-то я нашел проблему: тип проекта. В NetBeans я создал веб-службу в проекте «Веб-приложение», поэтому он был развернут в контейнер сервлетов в Glassfish и @Stateless, а аннотации @Singleton не работают. Вы должны создать ws в проекте «EJB Moule», и он будет развернут в контейнер EJB, поэтому аннотации @Stateless и @Singleton работают правильно.

Как говорится в Java EE 6, «сеансовые компоненты Singleton предлагают аналогичную функциональность для сессионных компонентов без состояния, но отличаются от них тем, отвечают на запрос клиента. Подобно сессионным компонентам без состояния, одиночные сеансовые компоненты singleton могут реализовывать конечные точки веб-службы ».

0

Я думаю, что это может быть спецификация вопрос (Java EE 5 vs. Java EE 6), и вам, возможно, придется использовать @Stateless annotation: Коррекция

package com.sun.tutorial.javaee.ejb; 

import javax.ejb.Stateless; 
import javax.jws.WebMethod; 
import javax.jws.WebService; 

    @Stateless 
    @WebService 
    public class HelloServiceBean { 
     private String message = "Hello, "; 

     public void HelloServiceBean() {} 

     @WebMethod 
     public String sayHello(String name) { 
      return message + name + "."; 
     } 
    } 

: Это работает для меня в GlassFish v3.

+0

Спасибо, чтобы указать мне в правильном направлении – user434969