ActiveMQ Messaging Service (iii)

Source: Internet
Author: User

Imagine the scene:

There is a task that needs to be done in a specific environment. In two steps with Activemq, the first: the sender publishes a message; second: The recipient has to do something after receiving the message.

The demo code is still posted directly in this article!

1, the project structure diagram:

2, ACTIVEMQ jar package dependent, some pom.xml file code:
<dependencies><dependency><groupId>org.apache.activemq</groupId><artifactId> activemq-core</artifactid><version>5.7.0</version></dependency><dependency>< Groupid>org.apache.activemq</groupid><artifactid>activemq-pool</artifactid><version >5.7.0</version></dependency><!--activemq-spring--><dependency><groupid> org.apache.activemq</groupid><artifactid>activemq-spring</artifactid><version>5.7.0 </version></dependency><dependency><groupId>org.springframework</groupId>< artifactid>spring-jms</artifactid><version>3.0.7.release</version></dependency>< dependency><groupid>org.slf4j</groupid><artifactid>slf4j-api</artifactid>< Version>1.6.1</version></dependency><dependency><groupid>org.slf4j</groupid> <artifactid>slf4j-log4j12</artifactid><version>1.6.1</version></dependency><dependency><groupid>log4j </groupid><artifactid>log4j</artifactid><version>1.2.16</version></dependency ></dependencies>
3. Log Properties File Log4j.properties:


log4j.rootlogger=debug,info,consolelog4j.appender.console= org.apache.log4j.consoleappenderlog4j.appender.console.layout= Org.apache.log4j.patternlayoutlog4j.appender.console.layout.conversionpattern=%d{yyyy-mm-dd HH\:mm\:ss,SSS} [%c] -[%P]%m%n
4. Message receive Configuration Properties file Receive.properties:


jsm_url=tcp://localhost:61616jms_name=com.andy.demo.testjsm_type=topicfliter=test_key= com.andy.demo.util.activemq.dosomethingimplmax_caches=100
5. Message Send Configuration Properties file Send.properties:


Jsm_url=tcp://localhost:61616jms_name=com.andy.demo.testjsm_type=topicmax_caches=100persist=persist
6, in the scene said, when we receive the message need to deal with some things

In this example, the things that need to be dealt with are taken out, divided into the interfaces that need to be handled, and the implementation class two parts:

(i) interface Idosomething.java:

Package Com.andy.demo.activemq.work;import javax.jms.message;//handles some things on the interface public interface Idosomething {// Do something practical 1public void doSomeThing01 (Message message);//dry point 2public void doSomeThing02 (Message message);}
(b) Interface implementation class Dosomethingimpl.java:
Package Com.andy.demo.activemq.work.impl;import Javax.jms.jmsexception;import Javax.jms.message;import Javax.jms.textmessage;import com.andy.demo.activemq.work.idosomething;//Handle Some things the interface implementation class public classes Dosomethingimpl Implements idosomething {@Overridepublic void doSomeThing01 (Message message) {//TODO auto-generated method Stubif (Messa GE instanceof textmessage) {textmessage msg = (textmessage) message;try {System.out.println ("DOSOMETHING01 Processed message content:" + ms G.gettext ());} catch (JMSException e) {//TODO auto-generated catch Blocke.printstacktrace ();}}} @Overridepublic void doSomeThing02 (Message message) {//TODO auto-generated method stubif (Message instanceof TextMessage {TextMessage msg = (textmessage) message;try {System.out.println ("doSomeThing02 Processed message content:" + msg.gettext ());} catch (JMS Exception e) {//TODO auto-generated catch Blocke.printstacktrace ();}}}
7. Message producer or sender of message sender. Java:

