![](/img/trans.png)
[英]Customize error message in stomp websocket spring boot 2
[英]How to receive the message from stomp websocket with spring boot on android?
我从https://spring.io/guides/gs/messaging-stomp-websocket/得到了简单的 WebSocket 示例
package com.example.chatservice.message;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").withSockJS();
}
}
@Controller
public class ChatController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
return new Greeting("Hello from chat!");
}
}
我想从 spring 服务器接收到 android 应用程序的Greeting
消息。 我使用https://github.com/NaikSoftware/StompProtocolAndroid作为 stomp 客户端
package com.example.chatapp;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import org.java_websocket.WebSocket;
import ua.naiksoftware.stomp.Stomp;
import ua.naiksoftware.stomp.client.StompClient;
public class MainActivity extends AppCompatActivity {
private StompClient mStompClient;
public static final String TAG="StompClient";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button view = (Button) findViewById(R.id.send_message);
view.setOnClickListener(e-> new StompTask().execute(""));
}
private static class StompTask extends AsyncTask<String, Void, String> {
private StompClient mStompClient;
String TAG="LongOperation";
@Override
protected String doInBackground(String... params) {
mStompClient = Stomp.over(WebSocket.class, "http://10.0.2.2:8080/gs-guide-websocket/websocket");
mStompClient.connect();
mStompClient.topic("/topic/greetings").subscribe(topicMessage -> {
Log.d(TAG, topicMessage.getPayload());
});
mStompClient.lifecycle().subscribe(lifecycleEvent -> {
switch (lifecycleEvent.getType()) {
case OPENED:
Log.d(TAG, "Stomp connection opened");
break;
case ERROR:
Log.e(TAG, "Error", lifecycleEvent.getException());
break;
case CLOSED:
Log.d(TAG, "Stomp connection closed");
break;
}
});
return "Executed";
}
}
}
和连接到
http://10.0.2.2:8080/gs-guide-websocket/websocket
有效,因为日志显示它已连接
2022-01-18 14:04:56.486 23717-23752/com.example.chatapp D/LongOperation: Stomp connection opened
但它不订阅主题:
mStompClient.topic("/topic/greetings").subscribe(topicMessage -> {
Log.d(TAG, topicMessage.getPayload());
});
因为当我设置断点时,它永远不会命中它。
我怎样才能收到这条消息?
我认为一切看起来都很棒,除了 websocket 的"http://10.0.2.2:8080/gs-guide-websocket/websocket"
应该是"ws://10.0.2.2:8080/gs-guide-websocket/websocket"
.
图书馆的作者把这个放在他们的示例代码中:
`mStompClient = Stomp.over(Stomp.ConnectionProvider.OKHTTP, "ws://" + ANDROID_EMULATOR_LOCALHOST + ":" + RestClient.SERVER_PORT + "/example-endpoint/websocket");`
首先,我想您明白,如果您没有向指定的请求主题发送正确的消息,那么您将不会在这里得到任何东西 -
mStompClient.topic("/topic/greetings").subscribe(topicMessage -> {
Log.d(TAG, topicMessage.getPayload());
});
今天我在发送消息时遇到了问题,
mStompClient.send(REQUEST_TOPIC, requestAsString)
我也没有收到订阅中的任何内容。 问题是除了订阅接收消息的主题,还必须订阅发送消息的主题——
mStompClient.send(REQUEST_TOPIC, requestAsString)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
//onComplete
}, { error ->
error.safeLog()
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.