首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《Spring实战》摘录 - 25

251

Q: #17.2.2-1 | Spring的JmsTemplate会捕获标准的JMSException异常,再以Spring的非检查型异常JmsException子类重新抛出。

A:

代码语言:javascript
复制
左侧是Spring(org.springframework.jms.*), 右侧是标准的JMS(javax.jms.*)

* DestinationResolutionException --- Spring特有的——当Spring无法解析目的地名称时抛出
* IllegalStateException --- IllegalStateException
* InvalidClientIDException --- InvalidClientIDException
* InvalidDestinationException --- InvalidSelectorException
* InvalidSelectorException --- InvalidSelectorException
* JmsSecurityException --- JmsSecurityException
* ListenerExecutionFailedException --- Spring特有的——当监听器方法执行失败时抛出
* MessageConversionException --- Spring特有的——当消息转换失败时抛出
* MessageEOFException --- MessageEOFException
* MessageFormatException --- MessageFormatException
* MessageNotReadableException --- MessageNotReadableException
* MessageNotWriteableException --- MessageNotWriteableException
* ResourceAllocationException --- ResourceAllocationException
* SynchedLocalTransactionFailedException --- Spring特有的——当同步的本地事务不能完成时抛出
* TransactionInprogressException --- TransactionInprogressException
* TransactionRolledBackException --- TransactionRolledBackException
* UncategorizedJmsException --- Spring特有的——当没有其他异常适用时抛出

252

Q: #17.2.2-2 | 为了使用JmsTemplate,我们需要在Spring的配置文件中将它声明为一个bean。如下的XML可以完成这项工作:

A:

代码语言:javascript
复制
<bean id="jmsTemplate"
      class="org.springframework.jms.core.JmsTemplate"
      c:_-ref="connectionFactory" />

253

Q: #17.2.2-3 | JmsTemplate代表发送者来负责处理发送消息的复杂过程,图示

A:

254

Q: #17.2.2-4 | 与其每次发送消息时都指定一个目的地,不如我们为JmsTemplate装配一个默认的目的地。

A:

代码语言:javascript
复制
<bean id="jmsTemplate"
      class="org.springframework.jms.core.JmsTemplate"
      c:_-ref="connectionFactory"
      p:defaultDestinationName="spittle.alert.queue" />

255

Q: #17.2.2-5 | MessageConverter是Spring定义的接口,只有两个需要实现的方法

A:

代码语言:javascript
复制
public interface MessageConverter {
  Message toMessage(Object object, Session session)
                   throws JMSException, MessageConversionException;
  Object fromMessage(Message message)
                   throws JMSException, MessageConversionException;
}

256

Q: #17.2.2-6 | Spring为通用的转换任务提供了多个消息转换器,(所有的消息转换器都位于org.springframework.jms.support.converter包中)

A:

  • MappingJacksonMessageConverter --- 使用Jackson JSON库实现消息与JSON格式之间的相互转换。
  • MappingJackson2MessageConverter --- 使用Jackson 2 JSON库实现消息与JSON格式之间的相互转换。
  • MarshallingMessageConverter --- 使用JAXB库实现消息与XML格式之间的相互转换。
  • SimpleMessageConverter --- 实现String与TextMessage之间的相互转换,字节数组与BytesMessage之间的相互转换,Map与MapMessage之间的相互转换以及Serializable对象与ObjectMessage之间的相互转换。

257

Q: #17.2.2-7 | 如果你想使用JSON消息的话,那么可以声明一个MappingJacksonMessageConverter bean

A:

代码语言:javascript
复制
<bean id="messageConverter"
      class="org.springframework.jms.support.converter.MappingJacksonMessageConverter" />

258

Q: #17.2.2-8 | 使用JmsTemplate接收消息

A:

代码语言:javascript
复制
public Splittle receiveSplittleAlert(){
    try{
        ObjectMessage receiveMessage = (ObjectMessage) jmsOperations.reveive(); //接收消息
        return (Splittle) reveiveMessage.getObject(); //获得对象
    } catch (JMSException jmsException) {
        throw JmsUtils.convertJmsAccessException(jmsException); //抛出转换后的异常
    }
}

使用JmsTemplate从主题或队列中接收消息的时候,只需要简单地调用receive()方法。JmsTemplate会处理其他的事情。

259

Q: #17.2.3-1 | Spring MDP异步接收和处理消息

A:

代码语言:javascript
复制
package com.habuma.spittr.alerts;
import com.habuma.spittr.domain.Spittle;
public class SplittleAlertHandler {
    public void handleSpittleAlert(Spittle spittle){
        //   implemention goes here...
    }
}

260

Q: #17.2.3-2 | 消息监听器容器,是什么?

A: 消息监听器容器(message listener container)是一个特殊的bean,它可以监控JMS目的地并等待消息到达。一旦有消息到达,它取出消息,然后把消息传给任意一个对此消息感兴趣的消息监听器。如图17.7展示了这个交互过程。

消息监听器容器监听队列和主题。当消息到达时,消息将转给消息监听器(例如消息驱动的POJO)。

下一篇
举报
领券