<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Tirthankar Kundu</title>
    <description>The latest articles on Forem by Tirthankar Kundu (@tirthankarkundu17).</description>
    <link>https://forem.com/tirthankarkundu17</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F504846%2F0d164a41-5d92-4e20-a542-89d479270893.jpeg</url>
      <title>Forem: Tirthankar Kundu</title>
      <link>https://forem.com/tirthankarkundu17</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tirthankarkundu17"/>
    <language>en</language>
    <item>
      <title>Host maven artifact in Github Repository</title>
      <dc:creator>Tirthankar Kundu</dc:creator>
      <pubDate>Wed, 25 Nov 2020 20:18:58 +0000</pubDate>
      <link>https://forem.com/tirthankarkundu17/host-maven-artifact-in-github-repository-2jac</link>
      <guid>https://forem.com/tirthankarkundu17/host-maven-artifact-in-github-repository-2jac</guid>
      <description>&lt;p&gt;We often have some jar files or artifacts that needs to be imported via maven command.&lt;/p&gt;

&lt;p&gt;Sometimes few artifacts are not available in maven repository and we need to install them manually to our maven .m2 folder. This is tedious job and every developer working on your project has to do the same.&lt;/p&gt;

&lt;p&gt;So hosting your own maven repository comes useful and is available to every developer working on your project.&lt;/p&gt;

&lt;p&gt;Hence I have created a bash tool to do the same.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a empty GitHub repo.&lt;/li&gt;
&lt;li&gt;Download the script "artifact_publisher.sh" from &lt;a href="https://github.com/tirthankarkundu17/MavenGitPublish.git"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open a terminal and use command chmod +x to make it executable and then run the script by simple typing ./artifact_publisher.sh
Enter the details as prompted.&lt;/li&gt;
&lt;li&gt;Once you do these steps, you will get a maven hosted repository URL which you need to use in your maven projects to download these artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know if you found this useful ! Also feel free to add more stuffs and raise a PR.&lt;/p&gt;

</description>
      <category>mulesoft</category>
      <category>maven</category>
      <category>java</category>
      <category>github</category>
    </item>
    <item>
      <title>MuleSoft Chat : Phone, Web and Mule !</title>
      <dc:creator>Tirthankar Kundu</dc:creator>
      <pubDate>Sun, 22 Nov 2020 19:33:54 +0000</pubDate>
      <link>https://forem.com/tirthankarkundu17/mulesoft-chat-3lbk</link>
      <guid>https://forem.com/tirthankarkundu17/mulesoft-chat-3lbk</guid>
      <description>&lt;p&gt;&lt;strong&gt;Everyday is an API Day&lt;/strong&gt;&lt;br&gt;
MuleSoft is loaded with features. Mule runtime engine (Mule) is a lightweight integration engine that runs Mule applications and supports domains and policies. MuleSoft is well known for getting APIs and integrations done in short time.&lt;br&gt;
I would like to demonstrate how I got a real time chat application working with MuleSoft.&lt;br&gt;
Some components used:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HTTP &lt;/li&gt;
&lt;li&gt;Web Socket&lt;/li&gt;
&lt;li&gt;Database&lt;/li&gt;
&lt;li&gt;DataWeave&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I have also created an &lt;strong&gt;android application&lt;/strong&gt; that talks to MuleSoft WebSocket Server. Thus the end to end app allows users to join a room over android app or web. 😀🙌&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;WebSocket : two-way interactive communication&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;WebSocket is a computer communications protocol, providing full-duplex communication channels over a single TCP connection, i.e both server and client can send messages across the network.&lt;br&gt;
The WebSocket API is an advanced technology that makes it possible to open a two-way interactive communication session between the user's browser and a server. With this API, you can send messages to a server and receive event-driven responses without having to poll the server for a reply.&lt;/p&gt;

&lt;p&gt;The solution is divided into two parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The System API to store data of users and handle room details&lt;/li&gt;
&lt;li&gt;The Experience layer in form of a WebSocket Server&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;High Level Architecture&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbhoo9uzule1rnokb4bdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbhoo9uzule1rnokb4bdk.png" alt="HLD"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;System API Implementation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The main aim of the system api is to give a CRUD based API interface to users and chat rooms.&lt;br&gt;
I am using SQLite DB for this and we are good to use any persistence mechanism for this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The API specification(RAML):

