Q: #17.1.1-1 | 在异步消息中有两个主要的概念:消息代理(message broker)和目的地(destination) A: 当一个应用发送消息时,会将消息交给一个消息代理。消息代理实际上类似于邮局。消息代理可以确保消息被投递到指定的目的地,同时解放发送者,使其能够继续进行其他的业务。
242
Q: #17.1.1-2 | 尽管不同的消息系统会提供不同的消息路由模式,但是有两种通用的目的地。 A: 队列(queue)和主题(topic)
243
Q: #17.1.1-3 | 点对点消息模型,是什么? A: 在点对点模型中,每一条消息都有一个发送者和一个接收者,如图所示。当消息代理得到消息时,它将消息放入一个队列中。当接收者请求队列中的下一条消息时,消息会从队列中取出,并投递给接收者。因为消息投递后会从队列中删除,这样就可以保证消息只能投递给一个接收者。
244
Q: #17.1.1-4 | 发布—订阅消息模型,是什么? A: 在发布—订阅消息模型中,消息会发送给一个主题。与队列类似,多个接收者都可以监听一个主题。但是,与队列不同的是,消息不再是只投递给一个接收者,而是主题的所有订阅者都会接收到此消息的副本,如图17.4所示。
245
Q: #17.1.2 | 采用同步通信机制访问远程服务的客户端存在几个限制,最主要的是: A:
246
Q: #17.2.1-1 | 如果这些限制正是你所担心的,那你可能很想知道异步通信是如何解决这些问题的。 A:
<bean id="connectionFactory"
class="org.apache.activemq.spring.ActiveMQConnectionFactory"
p:brokerURL="tcp://localhost:61616"/>
247
Q: #17.2.1-2 | 配置连接工厂还有另外一种方式,既然我们知道正在与ActiveMQ打交道,那我们就可以使用ActiveMQ自己的Spring配置命名空间来声明连接工厂(适用于ActiveMQ 4.1之后的所有版本)。首先,我们必须确保在Spring的配置文件中声明了amq命名空间。
A:
<?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:jms="http://www.springframework.org/schema/jms"
xmlns:amq="http://activemq.apache.org/schema/core"
xsi:schemaLocation="http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
...
</beans>
248
Q: #17.2.1-3 | 下面的<bean>声明定义了一个ActiveMQ队列 A:
<bean id="queue"
class="org.apache.activemq.command.ActiveMQQueue"
c:_="spitter.queue" />
249
Q: #17.2.1-4 | 下面的<bean>声明定义了一个ActiveMQ主题
A:
<bean id="topic"
class="org.apache.activemq.command.ActiveMQTopic"
c:_="spitter.queue" />
230
Q: #17.2.2-5 | 与连接工厂相似的是,ActiveMQ命名空间提供了另一种方式来声明队列和主题。
A:
对于队列,我们可以使用<amq:quence>元素来声明:
<amq:queue id="spittleQueue" physicalName="spittle.alert.queue" />
如果是JMS主题,我们可以使用<amq:topic>元素来声明:
<amq:topic id="spittleTopic" physicalName="spittle.alert.topic" />
不管是哪种类型,都是借助physicalName属性指定消息通道的名称。