PoshJosh's Blog

How to Add Chat Functionality to a Maven Java Web App

November 12, 2019

Today we learn how to add chat functionality to a java web application. We do this by using a java library based on CometD chat libraries. This is a 2 part tutorial.

This is Part 1 of a 2-part blog post

Requirements. To be able to follow this tutorial, you should understand:

First we ask: Why add chat functionality?

Each visitor to a website could be engaged at the critical window when they are about to make a decision. It could also be at the time algorithm decides they are confused about something (e.g visiting the same link, back and forth 3 times). At that point a chat window could appear with a customer care representative at the other end to engage the potential custeomer. With that in mind, the following are basically the advantages of chat:

  • Reduce expenses.
  • Increase sales.
  • Improve customer service and loyalty.
  • Discover customer pain points.
  • Faster problem resolution.
  • Customer convenience.
  • Competitive advantages.
  • Expand market reach.

So what is CometD?


CometD logo| The CometD libraries allow your application to send messages in three forms: Push-Subscribe, Peer-to-Peer and Remote-Call.

  • With Publish-Subscribe, a message sent by a publisher is broadcast to many subscribers.

This is the typical case for chat rooms, for example.

  • With Peer-to-Peer, a message is sent by a sender to a specific receiver. This is the

typical case for private one-to-one chats, for example.

  • With Remote-Call, a “message” is sent by a client to the server to perform a specific

action. This is the typical case for creating a new chat room, for example.

Learn more about the CometD messaging features in the CometD reference manual.

Now how do we add CometD chat functionality to a java web application?

To add CometD chat functionality to a java web application, we will be using the CometD chat library I wrote. Clone the library from github. Then follow the next steps.

####Step 1#### Open your favorite java ide and create a maven web java application.

####Step 2#### Add the CometdD chat library you cloned from github as a dependency to your maven java web application.