Package Com.andy.demo.activemq;import Java.util.concurrent.blockingqueue;import Java.util.concurrent.linkedblockingqueue;import Javax.jms.connection;import Javax.jms.deliverymode;import Javax.jms.destination;import Javax.jms.jmsexception;import Javax.jms.messageproducer;import javax.jms.Session; Import Org.apache.activemq.activemqconnectionfactory;import org.slf4j.logger;import org.slf4j.LoggerFactory;/** * @ package:com.andy.demo.util.activemq<br> * @file:sender.java<br> * @describe: Message sender <br> * @author :wanglongjie<br> * @createDate: November 6, 2015 PM 1:21:33<br> * @updater:<br> * @updateDate:<br> * @u Pdatecontent:<br> */public class Sender {private static final Logger Logger = Loggerfactory.getlogger (sender.class );p rivate activemqconnectionfactory factory;private Connection conn;private Session session;private Destination Destination;private messageproducer producer;private String Url;private string Jmsname;private boolean isTopic;private Boolean ispersist;private boolean isconnection;private blockingqueue<string> queue;private String msg;public Sender (string URL, String jmsname, Boolean istopic,boolean ispersist, int maxcaches) {super (); System.out.println ("Sender.sender (): Instantiating an object by constructor ..."); This.url = Url;this.jmsname = Jmsname;this.istopic = Istopic ; this.ispersist = Ispersist;this.queue = new linkedblockingqueue<string> (maxcaches);} public static Sender getsendercase (string url, String Jmsname,boolean istopic, boolean ispersist, int maxcaches) {SYSTEM.O Ut.println ("Sender.getsendercase (): Instantiating an object by means of a static method ..."); return new Sender (URL, jmsname, Istopic, Ispersist, maxcaches );} public void AddMessage (String msg) throws Interruptedexception {System.out.println ("sender.addmessage (): Adding messages to the queue ... "); Queue.put (msg);} private void Sendmsg (String msg) throws Interruptedexception, jmsexception {System.out.println ("sender.sendmsg (): Send a message to the server ... "); Thread.Sleep (5 *);p Roducer.send (Session.createtextmessage (msg));} PuBlic void Send () {System.out.println ("sender.send (): Remove message from queue ..."); while (!queue.isempty ()) {try {msg = Queue.take () ; Initactivemq (); sendmsg (msg);} catch (Exception e) {//Todo:handle Exceptionlogger.error (E.getmessage ()); Close ();}} Close ();} public void SendMessage (String msg) throws Jmsexception,interruptedexception {System.out.println ("Sender.sendmessage (): Send Message Main method to start running ... "); Initactivemq (); sendmsg (msg); Close ();} Initialize activemqprivate void Initactivemq () throws JMSException {System.out.println ("SENDER.INITACTIVEMQ (): Initialize ActiveMQ ... "); if (isconnection) {return;} Factory = new Activemqconnectionfactory (URL); conn = Factory.createconnection (); session = Conn.createsession ( Boolean.false, Session.auto_acknowledge);d estination = istopic? Session.createtopic (jmsname): Session.createqueue (jmsname);p roducer = session.createproducer (destination); Producer.setdeliverymode (ispersist? DeliveryMode.PERSISTENT:DeliveryMode.NON_PERSISTENT); isconnection = true;} Close release resource private void Close () {SYstem.out.println ("Sender.close (): Close freeing of resources ..."), try {producer.close (); Session.close (); Conn.close ();} catch (Exception e) {//Todo:handle Exceptionlogger.error (E.getmessage ());} Isconnection = false;}}
8, the message subscribers or call the message recipient Receiver.java:

Package Com.andy.demo.activemq;import Java.util.concurrent.blockingqueue;import Java.util.concurrent.linkedblockingqueue;import Javax.jms.connection;import Javax.jms.destination;import Javax.jms.exceptionlistener;import Javax.jms.jmsexception;import Javax.jms.message;import Javax.jms.messageconsumer;import Javax.jms.messagelistener;import Javax.jms.session;import Org.apache.activemq.activemqconnectionfactory;import Org.slf4j.logger;import Org.slf4j.LoggerFactory;import com.andy.demo.activemq.work.idosomething;/** * @package:com.andy.demo.util.activemq<br> * @file: Receive.java <br> * @describe: Message recipient <br> * @author:wanglongjie<br> * @createDate: November 6, 2015 PM 1:20:27<br> * @ Updater:<br> * @updateDate:<br> * @updateContent:<br> */public class Receiver extends Thread implemen TS Messagelistener,exceptionlistener, Runnable {private static final Logger Logger = Loggerfactory.getlogger ( Receiver.class);p rivate activemqconnectionfactory factory;Private Connection conn;private Session session;private Destination destination;private Messageconsumer consumer; private String Url;private string Jmsname;private boolean istopic;private string filter;private blockingqueue< message> queue;private idosomething dosomething;public Receiver (string url, String jmsname, Boolean istopic, String fi lter,idosomething dosomething, int maxcaches) {System.out.println ("Receiver.receiver (): Constructor instantiation object ..."); This.url = Url;this.jmsname = Jmsname;this.istopic = Istopic;this.filter = filter;this.dosomething = DoSomething;queue = new LinkedB Lockingqueue<message> (maxcaches);} public static Receiver getreceivercase (string url, String Jmsname,boolean istopic, String filter, Idosomething Dosomethin G,int maxcaches) throws JMSException {System.out.println ("receiver.getreceivercase (): Static method Instantiation of Object ..."); Receiver receiver = new receiver (URL, jmsname, Istopic, filter,dosomething, maxcaches); Receiver.initactivemq (); Receiver.start (); return receiver;} InitialActiveMQ parameter private void Initactivemq () throws JMSException {System.out.println ("RECEIVER.INITACTIVEMQ (): Initialize ActiveMQ ... "); factory = new activemqconnectionfactory (URL); conn = Factory.createconnection (); Conn.start (); session = Conn.createsession (Boolean.false, Session.auto_acknowledge);d estination = istopic? Session.createtopic (jmsname): Session.createqueue (jmsname); consumer = (IsNull (filter))? Session.createconsumer (destination): Session.createconsumer (destination, filter); Consumer.setmessagelistener ( this); Conn.setexceptionlistener (this);} public void Close () {System.out.println ("Receiver.close (): Close release resource ..."); try {session.close ();} catch (JMSException e) {//TODO auto-generated catch Blocklogger.error (E.getmessage ());} try {conn.stop (); Conn.close ();} catch (Exception e) {//Todo:handle Exceptionlogger.error (E.getmessage ());}} Determines whether the empty private Boolean isNull (String param) {return param = = NULL | | param.equals ("");} /* * (NON-JAVADOC) * * @see Javax.jms.exceptionlistener#onexceptiOn (javax.jms.JMSException) */@Overridepublic void Onexception (JMSException exception) {//TODO auto-generated method StubSystem.out.println ("Receiver.onexception (): ActiveMQ abnormal listener ..."); while (true) {try {initactivemq (); catch (Exception e) {//Todo:handle Exceptionlogger.error (E.getmessage ()); try {thread.sleep ()} catch (Interrup Tedexception E1) {//TODO auto-generated catch Blocklogger.error (E1.getmessage ());}}}} /* * (NON-JAVADOC) * * @see javax.jms.messagelistener#onmessage (javax.jms.Message) */@Overridepublic void OnMessage ( Message message) {//TODO auto-generated method StubSystem.out.println ("Receiver.onmessage (): ActiveMQ message Receive listener ..."); try {if (istopic) {queue.put (message);} else {dosomethingwork (message)}} catch (Exception e) {//Todo:handle Exceptionlo Gger.error (E.getmessage ());}} /* * (NON-JAVADOC) * * @see java.lang.thread#run () */@Overridepublic void Run () {//TODO auto-generated method Stubsystem . Out.println ("Receiver.run (): runnble interface Listener ..." + Thread.CurrentThread (). GetName ()); while (true) {Message message = null;try {message = Queue.take ();d osomethingwork (message);} catch (Exception e) {//Todo:handle Exceptionlogger.error (E.getmessage ());}}} Specific task public void Dosomethingwork (Message message) {SYSTEM.OUT.PRINTLN ("Receiver.dosomethingwork (): Started doing something ..."); DOSOMETHING.DOSOMETHING01 (message);d osomething.dosomething02 (message);}}
9, the message sender and the message receiver's encapsulation class Activemqutils.java:

Package Com.andy.demo.activemq;import Java.io.inputstream;import Java.util.properties;import Javax.jms.jmsexception;import Org.slf4j.logger;import Org.slf4j.loggerfactory;import com.andy.demo.activemq.work.idosomething;/** * @package:com.andy.demo.util.activemq<br> * @file :activemqutils.java<br> * @describe:<br> * @author:wanglongjie<br> * @createDate: November 6, 2015 PM 1 :22:13<br> * @updater:<br> * @updateDate:<br> * @updateContent:<br> */public class Activemqutil s {private static final Logger Logger = Loggerfactory.getlogger (activemqutils.class);p ublic static final String Jms_url = Null;public static final String jms_name = null;public static final string jms_filter = null;public static final string JM S_type = "topic";p ublic static final string test_key = null;public static final string persist = "persist";/** * * @metho d:getreceiverbean<br> * @describe: Get message Receiver Instance <br> * @author:wanglongjie<br> * @createDate: 2015November 6 pm 4:03:31 <br> * @param properties * @param dosomething * @return Receiver * @throws jmsexception * */public s Tatic Receiver Getreceiverbean (String properties,idosomething dosomething) throws jmsexception {Properties P = LoadProperties (properties); String url = p.getproperty ("Jsm_url"); String jmsname = P.getproperty ("Jms_name"); Boolean istopic = P.getproperty ("Jsm_type", "topic"). Equals ("topic"); String filter = P.getproperty ("Fliter"), int maxcaches = Integer.parseint (P.getproperty ("Max_caches", "1000")); Receiver receiver = receiver.getreceivercase (URL, jmsname, Istopic,filter, dosomething, maxcaches); return receiver;}  /** * * @method:getsendercase<br> * @describe: Get message Sender Instance <br> * @author:wanglongjie<br> * @createDate : November 6, 2015 PM 4:03:48 <br> * @param properties * @return Sender */public static sender getsendercase (String Properti ES) {Properties P = loadProperties (properties); String url = p.getproperty ("Jsm_url"); String jmsname = P.getproperty ("JMS_name "), Boolean istopic = P.getproperty (" Jsm_type "," topic "). Equals (" topic "); Boolean ispersist = P.getproperty (" Persist "," persist "). Equals (" persist "); int maxcaches = Integer.parseint (P.getproperty (" Max_caches "," 1000 ")); Sender sender = sender.getsendercase (URL, jmsname, istopic, ispersist,maxcaches); return sender;} /** * * @method:loadproperties<br> * @describe: Load Properties File <br> * @author:wanglongjie<br> * @createDate:  November 6, 2015 PM 1:36:44 <br> * @param properties * @return Properties */private static Properties LoadProperties (String Properties) {InputStream in = null;try {in = ActiveMQUtils.class.getResourceAsStream (properties); Properties P = new properties ();p. Load (in); return p;} catch (Exception e) {//Todo:handle Exceptionlogger.error (E.getmessage ());} finally {try {in.close ();} catch (Exception E 2) {//Todo:handle Exceptionlogger.error (e2.tostring ());}} return null;}}
10. Test class, distribute Send message test, receive message test two parts:

(a) message sent test class Senderapptest.java:

Package Com.andy.demo.activemq.test;import Java.util.date;import Javax.jms.jmsexception;import Com.andy.demo.activemq.activemqutils;import com.andy.demo.activemq.sender;//Send Message test class public classes SenderAPPTest { public static void Main (string[] args) {String properties = "/send.properties"; Sender sender = Activemqutils.getsendercase (properties); int sum = 5;for (int i = 0; i < sum; i++) {String msg = new Dat E (System.currenttimemillis ()) + "; Hello, I am Andy and this is a ActiveMQ test["+ (i + 1) +"]! "; try {sender.sendmessage (msg);} catch (JMSException e) {e.printstacktrace ();} catch (Interruptedexception e) { E.printstacktrace ();} try {thread.sleep),} catch (Interruptedexception e) {e.printstacktrace ();}}}}
(ii) Receiving the message test class Receiverapptest.java:

Package Com.andy.demo.activemq.test;import Javax.jms.jmsexception;import com.andy.demo.activeMQ.ActiveMQUtils; Import com.andy.demo.activemq.receiver;import com.andy.demo.activemq.work.impl.dosomethingimpl;//Receive message test class public Class Receiverapptest {public static void main (string[] args) {String properties = "/receive.properties";D Osomethingimpl dosomething = new Dosomethingimpl (); int num = 5; Receiver[] Receivers = new Receiver[num];try {for (int i = 0; i < num; i++) {Receivers[i] = Activemqutils.getreceiverbe An (properties,dosomething);}} catch (JMSException e) {//TODO auto-generated catch Blocke.printstacktrace ();}}}
11, this example of the source code has been affixed, and then again JMS in the topic and queue differences:

(a) topic:

in JMS, topic implements publish and subscribe semantics. When a message is publish, it will be sent to all interested subscribers, so 0 to multiple subscriber will receive a copy of the message. However, when the message agent receives a message, only the Subscriber that activates the subscription can get a copy of the message.
So when you write the Jsm_type attribute in the configuration file as a topic test, you must first start the Receiverapptest.java receiver, and then start the Senderapptest.java sender. In other words, in the case of topic, a message sent by a sender can be received only if there is a receiver first.

(b) Queue:

The
MS queue executes the load balancer semantics. A message can only be received by one consumer. If there is no consumer available when the message is sent, it will be saved until the consumer that can handle the message is available. If a consumer receives a message and does not respond to it, then the message will be transferred to another consumer. A queue can have many consumer and load balancing in multiple available consumer
So when you write the Jms_type attribute in the configuration file as a queue test, start the sender or the receiver. 12, more detailed activemq communication method can refer to the previous blog.


ActiveMQ Messaging Service (iii)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.