关于JMS Message Pending的问题

前段时间,有同事跟我说客户那边有很多状态为receive的message,这些message只有在JMS Server或 weblogic Server充启之后才能被消费。经过调查后,这个问题可能是weblogic的一个bug,当然也不排除 跟具体环境有关的可能。下面我们来看看问题的根本原因是什么,这种分析有助我们更进一步理解 weblogic JMS的实现。

首先我们看一下什么是receive,receive表示一个message已经被consumer消费,但服务端还没有关于 这个message的ack,所以消息不能从queue中删除, 由于queue中的消息是point-2-point的,所以某个消 息被标为receive后,这个消息自然不能被其他consumer消费。那么这个ack由谁负责发送给Server呢,什 么时候发送呢?这些都由我们创建JMS Session时使用的Ack_mode决定,典型的ack-mode有如下两种:

auto-ack: 自动响应模式,consumer.receive()调用后,如果服务器端发现有可用的message,消息返 回到客户端JMS实现层,在消息返回给客户前,由weblogic client (JMSSession.getAsyncMessageForConsumer(),异步接受,比如MessageListener,或 JMSSession.receiveMessage(),同步接受)层实现直接调用acknowledge()通知服务器端,服务器端收到 ack后,它会负责负责将处于receive的message从物理queue中删除。

client-ack: 客户响应模式,consumer.receive()调用后,客户端收到消息后,客户端程序决定什么 时候发送ack,可以在消息后立即发送,也可以在消息处理成功后发送,ack的发送通过 message.acknowledge()实现。后面的过程和auto-ack相同。

初看这个问题,感觉是ack没有收到,那么什么情况下会出现ack丢失呢?网络问题? 那么客户端或服 务器端的server log应该能够看到异常,客户坚持说没有任何异常。有点不可思议,要了客户的代码,他 们没有代码,实际上他们的应用是基于Spring Framework的,通过简单的配置来实现他们的业务需要,看 了下Spring的相关代码,客户之所以说没有异常,因为Spring catch了服务器端返回的JMSException,并 吃掉了这个异常(即异常没有打印出来),这个异常输出是可以通过Spring的配置来实现。客户配置后, 给了我具体的异常,如下:

时间: 2024-12-31 17:53:47

关于JMS Message Pending的问题的相关文章

关于weblogic中jms message的状态

今天同事问我说,如何处理RECEIVE.VISIBLE的JMS消息?有点懵,之前从没有关注过消息的状态.Weblogic81中,我们是不能看到 destination中的消息的,只能看到当前destination中,有多少message, 有多少pending的message.而92中,我们监控destination的时候,可以看到具体的message,而且message后面会跟一个state string.标题中说的RECEIVE.VISIBLE就是这个state string,其实state

转 一步一步Spring整合JMS

1.1 JMS简介     JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以在特定的时候利用生产者生成一消息,并进行发送,对应的消费者在接收到对应的消息后去完成对应的业务逻辑.对于消息的传递有两种类型,一种是点对点的,即一个生产者和一个消费者一一对应:另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收. 1.2 S

干货--JMS(java消息服务)整合Spring项目案例

Sprng-jms消息服务小项目 所需的包: spring的基础包 spring-jms-xx包 spring-message–xx包 commons-collection-xx包 commons-pool2-xx包 aop切面的包: spring-aop,spring-aspect,aopalliance,aspectjrt.jar,aspectjweaver.jar 配置: 1.配置ConnectionFactory 2.配置jmsTemplate; 3.配置Destination 4.配置

转 JMS 实例讲解

1. JMS基本概念      JMS(Java Message Service) 即Java消息服务.它提供标准的产生.发送.接收消息的接口简化企业应用的开发.它支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型.P2P 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者.     对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取

使用activeMQ实现jms

一:jms介绍         jms说白了就是java message service,是J2EE规范的一部分,跟jdbc差不多,sun只提供了接口,由各个厂商(provider)来进行具体的实现,然后使用者使用他们的jar包进行开发使用即可.        另外在jms的API中,jms传递消息有两种方式,一种是点对点的Queue,还有一个是发布订阅的Topic方式.区别在于:        对于Queue模式,一个发布者发布消息,下面的接收者按队列顺序接收,比如发布了10个消息,两个接收者

JMS 简单实例

使用 ActiveMQ 当做 JMS 提供者,写一个简单的 demo. 主要是模拟一个聊天室的样子,下面是源代码 package com.mycompany.app; import java.io.BufferedReader; import java.io.InputStreamReader; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import jav

jboss EAP 6.2 + Message Drive Bean(MDB) 整合IBM Webshpere MQ 7.5

上一篇我们知道了消息驱动Bean的基本用法,实际大型分布式企业应用中,往往会采用高性能的商业Queue产品,比如IBM Webshpere MQ(目前最新版本是7.5 ),下面讲解下如何在Jboss EAP 6.2 版本上整合Webshpere MQ 7.5   一.修改jboss的standalone-full.xml a) 添加IBM的resource-adapters 找到<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1

Welogic中的JMS(原创)

WebLogic JMS 概述 企业消息传递系统使得应用程序能够通过消息的交换与其他系统之间进行通信.消息是包含协调不同应用程序之间通信所需信息的请求.报告和/或事 件.消息提供了提取级别,使您能够从应用程序代码中分离出有关目标系统的详细信息.Java 消息服务 (JMS) 是用于访问企业消息传递系统的标准 API.尤其是 JMS: 使得共享消息传递系统的 Java 应用程序能够交换消息 通过提供用于创建.发送和接收消息的标准接口简化了应用程序开发 如图中所说明,WebLogic JMS 接受来

MOM系列文章之 - Spring Jms Integration 解读

       前阵子对Spring Jms实现进行了一些扩展,借此机会系统化地研究了一下Spring对JMS的支持,整理成文,希望大家能够喜欢!        本文打算从两个维度(编程API和包结构)进行阐述,希望大家读完,能对Spring在JMS层面上做的事情有一个大致了解.当然喜欢扣细节的朋友,也欢迎提出你的疑惑!     第一部分:编程API        首先,让我们来看下Spring中我们最最经常用到的JmsTemplate,上图