####Step 3#### Add the xml below to your web.xml

  <!-- Servlet to query cometd chat messages -->
  <servlet>
      <servlet-name>messages</servlet-name>
      <servlet-class>com.looseboxes.cometd.chat.servlets.Messages</servlet-class>
      <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
      <servlet-name>messages</servlet-name>
      <url-pattern>/chat/messages</url-pattern>
  </servlet-mapping>
  <!-- CometdChat WebApp Config -->
  <context-param>
      <param-name>cometdChatAppName</param-name>
      <param-value>[PUT A NAME HERE]</param-value>
  </context-param>
  <filter>
      <filter-name>continuation</filter-name>
      <filter-class>org.eclipse.jetty.continuation.ContinuationFilter</filter-class>
      <async-supported>true</async-supported>
  </filter>
  <filter-mapping>
      <filter-name>continuation</filter-name>
      <url-pattern>/cometd/*</url-pattern>
  </filter-mapping>
  <!-- Cometd Servlet -->
  <servlet>
      <servlet-name>cometd</servlet-name>
      <servlet-class>com.looseboxes.cometd.chat.servlets.CometdWithMessageConsumer</servlet-class>
      <async-supported>true</async-supported>
      <init-param>
          <param-name>transports</param-name>
          <param-value>org.cometd.websocket.server.WebSocketTransport</param-value>
      </init-param>
      <init-param>
          <param-name>services</param-name>
          <param-value>com.looseboxes.cometd.chat.ChatService</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>cometd</servlet-name>
      <url-pattern>/cometd/*</url-pattern>
  </servlet-mapping>

####Step4#### Add the code below to any ServletContextListener.

public void contextInitialized(ServletContextEvent servletContextEvent) {
    final ServletContext servletContext = servletContextEvent.getServletContext();
    final CometdChat cometdChat = new CometdChat(servletContext);
}

####Step 5#### Add the code below to the head section of any jsp or jspf etc, page you want chat to be available from.

<%@taglib uri="/META-INF/tlds/cometdchat" prefix="cometdchat"%>
<cometdchat:joinChat loginUserDisplayName="me" windowBackground="navy"/>

####Hurray! We made it####

Now when you open the page where you added the above taglib, a small chat window should open.

In Part 2 we will delve a bit deeper into whats happening behind the scenes

References:


Written byChinomso IkwuagwuExcélsior

Limited conversations with distributed systems.

Modifying legacy applications using domain driven design (DDD)

Gherkin Best Practices

Code Review Best Practices

Hacking Cypress in 9 minutes

Some common mistakes when developing java web applications

How to make a Spring Boot application production ready

SQL JOINS - A Refresher

Add Elasticsearch to Spring Boot Application

Add entities/tables to an existing Jhipster based project

CSS 3 Media Queries - All over again

Maven Dependency Convergence - quick reference

Amazon SNS Quick Reference

AWS API Gateway Quick Reference

Amazon SQS Quick Reference

AWS API Gateway Quick Reference

AWS Lambda Quick Reference

Amazon DynamoDB - Quick Reference

Amazon Aurora

Amazon Relational Database Service

AWS Database Services

AWS Security Essentials

Amazon Virtual Private Cloud Connectivity Options

Summary of AWS Services

AWS Certified Solutions Architect - Quick Reference

AWS CloudFront FAQs - Curated

AWS VPC FAQs - Curated

AWS EC2 FAQs - Curated

AWS Achritect 5 - Architecting for Cost Optimization

AWS Achritect 4 - Architecting for Performance Efficiency

AWS Achritect - 6 - Passing the Certification Exam

AWS Achitect 3 - Architecting for Operational Excellence

AWS Achitect 2 - Architecting for Security

AWS Achitect 1 - Architecting for Reliability

Amazon DynamoDB Accelerator (DAX)

Questions and Answers - AWS Certified Cloud Architect Associate

Questions and Answers - AWS Certified Cloud Architect Associate

AWS Connectivity - PrivateLink, VPC-Peering, Transit-gateway and Direct-connect

AWS - VPC peering vs PrivateLink

Designing Low Latency Systems

AWS EFS vs FSx

AWS Regions, Availability Zones and Local Zones

AWS VPC Endpoints and VPC Endpoint Services (AWS Private Link)

AWS - IP Addresses

AWS Elastic Network Interfaces

AWS Titbits

Jenkins on AWS - Automation

Jenkins on AWS - Setup

Jenkins on AWS - Best practices

Introduction to CIDR Blocks

AWS Lamda - Limitations and Use Cases

AWS Certified Solutions Architect Associate - Part 10 - Services and design scenarios

AWS Certified Solutions Architect Associate - Part 9 - Databases

AWS Certified Solutions Architect Associate - Part - 8 Application deployment

AWS Certified Solutions Architect Associate - Part 7 - Autoscaling and virtual network services

AWS Certified Solutions Architect Associate - Part 6 - Identity and access management

AWS Certified Solutions Architect Associate - Part 5 - Compute services design

AWS Certified Solutions Architect Associate - Part 4 - Virtual Private Cloud

AWS Certified Solutions Architect Associate - Part 3 - Storage services

AWS Certified Solutions Architect Associate - Part 2 - Introduction to Security

AWS Certified Solutions Architect Associate - Part 1 - Key services relating to the Exam

AWS Certifications - Part 1 - Certified solutions architect associate

AWS Virtual Private Cloud (VPC) Examples

Curated info on AWS Virtual Private Cloud (VPC)

Notes on Amazon Web Services 8 - Command Line Interface (CLI)

Notes on Amazon Web Services 7 - Elastic Beanstalk

Notes on Amazon Web Services 6 - Developer, Media, Migration, Productivity, IoT and Gaming

Notes on Amazon Web Services 5 - Security, Identity and Compliance

Notes on Amazon Web Services 4 - Analytics and Machine Learning

Notes on Amazon Web Services 3 - Managment Tools, App Integration and Customer Engagement

Notes on Amazon Web Services 2 - Storages databases compute and content delivery

Notes on Amazon Web Services 1 - Introduction

AWS Auto Scaling - All you need to know

AWS Load Balancers - How they work and differences between them

AWS EC2 Instance Types - Curated

Amazon Web Services - Identity and Access Management Primer

Amazon Web Services - Create IAM User

Preparing Jenkins after Installation

Jenkins titbits, and then some

Docker Titbits

How to Add Chat Functionality to a Maven Java Web App

Packer - an introduction

Terraform - an introduction

Versioning REST Resources with Spring Data REST

Installing and running Jenkins in Docker

Automate deployment of Jenkins to AWS - Part 2 - Full automation - Single EC2 instance

Automate deployment of Jenkins to AWS - Part 1 - Semi automation - Single EC2 instance

Introduction to Jenkins

Software Engineers Reference - Dictionary, Encyclopedia or Wiki - For Software Engineers