&lt;ol&gt;
&lt;li&gt;/users :

&lt;ul&gt;
&lt;li&gt;GET : This end point returns all the users registered to some chat room&lt;/li&gt;
&lt;li&gt;POST : This end point is used to add a user to the persistent store&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;/users/{userId}:

&lt;ul&gt;
&lt;li&gt;GET : This end point returns the user with the URI Param userId&lt;/li&gt;
&lt;li&gt;PUT : This end point is used to updated details of a user. Example: SocketId is generated only when user successfully joins any room.&lt;/li&gt;
&lt;li&gt;DELETE : This end point is used to delete an user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;/room :

&lt;ul&gt;
&lt;li&gt;GET : This end point returns all the rooms where users are present&lt;/li&gt;
&lt;li&gt;POST : This end point adds an user to a room&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;/room/{roomId} :

&lt;ul&gt;
&lt;li&gt;GET : This endpoint is used to get all the users in the roomId&lt;/li&gt;
&lt;li&gt;DELETE : This end point deletes a room&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can add more endpoints here to add enhance capabilities. For now we will stick to this minimal viable product.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#%RAML 1.0
title: mule-chat-sapi
description: Set of endpoints to add user and rooms for chat application

types:
  User: !include dataType/User.raml
  Room: !include dataType/Room.raml

/users:
  get:
    description: This endpoint is used to get all users
    responses:
      200:
        body:
          application/json:
            type: User[]
  post:
    description: This endpoint is used to add an user
    body:
      application/json:
        type: User
    responses:
      201:
        body:
          application/json:
            example: !include examples/users_post.json
  /{userId}:
      get:
        description: This endpoint is used to get a particular users
        responses:
          200:
            body:
              application/json:
                type: User
      put:
        description: This endpoint is used to update details of an already added user recognized by the userId
        body:
          application/json:
            type: User
        responses:
          200:
            body:
              application/json:
                example: !include examples/users_put.json
      delete:
        description: This endpoint is used to delete an user
        responses:
          200:
            body:
              application/json:
                example: !include examples/users_delete.json
/room:
  get:
    description: Get all room and user ids in the room
    responses:
      200:
        body:
          application/json:
            type: Room[]
  post:
    description: This endpoint is used to add an user to a room
    body:
      application/json:
        type: Room
    responses:
      201:
        body:
          application/json:
            example: !include examples/join_post.json
  /{roomId}:
    description: This endpoint is used to get all the users in the roomId
    get:
      responses:
        200:
          body:
            application/json:
              type: User[]
    delete:
        description: This endpoint is used to delete a room
        responses:
          200:
            body:
              application/json:
                example: !include examples/room_delete.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The Database:
