Java Libraries
Use JAR files which are listed below:
activemq-core-5.7.0.jar
activemq-spring-5.12.0.jar
antlr-2.7.7.jar
aopalliance-1.0.jar
aspectjrt-1.8.9.jar
aspectjweaver-1.8.9.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
commons-dbcp2-2.1.1.jar
commons-logging-1.1.3.jar
commons-pool2-2.4.2.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.2.Final.jar
hibernate-core-4.2.5.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
javax.jms-api-2.0.1.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.1.Final.jar
jmxtools-1.2.1.jar
mysql-connector-java-5.1.36.jar
spring-aop-4.2.0.RELEASE.jar
spring-aspects-4.3.3.RELEASE.jar
spring-beans-4.2.0.RELEASE.jar
spring-context-4.2.0.RELEASE.jar
spring-context-support-5.0.0.RELEASE.jar
spring-core-4.2.0.RELEASE.jar
spring-expression-4.2.0.RELEASE.jar
spring-jdbc-4.2.0.RELEASE.jar
spring-jms-4.2.0.RELEASE.jar
spring-messaging-5.0.3.RELEASE.jar
spring-orm-4.2.0.RELEASE.jar
spring-oxm-4.2.0.RELEASE.jar
spring-tx-4.2.0.RELEASE.jar
Create Producer Project
Create Java Project in Eclipse. Right click the project select Build Path\Configure Build Path menu. In Libraries tab, select all jar files above to the project. Besides, we need add appserv-rt library in glassfish4\glassfish\lib folder from GlassFish Server as photo below:
Producer Project Structure
Entities Class
Create entity class: Invoice.java as below:
Invoice.java
package demo.entities;
import java.io.Serializable;
import java.util.Date;
public class Invoice implements Serializable {
private String id;
private String name;
private Date dateCreation;
private double total;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDateCreation() {
return dateCreation;
}
public void setDateCreation(Date dateCreation) {
this.dateCreation = dateCreation;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
}
Spring JMS Configuration File
The Spring configuration shows a context:component-scan that picks up the JMS producer and listener. Then a JMS connection factory is made for the JmsTemplate to use. The template will be used by the producer to send messages.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms.xsd">
<context:component-scan base-package="demo.*"></context:component-scan>
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.sun.enterprise.naming.SerialInitContextFactory
</prop>
<prop key="java.naming.factory.url.pkgs">com.sun.enterprise.naming</prop>
<prop key="java.naming.factory.state">com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
</prop>
<prop key="org.omg.CORBA.ORBInitialHost">localhost</prop>
<prop key="org.omg.CORBA.ORBInitialPort">3700</prop>
</props>
</property>
</bean>
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="jndiName" value="topic_connection_factory"></property>
</bean>
<bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="jndiName" value="spring_jms_topic_destination"></property>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="defaultDestination" ref="destination"></property>
<!-- Topic setting -->
<property name="pubSubDomain" value="true"/>
</bean>
</beans>
Create Message Producer class
This class contains methods to send messages to destination
package demo.spring_jms;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
import demo.entities.Invoice;
@Component("objectMessageProducer")
public class ObjectMessageProducer {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMessage(Invoice invoice) {
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
ObjectMessage objectMessage = session.createObjectMessage();
objectMessage.setObject(invoice);
return objectMessage;
}
});
}
}
Run Application
The program will automatically send the object message every 1 second
package demo.spring_jms;
import java.util.Date;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import demo.entities.Invoice;
public class Main {
public static void main(String[] args) {
try {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
ObjectMessageProducer objectMessageProducer = context.getBean("objectMessageProducer",
ObjectMessageProducer.class);
int i = 1;
while (true) {
Invoice invoice = new Invoice();
invoice.setId("iv" + i);
invoice.setName("Name " + i);
invoice.setDateCreation(new Date());
invoice.setTotal(i);
objectMessageProducer.sendMessage(invoice);
Thread.sleep(1000);
i++;
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
}