Search code examples
androidwebsocketstompjava-websocket

Add topic/subscription after stomp client is connected


I am currently using https://github.com/NaikSoftware/StompProtocolAndroid to connect websocket using STOMP. I have a simple implementation as


public class TestActivity extends AppCompatActivity {

private StompClient mStompCLient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);
    ButterKnife.bind(this);
    setSupportActionBar(toolbar);

    mStompCLient = Stomp.over(WebSocket.class, BASE_URL);

    mStompCLient.topic("/topic/online/" + mSharedPreferences.getPrivateKey()).subscribe(new Subscriber<StompMessage>() {
        @Override
        public void onCompleted() {
            Log.i(TAG, "/topic/online/ onCompleted: ");
        }

        @Override
        public void onError(Throwable e) {
            Log.i(TAG, "/topic/online/ onError: " + e.getMessage());
        }

        @Override
        public void onNext(StompMessage stompMessage) {
            Log.d(TAG, "/topic/online/ onNext: " + stompMessage.getPayload());
String content = "";
JSONObject jsonResponse = null;
            try {
                jsonResponse = new JSONObject(stompMessage.getPayload());
                content = jsonResponse.getString("uri");
            } catch (JSONException e) {
                e.printStackTrace();
            }
listenToUpdatesFromFinalUri(content);
        }
    });

    mStompCLient.lifecycle().subscribe(lifecycleEvent -> {
        Log.i(TAG, "onCreate: " + lifecycleEvent.getMessage());
        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 : " + lifecycleEvent.toString() + " :msg: " + lifecycleEvent.getMessage() + " :escep: " + lifecycleEvent.getException() + " :headers: " + lifecycleEvent.getHandshakeResponseHeaders() + " :type: " + lifecycleEvent.getType());
                break;
        }
    });

mStompCLient.connect();
}

private void listenToUpdatesFromFinalUri(String content) {
    mStompCLient.topic(content).subscribe(new Subscriber<StompMessage>() {
                @Override
                public void onCompleted() {
                    Log.i(TAG," onCompleted: ");
                }

                @Override
                public void onError(Throwable e) {
                    Log.i(TAG, " onError: " + e.getMessage());
                }

                @Override
                public void onNext(StompMessage stompMessage) {
                    Log.d(TAG, " onNext: " + stompMessage.getPayload());
                }
            });
}

@Override
protected void onStop() {
    super.onStop();
    disconnectStomp();
}

private void disconnectStomp() {
    mStompCLient.disconnect();
}
}

Here I am trying to listen to the new subscription channel sent by the server after connection is established. It works if the subscribe() is called before the connect is called. But the final uri/subscription channel subscribed in listenToUpdatesFromFinalUri() function is not static so I need can't add subscription before the connect. I am currently unable to get response for the final uri/subscription. Any help is appreciated.


Solution

  • The issue has been solved in the new version 1.1.6