SQLite is a relational database management system (RDBMS) contained in a C library. This has all the CRUD features. I am using this to show the Mule capability to handle any form of JDBC connection. Also using SQLite removes the dependency of hosting any Database solution. But we can connect the system API to any persistent mechanism like AWS RDS, IBM DB2, MySQL etc.
I am using a Generic Database connection:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fw0tz3uykwimbbjqo0jru.png" alt="Generic Database Connection to SQLite"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Driver class org.sqlite.JDBC comes from below Maven Dependency:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7eutx7axrmolbkd83ipv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7eutx7axrmolbkd83ipv.png" alt="SQLite JAR Maven Dependency"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API Implementation:
The API Implementation is a generic APIKit Router based solution and the database operations are coded as per requirement.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Now we are done with our System API layer. It's now time to go into the interesting part of the solution which actually adds the WebSocket based chat feature.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Experience Layer : Mule Chat App&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This application also written in Mule and HTML, CSS, JS allows multiple users to join multiple rooms and start interacting with each other.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;WebSocket:&lt;br&gt;
The WebSocket specification defines an API establishing "socket" connections between a web browser and a server. In plain words: There is an persistent connection between the client and the server and both parties can start sending data at any time.&lt;br&gt;
Unlike the method where client polls for data every time, Websocket allows server to push data to client as and when available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WebSocket Implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebSocket(WSS) HTTPS Listener:
We create a HTTPS Listener with port 8082. This will be used by the WebSockets to communicate over the channel.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4ohdwpwg6nl3hsni68wu.PNG" alt="HTTPS Listener"&gt;
&lt;/li&gt;
&lt;li&gt;WebSocket(WSS) Mule Server:
We use Mule, only as the Web Socket Server. The connection is WSS which is a secured Web Socket communication comparable to HTTPSThe configuration is below:
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzudirs830ydsxg3c6v0j.PNG" alt="Mule Server"&gt;
It's worth noting that I checked only the Server setting to make sure that it acts as WebSocket server.&lt;/li&gt;
&lt;li&gt;WebSocket(WS) HTML/JS Client:
The WebSocket client in this case is the web browser where users comes and logs to join multiple rooms and chat with people.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fah1kbxjkl4fz449kirsk.PNG" alt="HTML/JS Client"&gt;
Here we used JavaScript to connect to the WebSocket over : wss://:8082/
Note that unlike http the protocol here is &lt;strong&gt;wss&lt;/strong&gt;
In the image highlighted above the highlighted boxes signifies below:&lt;/li&gt;
&lt;li&gt;1 : WebSocket is deployed over a shared Load Balancer, so we provide the internal worker URL with port.&lt;/li&gt;
&lt;li&gt;2 : We create the WebSocket URL that will be used. &lt;/li&gt;
&lt;li&gt;3 : We establish a full duplex connection to Mule WebSocket Server.&lt;/li&gt;
&lt;li&gt;4 : Listens to incoming messages and adds the messages to the HTML DOM using custom javascript function insertChat()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WebSocket Mule Flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initiate Connection:
Whenever a user joins a room using Web Client, this flow is triggered and it updates the socketId of the user.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjycmo4p73h2l4ttfnhv3.PNG" alt="Initiate Connection Flow"&gt;
&lt;/li&gt;
&lt;li&gt;Route Messages:
Mule is well known for routing messages using it's connector, here I route the appropriate messages to users in a room.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9vnyzi9z0vqpjw2xr6i9.PNG" alt="Route Messages"&gt;
&lt;/li&gt;
&lt;li&gt;Close Connection:
When user closes the browser, this flow is called and it removes user from the table
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6dzjt9koniqw5qxcwry6.PNG" alt="Close Connection"&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;This pretty much covers the WebSocket implementation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For connecting to the System APIs to add/remove room and users I have used the connector published to exchange as below:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flummh3bptvwnkk22cwnp.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flummh3bptvwnkk22cwnp.PNG" alt="Mule Chat SAPI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below are the images of the working solution:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Enter Room Id or Number and Join Room&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbqf09wuvrx4hlcnrnxzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbqf09wuvrx4hlcnrnxzt.png" alt="Room"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add name and avatar image(This appears in the Chat UI)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhfi0t5lsz4nhw191m0ue.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhfi0t5lsz4nhw191m0ue.PNG" alt="User"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Send Chat Messages and enjoy interacting!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2dkbixbfchihxnenennq.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2dkbixbfchihxnenennq.PNG" alt="Chat"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web UI (Mule Flow)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MuleSoft is well known for hosting APIs and integration but it can also be used to host your UI application and serve it as the frontend.&lt;br&gt;
For the Chat UI, I am using Parse Template.&lt;br&gt;
     &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgwdswbxnnkelypzq19do.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgwdswbxnnkelypzq19do.PNG" alt="Join Chat"&gt;&lt;/a&gt;&lt;br&gt;
     Here, I fetch the Room Id from query parameters and set it in variable. Then use it to dynamically to generate HTML content using Parse Template.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Android UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The native android application allows user to join a room by entering Room Number, name and an optional avatar link. In case user doesn't give a link to avatar the default robot image is considered.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftymsqqedghs4sui3fqmr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftymsqqedghs4sui3fqmr.png" alt="Join Room"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The user can then interact 💬 with other users in same room connected using &lt;strong&gt;Web&lt;/strong&gt; or &lt;strong&gt;Android&lt;/strong&gt; Client 💻&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb6dh2j12caas3s300tsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb6dh2j12caas3s300tsg.png" alt="Interact"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Deployment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The SAPI is deployed at : &lt;a href="https://mule-chat-sapi.us-e2.cloudhub.io/console/" rel="noopener noreferrer"&gt;https://mule-chat-sapi.us-e2.cloudhub.io/console/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The WebSocket deployment actually needs Dedicated Load Balancer to work as sited here : (&lt;a href="https://docs.mulesoft.com/websockets-connector/1.0/websockets-connector-cloudhub" rel="noopener noreferrer"&gt;https://docs.mulesoft.com/websockets-connector/1.0/websockets-connector-cloudhub&lt;/a&gt;).&lt;br&gt;
