0

https://github.com/rstoyanchev/spring-mvc-chatの基本例を使用して、マルチユーザーチャット環境を作成しようとしています

コードの正確な問題を見つけることができません。リクエストはポーリングではなく、サーバーに対して継続的にリクエストを発行し続けます。

以下は私のコードスニペットです

web.xml

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

applicationContext.xml

<mvc:annotation-driven>
    <mvc:async-support default-timeout="30000" />
    <mvc:message-converters register-defaults="false">
        <bean id="jacksonMessageConverter"
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
    </mvc:message-converters>
</mvc:annotation-driven>

コントローラ

@Controller
@RequestMapping("/chat")
public class ChatController
{
    @RequestMapping("messages")
    @ResponseBody
    public DeferredResult<List<String>> getMessages()
    {

        final DeferredResult<List<String>> deferredResult = new DeferredResult<List<String>>(30000l, Collections.emptyList());
        this.chatRequests.put(deferredResult, 0);

        deferredResult.onCompletion(new Runnable()
        {
            @Override
            public void run()
            {
                chatRequests.remove(deferredResult);
            }
        });

        List<String> messages = new ArrayList<String>();
        messages.add("first");
        if (!messages.isEmpty())
        {
            deferredResult.setResult(messages);
        }

        return deferredResult;
    }

}

JavaScript

function chatModel(){
var started = false;
var that = this;
that.activePollingXhr = ko.observable(null);
function pollForMessages() {
    that.activePollingXhr($.ajax({
        url : contextPath + '/chat/messages',
        type : "GET",
        cache : false,
        success : function(messages) {
            console.log(messages);
        },
        error : function(xhr) {
            if (xhr.statusText != "abort" && xhr.status != 503) {
                console.log('Unable to Connect');
            }
        },
        complete : pollForMessages
    }));
}
4

1 に答える 1

0

問題を取得しました。結果を設定する場合

deferredResult.setResult();

待たないので、再帰呼び出しに入ります。

于 2014-09-29T11:27:00.863 に答える