Publish/subscribe messaging has been around for a long time. The concept is rather simple – a program can publish a message to a queue or a topic, while another program subscribes to the queue or the topic to receive published messages. There are a lot of caveats in the model such as conditional delivery, message filtering, message transformations, etc.
In this post, we will demonstrate the most basic form of publish/subscribe messaging. One client will be publishing basic string messages, while any number of other client apps can subscribe to receive published messages. Consider the following example:
int i = 1;
while (true) {
   Backendless.Messaging.publish("default", "Message " + i++, new AsyncCallback<MessageStatus>() {
       @Override
       public void handleResponse(MessageStatus messageStatus) {
           Log.i(TAG, "Message published - " + messageStatus.getMessageId());
       }
       @Override
       public void handleFault(BackendlessFault fault) {
           Log.e(TAG, fault.getMessage());
       }
   });
   Thread.sleep(500);
}
var i = 1
while (true) {
   Backendless.Messaging.publish("default", "Message " + i++, object : AsyncCallback<MessageStatus> {
       override fun handleResponse(messageStatus: MessageStatus) {
           Log.i(TAG, "Message published - ${messageStatus.messageId}")
       }
       override fun handleFault(fault: BackendlessFault) {
           Log.e(TAG, fault.message)
       }
   })
   Thread.sleep(500)
}
const Backendless = require('backendless')
/*
 Or use `import Backendless from 'backendless'` for client side.
 If you don't use npm or yarn to install modules, you can add the following line
 <script src="//api.backendless.com/sdk/js/latest/backendless.min.js"></script>
 to your index.html file and use the global Backendless variable.
*/
Backendless.initApp('YOUR_APP_ID', 'YOUR_JS_API_KEY')
const publishMessages = () => {
  const requests = []
  for (let i = 0; i < 10; i++) { const request = Backendless.Messaging.publish('default', `Message ${ i }`) requests.push(request) } return Promise.all(requests) } const onError = error => {
  console.error('Server reported an error: ', error.message)
  console.error('error code: ', error.code)
  console.error('http status: ', error.status)
}
Promise.resolve()
  .then(publishMessages)
  .catch(onError)
NSInteger i = 0;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(publishMessage) userInfo:nil repeats:YES];
- (void)publishMessage {
    i++;
    NSString *message = [NSString stringWithFormat:@"Message %li", (long)i];
    [Backendless.shared.messaging publishWithChannelName:@"default" message:message responseHandler:^(MessageStatus *messageStatus) {
        NSLog(@"Message published - %@", messageStatus.messageId);
    } errorHandler:^(Fault *fault) {
        NSLog(@"Error: %@", fault.message);
    }];
}
var i = 0
let _ = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(publishMessage), userInfo: nil, repeats: true)
@objc func publishMessage() {
    i += 1
    Backendless.shared.messaging.publish(channelName: "default", message: "Message \(i)", responseHandler: { messageStatus in
        print("Message published - \(messageStatus.messageId ?? "")")
    }, errorHandler: { fault in
        print("Error: \(fault.message ?? "")")
    })
}
int i = 1;
   while (true) {
     Backendless.messaging.publish("Message ${i++}", channelName: "default").then(
       (messageStatus) => print("Message published - ${messageStatus.messageId}"));
     sleep(Duration(milliseconds: 500));
   }
Both samples above publish string messages to the “default” channel. A channel is a logical medium carrying the messages. Think of it as a pipeline connecting the publisher with the subscribers. You can use your own messaging channels in your app – Backendless lets you create any number of channels.
Channel channel = Backendless.Messaging.subscribe("default");
channel.addMessageListener(new AsyncCallback() {
   @Override
   public void handleResponse(String message) {
       Log.i(TAG, "Received message - " + message);
   }
   @Override
   public void handleFault(BackendlessFault fault) {
       Log.e(TAG, fault.getMessage());
   }
});
val channel = Backendless.Messaging.subscribe("default")
channel.addMessageListener(object : AsyncCallback<String> {
   override fun handleResponse(message: String) {
       Log.i(TAG, "Received message - $message")
   }
   override fun handleFault(fault: BackendlessFault) {
       Log.e(TAG, fault.message)
   }
})
const Backendless = require('backendless')
/*
 Or use `import Backendless from 'backendless'` for client side.
 If you don't use npm or yarn to install modules, you can add the following line
 <script src="//api.backendless.com/sdk/js/latest/backendless.min.js"></script>
 to your index.html file and use the global Backendless variable.
*/
Backendless.initApp('YOUR_APP_ID', 'YOUR_JS_API_KEY')
const channel = Backendless.Messaging.subscribe('default')
const onMessage = message => {
  console.log(`Received a message - ${ JSON.stringify(message) }`)
}
channel.addMessageListener(onMessage)
Channel *channel = [Backendless.shared.messaging subscribe];
RTSubscription *subscription = [channel addStringMessageListenerWithResponseHandler:^(NSString *message) {
    NSLog(@"Received message - %@", message);
} errorHandler:^(Fault *fault) {
    NSLog(@"Error: %@", fault.message);
}];
let channel = Backendless.shared.messaging.subscribe()
let _ = channel.addStringMessageListener(responseHandler: { message in
    print("Received message - \(message)")
}, errorHandler: { fault in
    print("Error: \(fault.message ?? "")")
})
Channel channel = await Backendless.messaging.subscribe("default");
channel.addMessageListener((String message) => print("Received message - $message"));
The publisher code produces the following output:
Message published - 37243355-2DB1-95F8-FF0A-FC19DEF09D00 Message published - BE150154-B9E1-D95C-FFC4-3ECBDB572300 Message published - 60E00A27-9CDB-A5A3-FF17-E1E45020F300 Message published - F139EF3B-AEB0-51F5-FFD6-74B78065D100 Message published - DA38D9AC-7F00-652C-FFB3-58DCA660BA00 Message published - EC8684CF-EA71-3032-FFAA-9091F6727D00 Message published - 39ADB9ED-61D9-EDC1-FF5C-D88814C6A900 Message published - 7EEC5EEF-95D0-903C-FF39-5A3AA3CAF700
While the subscriber prints out the following:
Received message - Message 40 Received message - Message 41 Received message - Message 42 Received message - Message 43 Received message - Message 44 Received message - Message 45 Received message - Message 46 Received message - Message 47 Received message - Message 48 Received message - Message 49
Backendless Messaging is a very powerful technology.