Веб-сокеты - не работают в weblogic 12.2.1?

Weblogic - 12.2.1 - не инициализируется ServerContainer!

Привет всем, я столкнулся с проблемой при запуске моего приложения в weblogic 12.2.1, согласно спецификации веб-сокета, я инициализирую конечную точку веб-сокета во время запуска приложения в ServletContextListener. Я использую структуру атмосферы для запуска конечной точки веб-сокета. При инициализации конечной точки сокета в классе JSR356AsyncSupport-атмосфера фреймворк пытается получить атрибут из объекта servletContext. Не находит и не получается.... в weblogic 12.2.1/12.1.3. Однако то же самое приложение при развертывании на других веб-серверах/серверах приложений, таких как tomcat, websphere Liberty, jboss, работает нормально. (Я использую jdk1.8)

(https://github.com/Atmosphere/atmosphere/blob/master/modules/cpr/src/main/java/org/atmosphere/container/JSR356AsyncSuppo… )

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

public JSR356AsyncSupport(AtmosphereConfig config, ServletContext ctx) {
    super(config);
    ServerContainer container = (ServerContainer) ctx.getAttribute(ServerContainer.class.getName()); //javax.websocket.server.ServerContainer


    if (container == null) {
        if (ctx.getServerInfo().contains("WebLogic")) {
            logger.error("{} must use JDK 1.8+ with WebSocket", ctx.getServerInfo());
        }
        throw new IllegalStateException("Unable to configure jsr356 at that stage. ServerContainer is null");
    }
}

Трассировка стека исключений.

2016-08-16 16:10:31,459 [            WGHALBW7] [  STANDARD] [ ] [ ] (pr.DefaultAsyncSupportResolver) ERROR   - Real error: Unable to configure jsr356 at that stage. ServerContainer is null
java.lang.IllegalStateException: Unable to configure jsr356 at that stage. ServerContainer is null
at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:51)
at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:40)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:235)
at org.atmosphere.cpr.DefaultAsyncSupportResolver.resolveWebSocket(DefaultAsyncSupportResolver.java:307)
at org.atmosphere.cpr.DefaultAsyncSupportResolver.resolve(DefaultAsyncSupportResolver.java:293)
at org.atmosphere.cpr.AtmosphereFramework.autoDetectContainer(AtmosphereFramework.java:2004)
at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:911)
at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:835)

person TEJA    schedule 19.08.2016    source источник
comment
Вы читали документы weblogic? docs.oracle.com/middleware/1212/wls/WLPRG/   -  person Taylor    schedule 19.08.2016
comment
спасибо, что поделились документацией, мое приложение отлично работает на websphere Liberty.jboss, tomcat. однако это не работает с weblogic. Я просмотрел документацию - мало что помогло в моей проблеме.   -  person TEJA    schedule 19.08.2016


Ответы (1)


Немного поздно для вечеринки, но сейчас я работаю с weblogic 12.1.3, и хотя он реализует протокол websocket (документы Oracle, RFC 6455), к сожалению, он не соответствует с JSR356 (только начиная с версии 12.2.1 и выше).

Если вы используете атмосферу, мне удалось настроить более-менее рабочий пример путем точной настройки некоторых сервлетов атмосферы/primefaces (я использую Primefaces 6.0 socket для уведомлений сервера ) параметры инициализации:

<servlet>
    <description>PrimeFaces Push Notifications Servlet</description>
    <servlet-name>Push Servlet</servlet-name>
    <servlet-class>org.primefaces.push.PushServlet</servlet-class>
    <init-param>
        <param-name>org.atmosphere.cpr.packages</param-name>
        <param-value>my.project.push</param-value>
    </init-param>
    <init-param>
        <param-name>org.atmosphere.cpr.atmosphereHandlerPath</param-name>
        <param-value>/WEB-INF/lib/_wl_cls_gen.jar</param-value>
    </init-param>
    <init-param>
        <param-name>org.atmosphere.resumeOnBroadcast</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>org.atmosphere.websocket.suppressJSR356</param-name> <!-- les versions que tenim no son JSR356-compliant -->
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>org.atmosphere.cpr.broadcasterCacheClass</param-name>
        <param-value>org.atmosphere.cache.UUIDBroadcasterCache</param-value>
    </init-param>
    <init-param>
        <param-name>org.atmosphere.interceptor.HeartbeatInterceptor.clientHeartbeatFrequencyInSeconds</param-name>
        <param-value>20</param-value>
    </init-param>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>Push Servlet</servlet-name>
    <url-pattern>/primepush/*</url-pattern>
</servlet-mapping>

В любом случае, это очень сложно реализовать, и я рассматриваю другие варианты.

Подробнее здесь и здесь.

person Repoker    schedule 22.07.2019