How can I push messages from Activemq to Java Application

匿名 (未验证) 提交于 2019-12-03 09:14:57

问题:

Hi developers,

I want to write 2 .java files using JMS library names are MessageProducer and MessageConsumer.

I added activemq-all-5.8.0.jar and commons-io-2.4.jar files in my lib folder.and I changed port number of Activemq from 61616 to 61617.

using MessageProducer.java file,I will send messages to Activemq.For this I wrote code it's working fine.If you want to see click on this Link.

I want to send messages from Activemq to MessageConsumer.java.This is Application is in Apache Tomcat(http://localhost:8080/ExecutableFileProcess/MessageConsumer)

Once MessageConsumer receives the message, it separates the message-body from message and it just print on console(just for my testing).For this I wrote the following 2 java files.But it's not working.

MessageConsumer.java :

 package PackageName;  import java.io.IOException;  import javax.jms.Connection;  import javax.jms.ConnectionFactory;  import javax.jms.MessageListener;  import javax.jms.Queue;  import javax.jms.Session;  import javax.servlet.ServletException;  import javax.servlet.http.HttpServlet;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import org.apache.activemq.ActiveMQConnectionFactory;  public class MessageConsumer extends HttpServlet { @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1)         throws ServletException, IOException { try {     //creating connectionfactory object for way     ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("admin","admin","tcp://localhost:61617");     //establishing the connection b/w this Application and Activemq     Connection connection=connectionFactory.createConnection();     Session session=connection.createSession(false, Session.AUTO_ACKNOWLEDGE);     Queue queue=session.createQueue("MessageTesing");     javax.jms.MessageConsumer consumer=session.createConsumer(queue);     //fetching queues from Activemq     MessageListener listener = new MyListener();     consumer.setMessageListener(listener);     connection.start(); } catch (Exception e) {     // TODO: handle exception }  } } 

MyListener.java :

package PackageName; import javax.jms.Message; import javax.jms.MessageListener; public class MyListener implements MessageListener { public void onMessage(Message msg) {     System.out.println(msg); } }; 

I didn't configure destination for Queue in Activemq console and also I didn't mention "destination" while sending message from MessageProducer.java.

I am using Eclipse.How can I print messagebody in console,Actually based on messagebody I will do some operations in my MessageConsumer.java.but for my testing I need to see messagebody.

I hope,you understand what I am trying.

I am new to JMSand Java,so can you explain clearly.So far I wrote the code using Google search.But I didn't find anywhere this issue.

can anyone suggest me.

Thanks.

回答1:

Possibly your program just starts and terminates, because you have written the client to receive messages asynchronously (by using a MessageListener, in a different thread), and your main thread just terminates.

Try something like this:

                connection.start();                  System.out.println("Press a key to terminate");                 try {                     System.in.read();                 } catch (IOException e) {                     e.printStackTrace();                 }                  System.out.println("End"); 

this should keep your program running, until you hit a key.


To read the body of a TextMessage, use something like this (this is quoted from ActiveMQ hello world examples:

            if (message instanceof TextMessage) {                 TextMessage textMessage = (TextMessage) message;                 String text = textMessage.getText();                 System.out.println("Received: " + text);             } else {                 System.out.println("Received: " + message);             } 


回答2:

import java.io.Serializable; import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageProducer; import javax.jms.ObjectMessage; import javax.jms.Session;  import org.apache.activemq.ActiveMQConnectionFactory; import org.apache.log4j.Logger;  public class ActiveMQConnection {      private static final long timeout = 3000L;      private Logger logger = Logger.getLogger(ActiveMQConnection.class);      private String activeMQUser;      private String activeMQPassword;     private String activeMQURI;     private String activeMQQueueName;      private ActiveMQConnectionFactory connectionFactory;     private Connection connection;     private Session session;     private boolean isConnected;      private boolean transacted = false;     private Destination destinationQueue;       private boolean isQueueAvailable;     private boolean isProducerAvailable;     private boolean isConsumerAvailable;      private MessageProducer producerForQueue;     private MessageConsumer consumerForQueue;      /**      * Create Default service      * @throws Exception       */     public ActiveMQConnection() throws Exception     {         try {                 throw new JMSException("No Parameters defined for creating connection. Try constructor with parameters.");         } catch (JMSException e) {             logger.error("JMS Exception in Active MQ Connection",e);             throw e;         } catch (Exception e) {             logger.error("JMS Exception in Active MQ Connection",e);             throw e;         }     }       /**      * Create a service with desired parameters.      * @param activeMQUser      * @param activeMQPassword      * @param activeMQURI      * @param activeMQQueueName      * @throws Exception       */     public ActiveMQConnection(String activeMQUser, String activeMQPassword, String activeMQURI) throws Exception     {         try {             this.activeMQUser = activeMQUser;             this.activeMQPassword = activeMQPassword;             this.activeMQURI =  activeMQURI;             setUpActiveMQConnection();          } catch (JMSException e) {             logger.error("JMS Exception in Active MQ Connection",e);             throw e;         } catch (Exception e) {             logger.error("Exception in Active MQ Connection",e);             throw e;         }     }      /**      * @throws JMSException, Exception       */     private void setUpActiveMQConnection() throws JMSException, Exception     {         connectionFactory = new ActiveMQConnectionFactory(                 this.activeMQUser,                 this.activeMQPassword,                 this.activeMQURI );         try {             connection = connectionFactory.createConnection();             connection.start();             session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);             isConnected = true;         }catch (JMSException e) {             isConnected = false;             throw e;         }catch(Exception e){             isConnected = false;             throw e;         }     }      /**      * @throws Exception      */     public void setUpQueue(String queueName ) throws Exception     {         this.activeMQQueueName = queueName;         createQueue();         createProducer();         createConsumer();     }      /**      * @throws Exception      */     private void createQueue() throws Exception      {         try {             if(destinationQueue == null)                 {                    destinationQueue = session.createQueue(this.activeMQQueueName);                 isQueueAvailable = true;                 }         } catch (JMSException e) {             isQueueAvailable = false;             throw e;         }catch(Exception e){             isQueueAvailable = false;             throw e;         }     }      /**      * @throws JMSException       *       */     private void createProducer() throws JMSException     {            if(producerForQueue == null)         {                try {                 producerForQueue = session.createProducer(destinationQueue);                 producerForQueue.setDeliveryMode(DeliveryMode.NON_PERSISTENT);                 isProducerAvailable = true;             } catch (JMSException e) {                 isProducerAvailable = false;                 throw e;             }         }     }      /**      * @throws JMSException      */     private void createConsumer() throws JMSException     {            if(consumerForQueue == null)         {                try {                 consumerForQueue = session.createConsumer(destinationQueue);                 isConsumerAvailable = true;             } catch (JMSException e) {                 isConsumerAvailable = false;                 throw e;             }         }     }      /**      * @param objectToQueue      * @throws JMSException      */     public void sendMessage(Serializable objectToQueue) throws JMSException      {         ObjectMessage message = session.createObjectMessage();         message.setObject(objectToQueue);         producerForQueue.send(message);     }      /**      * @param objectToQueue      * @throws JMSException      */     public Serializable receiveMessage() throws JMSException      {         Message message = consumerForQueue.receive(timeout);         if (message instanceof ObjectMessage)                {                    ObjectMessage objMsg = (ObjectMessage) message;                   Serializable sobject = objMsg.getObject();                   return sobject;               }         return null;     }      /**      * close-MQ-Connection      */     public void closeMQConnection()     {         try          {             if(consumerForQueue != null)             {             consumerForQueue.close();             }             if(producerForQueue != null)             {             producerForQueue.close();             }             if(session != null)             {             session.close();             }             if(connection != null )             {             connection.close();             }            }          catch (JMSException e)              {             logger.info("Error while closing connection.",e);             }         finally             {             consumerForQueue = null;             producerForQueue = null;             destinationQueue = null;             session = null;             connection = null;             activeMQUser = null;             activeMQPassword = null;             activeMQQueueName = null;             activeMQURI = null;             }     }      public boolean isConnected() {         return isConnected;     }      public void setConnected(boolean isConnected) {         this.isConnected = isConnected;     }      public boolean isQueueAvailable() {         return isQueueAvailable;     }      public void setQueueAvailable(boolean isQueueAvailable) {         this.isQueueAvailable = isQueueAvailable;     }      public boolean isProducerAvailable() {         return isProducerAvailable;     }      public void setProducerAvailable(boolean isProducerAvailable) {         this.isProducerAvailable = isProducerAvailable;     }      public MessageConsumer getConsumerForQueue() {         return consumerForQueue;     }      public void setConsumerForQueue(MessageConsumer consumerForQueue) {         this.consumerForQueue = consumerForQueue;     }      public boolean isConsumerAvailable() {         return isConsumerAvailable;     }      public void setConsumerAvailable(boolean isConsumerAvailable) {         this.isConsumerAvailable = isConsumerAvailable;     } } 

Above is a Utility class for

  • creating connection creating/connecting to queue sending message receiving message
  • You can use methods in it to send or receive any Serializable POJO.


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!