Вы находитесь на странице: 1из 17

Spring4+JMS+ActiveMQexamplewith

@JmsListener&@EnableJms

InthepreviouspostoverSpringwithJMS,wehaveseenhowapplicationscancommunicateusingJMS,
leveragingSpringssupportforJMS.Thispostgoesastepfurther,andshowsanalternativeto
javax.jms.MessageListenerwhichallowsustocreateMessageListenersusingplainPOJOs,thanksto
Springsveryown@JmsListener,usedincombinationwithJmsListenerConnectionFactoryand
@EnableJMS.Letsgetstarted.

Followingtechnologiesbeingused:

Spring4.3.0.RELEASE

SpringJMS4.3.0.RELEASE

ActiveMQ5.13.3

Maven3

JDK1.7

Tomcat8.0.21

EclipseMARS.1Release4.5.1

logback1.1.7

Letsbeginbyconfiguringthelistenerfirst.

packagecom.websystique.spring.messaging;

importjavax.jms.JMSException;

importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.jms.annotation.JmsListener;
importorg.springframework.messaging.Message;
importorg.springframework.messaging.MessageHeaders;
importorg.springframework.stereotype.Component;

importcom.websystique.spring.model.InventoryResponse;

@Component
publicclassMessageReceiver{

staticfinalLoggerLOG=LoggerFactory.getLogger(MessageReceiver.class);
privatestaticfinalStringORDER_RESPONSE_QUEUE="orderresponsequeue";

@JmsListener(destination=ORDER_RESPONSE_QUEUE)
publicvoidreceiveMessage(finalMessage<InventoryResponse>message)throwsJMSException{
LOG.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
MessageHeadersheaders=message.getHeaders();
LOG.info("Application:headersreceived:{}",headers);

InventoryResponseresponse=message.getPayload();
LOG.info("Application:responsereceived:{}",response);
LOG.info("Application:responsereceived:{}",response);
LOG.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
}

ShownaboveisaPOJO,whichdoesnotimplementjavax.jms.MessageListener,justannotatedwith
@JmsListenerwhichmarksamethodtobethetargetofaJMSmessagelisteneronthespecified
destination().Whatwestillhavetodoisto:

1.Configureamessagelistenercontainer[withJmsListenerContainerFactory]:whichlistensona
destination[canbetheoneusedwith@JmsListener]andwhenanymessagearrivesonthis
destination,itretrievedthatmessageandpassestothebeanannotatedwith@JmsListenerforthat
destination.

2.Use@EnableJmswhichenablesdetectionofJmsListenerannotationsonanySpringmanaged
beaninthecontainer.

Belowshownistheconfigurationwehavejustdiscussed:

packagecom.websystique.spring.configuration;

importjavax.jms.ConnectionFactory;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.jms.annotation.EnableJms;
importorg.springframework.jms.config.DefaultJmsListenerContainerFactory;

@Configuration
@EnableJms
publicclassMessagingListnerConfiguration{

@Autowired
ConnectionFactoryconnectionFactory;

@Bean
publicDefaultJmsListenerContainerFactoryjmsListenerContainerFactory(){
DefaultJmsListenerContainerFactoryfactory=newDefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrency("11");
returnfactory;
}

}

SubmitYourResumeTopCompaniesareHiring.
3,00,000+Jobs,Salary25K85K.Register&ApplyNowonShine.com.shine.com

DefaultJmsListenerContainerFactoryisaJmsListenerContainerFactoryimplementationtobuildaregular
DefaultMessageListenerContainer.Youcanconfigureseveralproperties.Attheveryleast,itneedsa
connectionfactory.Additionally,wehavespecifiedtheconcurrency[maxnumberofconcurrent
users/consumers]usingsetConcurrency(lowweupper).YoucanalsousesetConcurrency(upper)
whichmeanslowerwillbe1.
Note:Youcanalsospecifythecontainerfactorytobeusedin@JmsLietenerannoatation,with
containerFactoryattributedefiningthenameoftheJmsListenerContainerFactorybeantouse.Whennone
issetaJmsListenerContainerFactorybeanwithnamejmsListenerContainerFactoryisassumedtobe
present.

ThatsallyouneedtoconfiguretheMessagelistenersusing@JmsListener.Completecodesofboth
producer&consumerapplicationsisshownbelow[aswellasindownloadsection].

Startthedamnapplications,Bill
WewillbeusingApacheActiveMQ.Incaseyoudidnot,downloadActiveMQMessageBroker,unzipit,
gotobindirectoryandstartitusing$./activemqstart.

YoucanquicklychecktheWebConsole[availableat http://localhost:8161/admin/ withcredentials


admin/admin .

Application(s)Overview:

Inthisexample,wehavetwoapplicationsA&Btryingtocommunicatewitheachotherviasending
MessagesonQueues.AlthoughwecouldhaveoptedforTopicinstead,Queueisperfectforthisone
produceroneconsumerscenario.

Asendsamessage[apojoobject]toaQueue[orderqueue]andlistensfortheresponseonanother
Queue[orderresponsequeue].Bislisteningonorderqueue,anduponreceivingthemessage,Bwill
sendareply[apojoresponseobject]toAonorderresponsequeue.Ashortbutsimpleexampleofinter
applicationcommunicationusingJMS.
BelowarethemainsofbothProducer[A]&Consumer[B]applications.

packagecom.websystique.spring.configuration;

importjava.util.concurrent.atomic.AtomicInteger;

importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
importorg.springframework.context.support.AbstractApplicationContext;

importcom.websystique.spring.model.Product;
importcom.websystique.spring.service.ProductService;
importcom.websystique.spring.util.BasicUtil;

publicclassProducerApplication{

staticfinalLoggerLOG=LoggerFactory.getLogger(ProducerApplication.class);

privatestaticAtomicIntegerid=newAtomicInteger();

publicstaticvoidmain(String[]args){
AbstractApplicationContextcontext=newAnnotationConfigApplicationContext(
AppConfig.class);

ProductServiceproductService=(ProductService)context.getBean("productService");


Productproduct=getProduct();
LOG.info("Application:sendingorder{}",product);
productService.sendProduct(product);

try{
Thread.sleep(60000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
((AbstractApplicationContext)context).close();
}


privatestaticProductgetProduct(){
Productp=newProduct();
p.setName("Product"+id.incrementAndGet());
p.setProductId(BasicUtil.getUniqueId());
p.setQuantity(2);
returnp;
}
}

packagecom.websystique.spring.configuration;

importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;
importorg.springframework.context.support.AbstractApplicationContext;

publicclassConsumerApplication{

staticfinalLoggerLOG=LoggerFactory.getLogger(ConsumerApplication.class);

publicstaticvoidmain(String[]args){
AbstractApplicationContextcontext=newAnnotationConfigApplicationContext(AppConfig.class);

try{
Thread.sleep(60000);
}catch(InterruptedExceptione){
e.printStackTrace();
}

((AbstractApplicationContext)context).close();
}

}
}

StartApplicationA[Producer].Gotowebconsole,andclickonqueuetab.Youshouldseetwoqueues
beingcreatedwithamessageononequeue[Ahasjustsentamessage]whileotherempty.

NowstartApplicationB[Consumer],againcheckqueuesonwebconsole,youwillseemessagebeingde
queuedonfirstqueue[Bhasjustprocessedit]andnewmessagebeingenqueued[Bhassentthe
responsetoA]andeventuallydequeued[Agottheresponse]onsecondqueue.
LogsofProducerApplication:

Jun26,20162:50:50PMorg.springframework.context.annotation.AnnotationConfigApplicationContextprepareRefresh
INFO:Refreshingorg.springframework.context.annotation.AnnotationConfigApplicationContext@5cca2df1:startupdat
Jun26,20162:50:51PMorg.springframework.context.support.DefaultLifecycleProcessorstart
INFO:Startingbeansinphase2147483647
14:50:51.343[main]DEBUGorg.apache.activemq.transport.WireFormatNegotiatorSending:WireFormatInfo{version
14:50:51.414[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54635]DEBUGorg.apache.activemq.transport.Ina
14:50:51.415[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54635]DEBUGorg.apache.activemq.transport.Wir
14:50:51.415[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54635]DEBUGorg.apache.activemq.transport.Wir
14:50:51.415[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54635]DEBUGorg.apache.activemq.transport.Wir
14:50:51.548[DefaultMessageListenerContainer1]DEBUGorg.apache.activemq.thread.TaskRunnerFactoryInitialize
14:50:51.607[main]INFOcom.websystique.spring.configuration.ProducerApplicationApplication:sendingorder
14:50:51.607[main]INFOcom.websystique.spring.service.ProductServiceImpl+++++++++++++++++++++++++++++++++++
14:50:51.607[main]INFOcom.websystique.spring.service.ProductServiceImplApplication:sendingorderrequest
14:50:51.613[main]DEBUGorg.apache.activemq.transport.WireFormatNegotiatorSending:WireFormatInfo{version
14:50:51.616[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54636]DEBUGorg.apache.activemq.transport.Ina
14:50:51.616[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54636]DEBUGorg.apache.activemq.transport.Wir
14:50:51.616[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54636]DEBUGorg.apache.activemq.transport.Wir
14:50:51.616[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54636]DEBUGorg.apache.activemq.transport.Wir
14:50:51.786[main]DEBUGorg.apache.activemq.util.ThreadPoolUtilsShutdownofExecutorService:java.util.conc
14:50:51.787[main]DEBUGorg.apache.activemq.transport.tcp.TcpTransportStoppingtransporttcp://localhost/12
14:50:51.788[main]DEBUGorg.apache.activemq.thread.TaskRunnerFactoryInitializedTaskRunnerFactory[ActiveMQ
14:50:51.789[ActiveMQTask1]DEBUGorg.apache.activemq.transport.tcp.TcpTransportClosedsocketSocket[addr=
14:50:51.789[main]DEBUGorg.apache.activemq.util.ThreadPoolUtilsForcingshutdownofExecutorService:java.u
14:50:51.790[main]INFOcom.websystique.spring.service.ProductServiceImpl+++++++++++++++++++++++++++++++++++
14:51:11.417[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:51:11.419[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
14:51:21.418[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:51:21.418[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
14:51:31.418[ActiveMQInactivityMonitorReadCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivityM
14:51:31.419[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:51:31.419[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
14:51:41.419[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:51:41.419[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
14:51:47.329[DefaultMessageListenerContainer1]INFOcom.websystique.spring.messaging.MessageReceiver+++++++
14:51:47.330[DefaultMessageListenerContainer1]INFOcom.websystique.spring.messaging.MessageReceiverApplica
14:51:47.331[DefaultMessageListenerContainer1]INFOcom.websystique.spring.messaging.MessageReceiverApplica
14:51:47.331[DefaultMessageListenerContainer1]INFOcom.websystique.spring.messaging.MessageReceiver+++++++
14:51:51.420[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
Jun26,20162:51:51PMorg.springframework.context.annotation.AnnotationConfigApplicationContextdoClose
INFO:Closingorg.springframework.context.annotation.AnnotationConfigApplicationContext@5cca2df1:startupdate[
INFO:Closingorg.springframework.context.annotation.AnnotationConfigApplicationContext@5cca2df1:startupdate[
Jun26,20162:51:51PMorg.springframework.context.support.DefaultLifecycleProcessorstop
INFO:Stoppingbeansinphase2147483647
14:51:52.332[DefaultMessageListenerContainer1]DEBUGorg.apache.activemq.ActiveMQMessageConsumerremove:ID:
14:51:52.338[main]DEBUGorg.apache.activemq.util.ThreadPoolUtilsShutdownofExecutorService:java.util.conc
14:51:52.338[main]DEBUGorg.apache.activemq.util.ThreadPoolUtilsShutdownofExecutorService:java.util.conc
14:51:52.339[main]DEBUGorg.apache.activemq.transport.tcp.TcpTransportStoppingtransporttcp://localhost/12
14:51:52.339[main]DEBUGorg.apache.activemq.thread.TaskRunnerFactoryInitializedTaskRunnerFactory[ActiveMQ
14:51:52.339[ActiveMQTask1]DEBUGorg.apache.activemq.transport.tcp.TcpTransportClosedsocketSocket[addr=
14:51:52.340[main]DEBUGorg.apache.activemq.util.ThreadPoolUtilsForcingshutdownofExecutorService:java.u

LogsofConsumerApplication:

Jun26,20162:51:46PMorg.springframework.context.annotation.AnnotationConfigApplicationContextprepareRefresh
INFO:Refreshingorg.springframework.context.annotation.AnnotationConfigApplicationContext@6c09e6e0:startupdat
Jun26,20162:51:46PMorg.springframework.context.support.DefaultLifecycleProcessorstart
INFO:Startingbeansinphase2147483647
14:51:47.091[main]DEBUGorg.apache.activemq.transport.WireFormatNegotiatorSending:WireFormatInfo{version
14:51:47.097[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54644]DEBUGorg.apache.activemq.transport.Wir
14:51:47.099[main]DEBUGorg.apache.activemq.transport.InactivityMonitorUsingminoflocal:WireFormatInfo{
14:51:47.101[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54644]DEBUGorg.apache.activemq.transport.Wir
14:51:47.101[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54644]DEBUGorg.apache.activemq.transport.Wir
14:51:47.166[ActiveMQTransport:tcp://localhost/127.0.0.1:61616@54644]DEBUGorg.apache.activemq.thread.TaskRu
14:51:47.190[DefaultMessageListenerContainer1]INFOcom.websystique.spring.messaging.MessageReceiver
14:51:47.299[DefaultMessageListenerContainer1]INFOcom.websystique.spring.messaging.MessageReceiverApplica
14:51:47.299[DefaultMessageListenerContainer1]INFOcom.websystique.spring.messaging.MessageReceiverApplica
14:51:47.300[DefaultMessageListenerContainer1]INFOcom.websystique.spring.service.OrderServiceImplInventor
14:51:47.395[DefaultMessageListenerContainer1]INFOcom.websystique.spring.messaging.MessageReceiver
14:52:07.101[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:52:07.103[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
14:52:17.101[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:52:17.101[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
14:52:27.101[ActiveMQInactivityMonitorReadCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivityM
14:52:27.102[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:52:27.102[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
14:52:37.106[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:52:37.107[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
14:52:47.107[ActiveMQInactivityMonitorWriteCheckTimer]DEBUGorg.apache.activemq.transport.AbstractInactivity
14:52:47.107[ActiveMQInactivityMonitorWorker]DEBUGorg.apache.activemq.transport.AbstractInactivityMonitor
Jun26,20162:52:47PMorg.springframework.context.annotation.AnnotationConfigApplicationContextdoClose
INFO:Closingorg.springframework.context.annotation.AnnotationConfigApplicationContext@6c09e6e0:startupdate[
Jun26,20162:52:47PMorg.springframework.context.support.DefaultLifecycleProcessorstop
INFO:Stoppingbeansinphase2147483647
14:52:47.407[main]DEBUGorg.apache.activemq.ActiveMQMessageConsumerremove:ID:dragon5464314669455069651:
14:52:47.414[main]DEBUGorg.apache.activemq.util.ThreadPoolUtilsShutdownofExecutorService:java.util.conc
14:52:47.415[main]DEBUGorg.apache.activemq.util.ThreadPoolUtilsShutdownofExecutorService:java.util.conc
14:52:47.416[main]DEBUGorg.apache.activemq.transport.tcp.TcpTransportStoppingtransporttcp://localhost/12
14:52:47.418[main]DEBUGorg.apache.activemq.thread.TaskRunnerFactoryInitializedTaskRunnerFactory[ActiveMQ
14:52:47.419[ActiveMQTask1]DEBUGorg.apache.activemq.transport.tcp.TcpTransportClosedsocketSocket[addr=
14:52:47.419[main]DEBUGorg.apache.activemq.util.ThreadPoolUtilsForcingshutdownofExecutorService:java.u

CompleteCodeforProducer+ConsumerApplications
LetsstartwithcodingProducerApplication[A].ConsumerApplication[B]isexactlysameasA,but
listeningandsendingonoppositequeues.

ProducerApplication
ProjectStructure
pom.xml

<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven4.0.0.xsd"
<modelVersion>4.0.0</modelVersion>

<groupId>com.websystique.spring</groupId>
<artifactId>SpringJMSActiveMQProducerEx2</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>

<name>SpringJMSActiveMQProducerEx2</name>

<properties>
<springframework.version>4.3.0.RELEASE</springframework.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springcore</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springcontext</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springjms</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemqspring</artifactId>
<version>5.13.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logbackclassic</artifactId>
<version>1.1.7</version>
</dependency>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>mavencompilerplugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

packagecom.websystique.spring.configuration;

importjava.util.Arrays;

importorg.apache.activemq.spring.ActiveMQConnectionFactory;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.jms.core.JmsTemplate;

@Configuration
publicclassMessagingConfiguration{

privatestaticfinalStringDEFAULT_BROKER_URL="tcp://localhost:61616";

privatestaticfinalStringORDER_QUEUE="orderqueue";

@Bean
publicActiveMQConnectionFactoryconnectionFactory(){
ActiveMQConnectionFactoryconnectionFactory=newActiveMQConnectionFactory();
connectionFactory.setBrokerURL(DEFAULT_BROKER_URL);
connectionFactory.setTrustedPackages(Arrays.asList("com.websystique.spring","java.util"));
returnconnectionFactory;
}

@Bean
publicJmsTemplatejmsTemplate(){
JmsTemplatetemplate=newJmsTemplate();
template.setConnectionFactory(connectionFactory());
template.setDefaultDestinationName(ORDER_QUEUE);
returntemplate;
}

packagecom.websystique.spring.configuration;

importjavax.jms.ConnectionFactory;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.jms.annotation.EnableJms;
importorg.springframework.jms.config.DefaultJmsListenerContainerFactory;

@Configuration
@EnableJms
publicclassMessagingListnerConfiguration{

@Autowired
ConnectionFactoryconnectionFactory;

@Bean
publicDefaultJmsListenerContainerFactoryjmsListenerContainerFactory(){
DefaultJmsListenerContainerFactoryfactory=newDefaultJmsListenerContainerFactory();
DefaultJmsListenerContainerFactoryfactory=newDefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrency("11");
returnfactory;
}

packagecom.websystique.spring.configuration;

importorg.springframework.context.annotation.ComponentScan;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.context.annotation.Import;

@Configuration
@ComponentScan(basePackages="com.websystique.spring")
@Import({MessagingConfiguration.class,MessagingListnerConfiguration.class})
publicclassAppConfig{

//PutOtherApplicationconfigurationhere.
}

packagecom.websystique.spring.messaging;

importjavax.jms.JMSException;
importjavax.jms.Message;
importjavax.jms.ObjectMessage;
importjavax.jms.Session;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.jms.core.JmsTemplate;
importorg.springframework.jms.core.MessageCreator;
importorg.springframework.stereotype.Component;

importcom.websystique.spring.model.Product;

@Component
publicclassMessageSender{

@Autowired
JmsTemplatejmsTemplate;

publicvoidsendMessage(finalProductproduct){

jmsTemplate.send(newMessageCreator(){
@Override
publicMessagecreateMessage(Sessionsession)throwsJMSException{
ObjectMessageobjectMessage=session.createObjectMessage(product);
returnobjectMessage;
}
});
}

packagecom.websystique.spring.messaging;

importjavax.jms.JMSException;

importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.jms.annotation.JmsListener;
importorg.springframework.messaging.Message;
importorg.springframework.messaging.MessageHeaders;
importorg.springframework.stereotype.Component;

importcom.websystique.spring.model.InventoryResponse;

@Component
publicclassMessageReceiver{
publicclassMessageReceiver{

staticfinalLoggerLOG=LoggerFactory.getLogger(MessageReceiver.class);
privatestaticfinalStringORDER_RESPONSE_QUEUE="orderresponsequeue";

@JmsListener(destination=ORDER_RESPONSE_QUEUE)
publicvoidreceiveMessage(finalMessage<InventoryResponse>message)throwsJMSException{
LOG.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
MessageHeadersheaders=message.getHeaders();
LOG.info("Application:headersreceived:{}",headers);

InventoryResponseresponse=message.getPayload();
LOG.info("Application:responsereceived:{}",response);
LOG.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
}

packagecom.websystique.spring.service;

importcom.websystique.spring.model.Product;

publicinterfaceProductService{

publicvoidsendProduct(Productproduct);
}

packagecom.websystique.spring.service;

importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;

importcom.websystique.spring.messaging.MessageSender;
importcom.websystique.spring.model.Product;

@Service("productService")
publicclassProductServiceImplimplementsProductService{

staticfinalLoggerLOG=LoggerFactory.getLogger(ProductServiceImpl.class);

@Autowired
MessageSendermessageSender;

@Override
publicvoidsendProduct(Productproduct){
LOG.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
LOG.info("Application:sendingorderrequest{}",product);
messageSender.sendMessage(product);
LOG.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
}

packagecom.websystique.spring.model;

importjava.io.Serializable;

publicclassProductimplementsSerializable{

privateStringproductId;

privateStringname;

privateintquantity;

publicStringgetName(){
returnname;
}

publicvoidsetName(Stringname){
publicvoidsetName(Stringname){
this.name=name;
}

publicintgetQuantity(){
returnquantity;
}

publicvoidsetQuantity(intquantity){
this.quantity=quantity;
}

publicStringgetProductId(){
returnproductId;
}

publicvoidsetProductId(StringproductId){
this.productId=productId;
}

@Override
publicinthashCode(){
finalintprime=31;
intresult=1;
result=prime*result+((productId==null)?0:productId.hashCode());
returnresult;
}

@Override
publicbooleanequals(Objectobj){
if(this==obj)
returntrue;
if(obj==null)
returnfalse;
if(getClass()!=obj.getClass())
returnfalse;
Productother=(Product)obj;
if(productId==null){
if(other.productId!=null)
returnfalse;
}elseif(!productId.equals(other.productId))
returnfalse;
returntrue;
}

@Override
publicStringtoString(){
return"Product[productId="+productId+",name="+name+",quantity="+quantity+"]";
}
}

packagecom.websystique.spring.model;

importjava.io.Serializable;

publicclassInventoryResponseimplementsSerializable{

privateStringproductId;
privateintreturnCode;
privateStringcomment;

publicStringgetProductId(){
returnproductId;
}
publicvoidsetProductId(StringproductId){
this.productId=productId;
}
publicintgetReturnCode(){
returnreturnCode;
}
publicvoidsetReturnCode(intreturnCode){
this.returnCode=returnCode;
}
publicStringgetComment(){
returncomment;
}
}
publicvoidsetComment(Stringcomment){
this.comment=comment;
}
@Override
publicStringtoString(){
return"InventoryResponse[productId="+productId+",returnCode="+returnCode+",comment="
+"]";
}
}

packagecom.websystique.spring.util;

importjava.util.UUID;

publicclassBasicUtil{

publicstaticStringgetUniqueId(){
returnUUID.randomUUID().toString();
}
}

ConsumerApplication
ProjectStructure

pom.xml

<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven4.0.0.xsd"
<modelVersion>4.0.0</modelVersion>

<groupId>com.websystique.spring</groupId>
<artifactId>SpringJMSActiveMQConsumerEx2</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<packaging>jar</packaging>

<name>SpringJMSActiveMQConsumerEx2</name>

<properties>
<springframework.version>4.3.0.RELEASE</springframework.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springcore</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springcontext</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springjms</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemqspring</artifactId>
<version>5.13.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logbackclassic</artifactId>
<version>1.1.7</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>mavencompilerplugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

packagecom.websystique.spring.configuration;

importjava.util.Arrays;

importorg.apache.activemq.spring.ActiveMQConnectionFactory;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.jms.core.JmsTemplate;

@Configuration
publicclassMessagingConfiguration{

privatestaticfinalStringDEFAULT_BROKER_URL="tcp://localhost:61616";

privatestaticfinalStringORDER_RESPONSE_QUEUE="orderresponsequeue";

@Bean
publicActiveMQConnectionFactoryconnectionFactory(){
ActiveMQConnectionFactoryconnectionFactory=newActiveMQConnectionFactory();
connectionFactory.setBrokerURL(DEFAULT_BROKER_URL);
connectionFactory.setTrustedPackages(Arrays.asList("com.websystique.spring","java.util"));
returnconnectionFactory;
}

@Bean
@Bean
publicJmsTemplatejmsTemplate(){
JmsTemplatetemplate=newJmsTemplate();
template.setConnectionFactory(connectionFactory());
template.setDefaultDestinationName(ORDER_RESPONSE_QUEUE);
returntemplate;
}

packagecom.websystique.spring.configuration;

importjavax.jms.ConnectionFactory;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.jms.annotation.EnableJms;
importorg.springframework.jms.config.DefaultJmsListenerContainerFactory;

@Configuration
@EnableJms
publicclassMessagingListnerConfiguration{

@Autowired
ConnectionFactoryconnectionFactory;

@Bean
publicDefaultJmsListenerContainerFactoryjmsListenerContainerFactory(){
DefaultJmsListenerContainerFactoryfactory=newDefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrency("11");
returnfactory;
}

packagecom.websystique.spring.configuration;

importorg.springframework.context.annotation.ComponentScan;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.context.annotation.Import;

@Configuration
@ComponentScan(basePackages="com.websystique.spring")
@Import({MessagingConfiguration.class,MessagingListnerConfiguration.class})
publicclassAppConfig{

//PutOtherApplicationconfigurationhere.

packagecom.websystique.spring.messaging;

importjavax.jms.JMSException;

importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.jms.annotation.JmsListener;
importorg.springframework.messaging.Message;
importorg.springframework.messaging.MessageHeaders;
importorg.springframework.stereotype.Component;

importcom.websystique.spring.model.Product;
importcom.websystique.spring.service.OrderService;

@Component
publicclassMessageReceiver{


staticfinalLoggerLOG=LoggerFactory.getLogger(MessageReceiver.class);
privatestaticfinalStringORDER_QUEUE="orderqueue";

@Autowired
OrderServiceorderService;

@JmsListener(destination=ORDER_QUEUE)
publicvoidreceiveMessage(finalMessage<Product>message)throwsJMSException{
LOG.info("");
MessageHeadersheaders=message.getHeaders();
LOG.info("Application:headersreceived:{}",headers);

Productproduct=message.getPayload();
LOG.info("Application:product:{}",product);

orderService.processOrder(product);
LOG.info("");

packagecom.websystique.spring.messaging;

importjavax.jms.JMSException;
importjavax.jms.Message;
importjavax.jms.ObjectMessage;
importjavax.jms.Session;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.jms.core.JmsTemplate;
importorg.springframework.jms.core.MessageCreator;
importorg.springframework.stereotype.Component;

importcom.websystique.spring.model.InventoryResponse;

@Component
publicclassMessageSender{

@Autowired
JmsTemplatejmsTemplate;

publicvoidsendMessage(finalInventoryResponseinventoryResponse){

jmsTemplate.send(newMessageCreator(){
@Override
publicMessagecreateMessage(Sessionsession)throwsJMSException{
ObjectMessageobjectMessage=session.createObjectMessage(inventoryResponse);
returnobjectMessage;
}
});
}

packagecom.websystique.spring.service;

importcom.websystique.spring.model.Product;

publicinterfaceOrderService{

publicvoidprocessOrder(Productproduct);

packagecom.websystique.spring.service;

importorg.slf4j.Logger;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;

importcom.websystique.spring.messaging.MessageSender;
importcom.websystique.spring.model.InventoryResponse;
importcom.websystique.spring.model.Product;

@Service("orderService")
publicclassOrderServiceImplimplementsOrderService{

staticfinalLoggerLOG=LoggerFactory.getLogger(OrderServiceImpl.class);

@Autowired
MessageSendermessageSender;

@Override
publicvoidprocessOrder(Productproduct){

InventoryResponseresponse=prepareResponse(product);
LOG.info("Inventory:sendingorderconfirmation{}",response);
messageSender.sendMessage(response);
}

privateInventoryResponseprepareResponse(Productproduct){
InventoryResponseresponse=newInventoryResponse();
response.setProductId(product.getProductId());
response.setReturnCode(200);
response.setComment("OrderProcessedsuccessfully");
returnresponse;
}
}

Thatsit.Aswesaw,SPRINGJMSsupportiseasytouse.FeelfreetoComment,andsuggest
improvements.

DownloadSourceCode

ProducerApplication:

DownloadNow!

ConsumerApplication:

DownloadNow!

Вам также может понравиться