Getting error on pubsub example using Atmosphere +

2019-07-02 07:18发布

I'm following the tutorial here http://jfarcand.wordpress.com/2011/06/29/rest-websocket-applications-why-not-using-the-atmosphere-framework/

I already have a Jersey project up and running and working fine using JBoss 7. The one difference i have is that i am using Jersey with Spring. So my JQueryPubSub looks like this

@Service  <-- For Spring component Scan
@Path("/pubsub/{topic}")
@Produces("text/html;charset=ISO-8859-1")
public class JQueryPubSub {

@PathParam("topic")
Broadcaster topic;

@GET
public SuspendResponse<String> subscribe() {
    return new SuspendResponse.SuspendResponseBuilder<String>()
            .broadcaster(topic)
            .outputComments(true)
            .addListener(new EventsLogger())
            .build();
}

@POST
@Broadcast
public Broadcastable publish(@FormParam("message") String message) {
    return new Broadcastable(message, "", topic);
}
}

So i wanted to add this example but i'm getting

22:55:27,381 SEVERE [com.sun.jersey.spi.inject.Errors] (MSC service thread 1-3) The following errors and warnings have been detected with resource and/or provider classes: SEVERE: Missing dependency for field: org.atmosphere.cpr.Broadcaster com.order.resources.JQueryPubSub.topic

Any ideas how i can fix this issue and why Jersey seems to be aggressively injecting the value into broadcaster??

2条回答
贪生不怕死
2楼-- · 2019-07-02 07:24

Answering after long time..but people who are trying can still take some advantage out of this

You can try with the following . I just tried and it worked for me

Step-1
If you are using weblogic 12 c make the following change

function subscribe() {
        var request = {
            url :document.location.origin+'/<your-context-path>/ws/pubsub/' + getElementByIdValue('topic'),

Step-2
In web.xml add the below configuration

   <servlet>
<description>AtmosphereServlet</description>
<servlet-name>AtmosphereServlet</servlet-name>
<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
  <param-value>*******package name where your handler is**********</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.cpr.broadcastFilterClasses</param-name>
  <param-value>org.atmosphere.client.TrackMessageSizeFilter
        </param-value>
</init-param>
    <init-param>
  <param-name>WEBSOCKET_PROTOCOL_EXECUTION</param-name>
  <param-value>true</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
 <servlet-name>AtmosphereServlet</servlet-name>
 <url-pattern>/pubsub/*</url-pattern>
</servlet-mapping>

step-3

paste the below code in a java file in the package you defined in the above step(also can be found in the git site of atmosphere)

import java.io.IOException;
import org.atmosphere.client.TrackMessageSizeInterceptor;
import org.atmosphere.config.service.AtmosphereHandlerService;
import org.atmosphere.config.service.Singleton;
import org.atmosphere.cpr.AtmosphereResourceEvent;
import org.atmosphere.handler.AtmosphereHandlerAdapter;
import org.atmosphere.interceptor.AtmosphereResourceLifecycleInterceptor;
import org.atmosphere.interceptor.BroadcastOnPostAtmosphereInterceptor;
import org.atmosphere.interceptor.SuspendTrackerInterceptor;
import org.atmosphere.util.SimpleBroadcaster;


@Singleton
@AtmosphereHandlerService(path = "/{chat}",
    interceptors = {
        AtmosphereResourceLifecycleInterceptor.class,
        TrackMessageSizeInterceptor.class,
        BroadcastOnPostAtmosphereInterceptor.class,
        SuspendTrackerInterceptor.class},
    broadcaster = SimpleBroadcaster.class)
public class AtmosphereHandler extends AtmosphereHandlerAdapter {

@Override
public void onStateChange(AtmosphereResourceEvent event) throws IOException {
    if (event.isSuspended()) {
        String message = event.getMessage() == null ? null : event.getMessage().toString();
        if (message != null && message.indexOf("message") != -1) {
            event.getResource().write(message.substring("message=".length()));
        } else {
            event.getResource().write("=error=");
        }
    }
}

}

Now deploy the ear it works..

Jar files

atmosphere-annotations-2.1.1.jar
atmosphere-jersey-2.1.1.jar
atmosphere-runtime-2.1.1.jar
atmosphere-weblogic-2.1.1.jar
commons-collections-3.2.1.jar
commons-dbutils-1.5.jar
commons-io-2.4.jar
jersey-core-1.17.1.jar
jersey-json-1.17.1.jar
jersey-server-1.17.1.jar
jersey-servlet-1.17.1.jar
log4j-1.2.15.jar
查看更多
The star\"
3楼-- · 2019-07-02 07:39

I had the same problem and was able to fix it by updating jersey jars from 1.4 to 1.6 If you use maven, you can add the following dependencies.

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.6</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.6</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.6</version>
    </dependency>
查看更多
登录 后发表回答