首页
学习
活动
专区
圈层
工具
发布

《Spring实战》摘录 - 24

241

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:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<bean id="queue"
      class="org.apache.activemq.command.ActiveMQQueue"
      c:_="spitter.queue" />

249

Q: #17.2.1-4 | 下面的<bean>声明定义了一个ActiveMQ主题

A:

代码语言:javascript
复制
<bean id="topic"
      class="org.apache.activemq.command.ActiveMQTopic"
      c:_="spitter.queue" />

230

Q: #17.2.2-5 | 与连接工厂相似的是,ActiveMQ命名空间提供了另一种方式来声明队列和主题。

A:

对于队列,我们可以使用<amq:quence>元素来声明:

代码语言:javascript
复制
<amq:queue id="spittleQueue" physicalName="spittle.alert.queue" />

如果是JMS主题,我们可以使用<amq:topic>元素来声明:

代码语言:javascript
复制
<amq:topic id="spittleTopic" physicalName="spittle.alert.topic" />

不管是哪种类型,都是借助physicalName属性指定消息通道的名称。

下一篇
举报
领券