什么是JMS?
引用百度百科上的说明:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> modelVersion>4.0.0</> groupId>org.springframeworkartifactId>gs-messaging-jmsversion>0.1.0parent> >org.springframework.boot>spring-boot-starter-parent>1.5.8.RELEASEpropertiesjava.version>1.8java.versiondependenciesdependency> >spring-boot-starter-activemq>org.apache.activemq>activemq-broker> >com.fasterxml.jackson.core>jackson-databindbuildpluginsplugin> >spring-boot-maven-plugin> project>
二、编写消息接收器
package hello; public class Email { private String to; private String body public Email() { } public Email(String to, String body) { this.to = to; this.body = body } public String getTo() { return to } public void setTo(String to) { this.to = to } public String getBody() { return body } public void setBody(String body) { this.body = body } @Override public String toString() { return String.format("Email{to=%s,body=%s}",getTo(),getBody()) } }
三、定义消息接收者
package hello; import org.springframework.jms.annotation.JmsListener; org.springframework.stereotype.Component; @Component public class Receiver { @JmsListener(destination = "mailBox",containerFactory = "myFactory") void receiveMessage(Email email) { System.out.println("Received <" + email + ">"); } }
Receiver
也被称为消息驱动的POJO。正如您在上面的代码中所看到的,不需要实现任何特定的接口或方法具有任何特定的名称。此外,该方法可以具有非常灵活的签名。请特别注意,此类在JMS API上没有导入。
四、使用Spring发送和接收JMS消息
javax.jms.ConnectionFactory; org.springframework.boot.SpringApplication; org.springframework.boot.autoconfigure.SpringBootApplication; org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer; org.springframework.context.ConfigurableApplicationContext; org.springframework.context.annotation.Bean; org.springframework.jms.annotation.EnableJms; org.springframework.jms.config.DefaultJmsListenerContainerFactory; org.springframework.jms.config.JmsListenerContainerFactory; org.springframework.jms.core.JmsTemplate; org.springframework.jms.support.converter.MappingJackson2MessageConverter; org.springframework.jms.support.converter.MessageConverter; org.springframework.jms.support.converter.MessageType; @SpringBootApplication @EnableJms Application { @Bean public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); // This provides all boot's default to this factory,including the message converter configurer.configure(factory,connectionFactory); You could still override some of Boot's default if necessary. return factory; } @Bean Serialize message content to json using TextMessage public MessageConverter jacksonJmsMessageConverter() { MappingJackson2MessageConverter converter = MappingJackson2MessageConverter(); converter.setTargetType(MessageType.TEXT); converter.setTypeIdPropertyName("_type"); converter; } static main(String[] args) { Launch the application ConfigurableApplicationContext context = SpringApplication.run(Application.,args); JmsTemplate jmsTemplate = context.getBean(JmsTemplate.); Send a message with a POJO - the template reuse the message converter System.out.println("Sending an email message."); jmsTemplate.convertAndSend("mailBox",1)">new Email("info@example.com","Hello")); } }
@Bean注解,主要作用是控制反转(IOC),同
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
</bean>
举例说明:
例如以Message为例:
@Bean String message() { return new String("hello"); }
它等价于
<bean id="message" class="java.lang.String">
<constructor-arg index="0" value="hello"/>
</bean>
通常情况下,有三种配置Bean的方式:
如图所示
关于Bean注解三种配置法,深入介绍可以参考该博文:https://blog.csdn.net/icarus_wang/article/details/51649635
@EnableJms
触发发现带注释的方法@JmsListener
,在封面下创建消息监听器容器。
为清楚起见,我们还定义了一个在接收器注释中myFactory
引用的bean JmsListener
。因为我们使用DefaultJmsListenerContainerFactoryConfigurer
Spring Boot提供的基础结构,所以JmsMessageListenerContainer
它与默认情况下引导创建的基础结构相同。
默认MessageConverter
是能够转换只有基本类型(例如String
,Map
,Serializable
)我们Email
是不是Serializable
故意的。我们想要使用Jackson并以文本格式将内容序列化为json(即作为a TextMessage
)。Spring Boot将检测a的存在,MessageConverter
并将其与默认值JmsTemplate
和任何JmsListenerContainerFactory
创建者相关联DefaultJmsListenerContainerFactoryConfigurer
。
JmsTemplate
使消息发送到JMS目的地变得非常简单。在main
runner方法中,启动后,您可以使用jmsTemplate
发送Email
POJO。因为我们的自定义MessageConverter
已自动关联到它,所以只会生成一个json文档TextMessage
。
你没看到的两个bean是JmsTemplate
和ConnectionFactory
。这些是由Spring Boot自动创建的。在这种情况下,ActiveMQ代理运行嵌入式。
注意:
Spring JmsTemplate
可以通过它的receive
方法直接接收消息,但这只能同步工作,这意味着它会阻塞。这就是为什么我们建议您使用侦听器容器,例如DefaultMessageListenerContainer
使用基于缓存的连接工厂,这样您就可以异步使用消息并以最大的连接效率。
最后运行结果如下图所示: