I am trying to build a basic registration form that sends the form data to a stateless bean through a Servlet. But inside ActiveMQ console I see two consumers for same queue also I need to register twice to add a new user in the list.
Any help is appreciated.
Logs:
WARNING: All illegal access operations will be denied in a future release
15:35:34,892 WARN [org.wildfly.extension.undertow] (MSC service thread 1-3) WFLYUT0101: Duplicate servlet mapping /Register found
15:35:35,008 INFO [javax.enterprise.resource.webcontainer.jsf.config] (ServerService Thread Pool -- 84) Initializing Mojarra 2.3.14.SP01 for context '/demowarproject'
15:35:35,436 INFO [org.wildfly.extension.undertow] (ServerService Thread Pool -- 84) WFLYUT0021: Registered web context: '/demowarproject' for server 'default-server'
15:35:35,509 INFO [org.jboss.as.server] (ServerService Thread Pool -- 46) WFLYSRV0010: Deployed "activemq-rar-5.17.2.rar" (runtime-name : "activemq-rar-5.17.2.rar")
15:35:35,510 INFO [org.jboss.as.server] (ServerService Thread Pool -- 46) WFLYSRV0010: Deployed "demowarproject.war" (runtime-name : "demowarproject.war")
15:35:35,510 INFO [org.jboss.as.server] (ServerService Thread Pool -- 46) WFLYSRV0010: Deployed "demoejbprojectEAR.ear" (runtime-name : "demoejbprojectEAR.ear")
15:35:35,551 INFO [org.jboss.as.server] (Controller Boot Thread) WFLYSRV0212: Resuming server
15:35:35,555 INFO [org.apache.activemq.ra.ActiveMQEndpointWorker] (Controller Boot Thread) Starting
15:35:35,561 INFO [org.apache.activemq.ra.ActiveMQEndpointWorker] (Controller Boot Thread) Starting
15:35:35,559 INFO [org.apache.activemq.ra.ActiveMQEndpointWorker] (default-threads - 1) Establishing connection to broker [tcp://localhost:61616]
15:35:35,565 INFO [org.apache.activemq.ra.ActiveMQEndpointWorker] (default-threads - 2) Establishing connection to broker [tcp://localhost:61616]
15:35:35,567 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 21.0.2.Final (WildFly Core 13.0.3.Final) started in 8578ms - Started 648 of 874 services (390 services are lazy, passive or on-demand)
15:35:35,574 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
15:35:35,574 INFO [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
15:35:35,801 INFO [org.apache.activemq.ra.ActiveMQEndpointWorker] (default-threads - 2) Successfully established connection to broker [tcp://localhost:61616]
15:35:35,801 INFO [org.apache.activemq.ra.ActiveMQEndpointWorker] (default-threads - 1) Successfully established connection to broker [tcp://localhost:61616]
15:35:50,821 INFO [stdout] (default task-1) message sent!
15:35:51,154 INFO [stdout] (default-threads - 3) Registered!!, User count is: 1
15:35:51,158 INFO [stdout] (default-threads - 3) All users are:
15:35:51,158 INFO [stdout] (default-threads - 3) 87KumarPrashant@gmail.com
15:35:51,158 INFO [stdout] (default-threads - 3)
15:36:10,979 INFO [stdout] (default task-1) message sent!
15:36:10,995 INFO [stdout] (default-threads - 4) Registered!!, User count is: 1
15:36:10,996 INFO [stdout] (default-threads - 4) All users are:
15:36:10,996 INFO [stdout] (default-threads - 4) 87KumarPrashant@gmail.com
15:36:10,996 INFO [stdout] (default-threads - 4)
15:36:12,270 INFO [stdout] (default task-1) message sent!
15:36:12,286 INFO [stdout] (default-threads - 5) Email already registered 1
15:36:12,287 INFO [stdout] (default-threads - 5) All users are:
15:36:12,287 INFO [stdout] (default-threads - 5) 87KumarPrashant@gmail.com
15:36:12,287 INFO [stdout] (default-threads - 5)
15:36:13,438 INFO [stdout] (default task-1) message sent!
15:36:13,448 INFO [stdout] (default-threads - 6) Email already registered 1
15:36:13,449 INFO [stdout] (default-threads - 6) All users are:
15:36:13,449 INFO [stdout] (default-threads - 6) 87KumarPrashant@gmail.com
15:36:13,449 INFO [stdout] (default-threads - 6)
As you can see it needs twice to register before it says already registered, but user count is not increased second time (weird). And WildFly console shows two consumers for the same queue (also weird) as I am not using the same queue anywhere else.
ActiveMQ Console showing 2 consumers instead of 1:
Here are related files: MDB:
import java.util.ArrayList;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/queue/demo")})
public class DemoEjb implements MessageListener
{
static ArrayList<User> usersList = new ArrayList<User>();
static int userCount = 0;
User u = null;
public void onMessage(Message message)
{
try
{
if (message instanceof ObjectMessage)
{
User user = (User) ((ObjectMessage) message).getObject();
if(user.getOperation().equals("register"))
registerUser(user);
// else
// loginUser(user);
}
} catch (Exception e)
{
e.printStackTrace();
}
}
public void registerUser(User user)
{
if (isUserPresent(user.getEmail())) {
System.out.println("Email already registered " + userCount);
giveAllUsers();
return;
}
addUser(user);
System.out.println("Registered!!, User count is: " + userCount);
giveAllUsers();
}
public boolean isUserPresent(String email)
{
return usersList.stream().anyMatch(d -> d.getEmail().equals(email));
}
public void addUser(User newUser)
{
usersList.add(newUser);
userCount++;
}
public void giveAllUsers()
{
System.out.println("All users are: ");
for(User u: usersList)
{
System.out.println(u.getEmail());
}
System.out.println();
}
}
User (POJO):
import java.io.Serializable;
public class User implements Serializable
{
private static final long serialVersionUID = 1L;
private String name;
private String password;
private String email;
private String operation;
public User(String name, String email, String password, String operation)
{
this.name = name;
this.email = email;
this.password = password;
this.operation = operation;
}
public String getName()
{
return this.name;
}
public void setOperation(String operation) {
this.operation = operation;
}
public String getPassword()
{
return this.password;
}
public String getEmail()
{
return this.email;
}
public void setName(String name)
{
this.name = name;
}
public void setPassword(String pass)
{
this.password = pass;
}
public String getOperation() {
return this.operation;
}
}
Servlet:
import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.activemq.ActiveMQConnectionFactory;
import com.enovate.demoejb.User;
@WebServlet("/Register")
public class Register extends HttpServlet
{
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String name = request.getParameter("userName");
String pass = request.getParameter("userPassword");
String email = request.getParameter("userEmail");
User user = new User(name, email, pass, "register");
try
{
System.out.println("message sent!");
sendMessage(user);
PrintWriter out = response.getWriter();
out.println("Message sent!");
} catch (Exception e)
{
e.printStackTrace();
}
}
public void sendMessage(User user) throws Exception
{
Connection connection = null;
try
{
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
connection = connectionFactory.createConnection();
connection.start();
String queue = "jms/queue/demo";
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destinationQueue = session.createQueue(queue);
MessageProducer publisher = session.createProducer(destinationQueue);
ObjectMessage objectMessage = session.createObjectMessage();
objectMessage.setObject(user);
publisher.send(objectMessage);
session.close();
}
finally
{
closeConnection(connection);
}
}
private void closeConnection(Connection con)
{
try
{
if (con != null)
con.close();
}
catch(JMSException jmse)
{
System.out.println("Could not close connection " + con +" exception was " + jmse);
}
}
}
HTML file:
<html>
<head>
<meta charset="ISO-8859-1">
<title>Register</title>
</head>
<body>
<form method="post" action="Register">
Name: <input name="userName" type="text"><br>
Email: <input name="userEmail" type="email"><br>
Password: <input name="userPassword" type="password"><br>
<input type="submit" value="Register">
</form>
</body>
</html>
Web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>demowarproject</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>Register</display-name>
<servlet-name>Register</servlet-name>
<servlet-class>com.enovate.demoservlet.Register</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Register</servlet-name>
<url-pattern>/Register</url-pattern>
</servlet-mapping>
</web-app>
I was expecting it should work fine and have only one consumer.
It feels like there are two consumer created (don't know how) and then each try accepts the data one after the other.