这里自己在 192.168.159.136 这台服务器上面启动了一个Activemq
项目中都已经引用了spring的相关pom
activemq和spring进行整合配置需要下面的三个jar包:
<!-- activemq和spring进行集成需要下面三个jar包 --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.15.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.2</version> </dependency>
所以在 配置的 pom.xml文件当中加入下面三个文件
配置下面这样的一个spring配置文件
service-jms.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd" default-autowire="byName">
<!-- 配置activemq的连接工厂 -->
<bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL">
<value>tcp://192.168.159.136:61616</value>
</property>
</bean>
</property>
<property name="maxConnections" value="50"/>
</bean>
<!-- 发送的目的地 -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="spring-queue"/>
</bean>
<!--
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg index="0" value="spring-topic"/>
</bean>
-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/><!-- 连接工厂 -->
<property name="defaultDestination" ref="destination"/><!-- 目的地 -->
<property name="messageConverter"> <!-- 消息转换 -->
<bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/>
</property>
</bean>
<!--
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="destinationTopic"/>
<property name="messageListener" ref="messageListener"/>
</bean>
<bean id="messageListener" class="com.gupao.vip.mic.dubbo.jms.FirstMessageListener"/>
-->
</beans>
编写一段代码测试 activemq的发送消息。
public static void main(String[]args){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("classpath:META-INF/spring/service-jms.xml");
JmsTemplate template = (JmsTemplate) ac.getBean("jmsTemplate");
template.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage();
message.setText("Hello,mic");
return message;
}
});
System.out.println("消息已经发送");
}
运行代码,显示消息已发送。
在另外一个项目中同样也是导入上面的三个maven的jar包,编写一个和上面的 service-jms.xml文件一样的spring配置文件
编写一个消息接收的类:
public class SpringJmsReceiver {
public static void main(String[] args) {
ClassPathXmlApplicationContext context=
new ClassPathXmlApplicationContext(
"classpath:META-INF/spring/service-jms.xml");
/*上面这种是使用 Listener的方式进行消息的接收操作,下面的方式是使用 普通的方式进行MessageListener的接收操作.
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
*/
JmsTemplate jmsTemplate=(JmsTemplate) context.getBean("jmsTemplate");
String msg=(String)jmsTemplate.receiveAndConvert();
System.out.println(msg);
}
}
运行主函数,显示到sender那一边发送过来的消息。
项目源代码地址
https://github.com/q907364606/activemq_and_spring
topic的方式发送接收
如果我们想要用 topic的方式进行activemq的消息交互,我们应该这么做:
在两边的 service-jms.xml文件当中配置
<bean id="destinationTopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg index="0" value="spring-topic"/>
</bean>
两边都加上这样的配置,然后再 jmsTemplate 这个bean为 id的标签中更改defaultDestination这个属性。
然后再进行消息的发送和接收的测试。
在实际的开发当中,我们不可能一直以阻塞的方式接收消息,需要使用非阻塞的方式进行接收。
在消息接收端定义一个Listener如下:
public class SpringJmsListener implements MessageListener{
@Override
public void onMessage(Message message) {
try {
System.out.println(((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
然后再在其项目的 spring-jms.xml文件当中配置一个bean进行依赖注入:
<bean id="messageListener" class="com.gupao.vip.mic.dubbo.jms.SpringJmsListener"/>
运行SpringJMSReceriver,不使用 jmsTemplate进行消息的接收,使用MessageListener的方式,这样然后sender那端一直发送消息,可以一直监听到消息。