The trial account doesn't support VPC or DLB. So I am using self signed certificate and exposing internal worker URL.&lt;br&gt;
The application can be accessed at : &lt;a href="https://mule-worker-mule-chat-app.us-e2.cloudhub.io:8082/" rel="noopener noreferrer"&gt;https://mule-worker-mule-chat-app.us-e2.cloudhub.io:8082/&lt;/a&gt;&lt;br&gt;
You will see an error like below :&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7ei7k9hqro9faom5bgqn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7ei7k9hqro9faom5bgqn.PNG" alt="App"&gt;&lt;/a&gt;&lt;br&gt;
Since the certificates are self signed, it doesn't recognize and throw this error but you can click on &lt;strong&gt;Proceed to mule-worker-mule-chat-app.us-e2.cloudhub.io (unsafe)&lt;/strong&gt; and start inviting your friends for a chat 😉&lt;br&gt;
This can also be run on local Anypoint studio by importing jar from &lt;a href="https://github.com/tirthankarkundu17/mule-chat-app/blob/master/mule-chat-app.jar?raw=true" rel="noopener noreferrer"&gt;Mule-Chat-App&lt;/a&gt;&lt;br&gt;
We can however get the DLB setup and deploy the chat application too.&lt;/p&gt;

&lt;p&gt;The android app(apk) is hosted here to download and install : &lt;a href="https://github.com/tirthankarkundu17/mule-chat-app/blob/master/mulesoft-chat.apk?raw=true" rel="noopener noreferrer"&gt;Download&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Demo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Updated&lt;/strong&gt; : Added a new Android interface to interact with WebSocket Mule Server.&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/iBvMaByln8c"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;References and Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://anypoint.mulesoft.com/exchange/portals/abc-8534/0825c465-6fab-451f-9c20-9da1ac4d9560/mule-chat/" rel="noopener noreferrer"&gt;RAML-Specification&lt;/a&gt;&lt;br&gt;
Mule-Chat-SAPI &lt;a href="https://github.com/tirthankarkundu17/mule-chat-sapi" rel="noopener noreferrer"&gt;GitHub-Repo&lt;/a&gt;&lt;br&gt;
Mule-Chat-App &lt;a href="https://github.com/tirthankarkundu17/mule-chat-app" rel="noopener noreferrer"&gt;GitHub-Repo&lt;/a&gt;&lt;br&gt;
Android-App &lt;a href="https://github.com/tirthankarkundu17/mule-chat-app/blob/master/mulesoft-chat.apk?raw=true" rel="noopener noreferrer"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Future Prospects&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Suppose an API takes good amount of time to do some really resource intensive task, we can run an async operation at backend and then whenever data is ready we can send it back from Server to Client using the duplex channel. This is useful since client doesn't have to constantly poll the server for updates. Also, for cases like stock market ticks, this will be useful. Asynchronous messaging in going to be the next revolution in data delivery ✅&lt;br&gt;
Can be integrated with Chatbots and a wide range of APIs to give a more enhanced experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;About the author&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tirthankar Kundu is a full stack developer who loves to code. He is MuleSoft Certified Developer who loves APIs. Proficient in both frontend and backend technologies. Working with Persistent Systems Ltd. as a Senior Mule developer in Insurance domain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💻 &lt;a href="https://www.linkedin.com/in/kundutirthankar/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://medium.com/@tirthankarkundu" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📜 &lt;a href="https://bitmaskers.in" rel="noopener noreferrer"&gt;Website&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mulesofthackathon</category>
      <category>websockets</category>
      <category>android</category>
      <category>mulesoft</category>
    </item>
  </channel>
</rss>
