Могу ли я иметь единый веб-сервис жизненного цикла на Glassfish V3? - PullRequest
2 голосов
/ 30 августа 2010

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

@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 работает, как и ожидалось, с единственным жизненным циклом:

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

Журнал клиента

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 ThreadName = httpSSLWorkerThread-8080-1

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

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

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

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

Журнал клиента

InstanceId = 7754248300017958713

InstanceId = -1714184485890589231

InstanceId = -4156829683887899017

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

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

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 11: 429 ***** first.test.FirstWS (m_instanceID = 7754248300017958713): Выполнение PostConstruct ThreadID = 103 ThreadName = http-thread-pool-8080- (2 )

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 11: 429 ***** first.test.FirstWS (m_instanceID = 7754248300017958713): Выполнение PostConstruct ThreadID = 103 ThreadName = http-thread-pool-8080- (2 )

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 12: 429 ***** first.test.FirstWS (m_instanceID = 7754248300017958713): Выполнение GetInstanceID ThreadID = 103 ThreadName = http-thread-pool-8080- (2 )

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 12: 460 ***** first.test.FirstWS (m_instanceID = -1714184485890589231): выполнение конструктора ThreadID = 102 ThreadName = http-thread-pool-8080- ( 1)

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 13: 429 ***** first.test.FirstWS (m_instanceID = -1714184485890589231): Выполнение PostConstruct ThreadID = 102 ThreadName = http-thread-pool-8080- ( 1)

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 13: 429 ***** first.test.FirstWS (m_instanceID = -1714184485890589231): Выполнение PostConstruct ThreadID = 102 ThreadName = http-thread-pool-8080- ( 1)

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 14: 429 ***** first.test.FirstWS (m_instanceID = -1714184485890589231): Выполнение GetInstanceID ThreadID = 102 ThreadName = http-thread-pool-8080- ( 1)

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 14: 445 ***** first.test.FirstWS (m_instanceID = -4156829683887899017): выполнение конструктора ThreadID = 103 ThreadName = http-thread-pool-8080- ( 2)

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 15: 429 ***** first.test.FirstWS (m_instanceID = -4156829683887899017): Выполнение PostConstruct ThreadID = 103 ThreadName = http-thread-pool-8080- ( 2)

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 15: 429 ***** first.test.FirstWS (m_instanceID = -4156829683887899017): Выполнение PostConstruct ThreadID = 103 ThreadName = http-thread-pool-8080- ( 2)

ИНФОРМАЦИЯ: 26/08/2010 15: 16: 15: 429 ***** first.test.FirstWS (m_instanceID = -4156829683887899017): Выполнение GetInstanceID ThreadID = 103 ThreadName = http-thread-pool-8080- ( 2)

ИНФОРМАЦИЯ: Закрытие корня мониторинга Metro: amx: pp = / mon / server-mon [server], type = WSEndpoint, name = / FirstWebApplication-FirstWSService-FirstWSPort

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

Ответы [ 2 ]

0 голосов
/ 31 августа 2010

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

Как говорит Java EE 6: «Сессионные EJB-компоненты синглтона предлагают функциональность, аналогичную сессионным EJB-компонентам без сохранения состояния, но отличаются от них тем, что в приложении имеется только один сессионный EJB-компонент в отличие от пула сессионных EJB-компонентов без состояния, любой из которых может отвечать на запрос клиента. Как и сеансовые компоненты без сохранения состояния, одноэлементные сеансовые компоненты могут реализовывать конечные точки веб-службы. "

0 голосов
/ 30 августа 2010

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

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.

...