WLS_042:常见故障之十:JMS Queue中的消息被“重复消费”问题

声明:该博文转自http://maping930883.blogspot.com,热爱java,热爱生活

正常情况下,Sender把消息发送到Queue以后,Receiver成功读取之后,Queue中的消息应该不存在了。
但有时,我们会发现消息依然在Queue中存在,这是怎么回事呢?
既然Sender已经把消息发送到Queue中了,表明事务已经成功完成了。因此,问题应该出现在Receiver代码中。
在Receiver代码中,我们重点看init()和onMessage()方法:

1.init()
public void init(Context ctx, String queueName)
throws NamingException, JMSException
{
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
qcon = qconFactory.createQueueConnection();
qsession = qcon.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
queue = (Queue) ctx.lookup(queueName);
qreceiver = qsession.createReceiver(queue);
qreceiver.setMessageListener(this);
qcon.start();
}

注意创建Session时使用的参数是Session.CLIENT_ACKNOWLEDGE,这说明需要明确告诉JMS消息是否接收成功,否则Queue中的消息将一直存在。

2.onMessage()
成功获取消息后,增加语句msg.acknowledge();,表明消息是否接收成功,事务成功完成。

public void onMessage(Message msg)
{
try {
String msgText;
if (msg instanceof TextMessage) {
msgText = ((TextMessage)msg).getText();
} else {
msgText = msg.toString();
}

msg.acknowledge();

} catch (JMSException jmse) {
jmse.printStackTrace();
}
}

3. 如果创建Session时使用的参数是Session.AUTO_ACKNOWLEDGE
该参数的意义是只要onMessage方法成功返回(没有抛出异常),就认为消息成功收到了。此时,不需要在onMessage方法中增加语句msg.acknowledge();。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我认为你想说的是 WLS_MASTER_CLIENT,它是 Windows WLAN API 的一个结构体。WLS_MASTER_CLIENT 结构体定义了一个 WLAN API 的主客户端对象,用于访问 WLAN 服务。WLAN 服务是 Windows 操作系统提供的一个服务,用于管理无线网络连接、扫描无线网络、配置网络安全等操作。WLS_MASTER_CLIENT 结构体的定义如下: ```C typedef struct _WLAN_RAW_DATA { DWORD dwDataOffset; DWORD dwDataSize; BYTE DataBlob[1]; } WLAN_RAW_DATA, *PWLAN_RAW_DATA; typedef struct _WLAN_INTERFACE_CAPABILITY { DWORD dwInterfaceType; DWORD dwSupportedInfraFilter; DWORD dwSupportedAuthInfraPairCipher; DWORD dwSupportedUnicastAlgoPair; DWORD dwSupportedMulticastAlgoPair; DWORD dwSupportedAdhocAuthCipher; DWORD dwSupportedCountryOrRegionStringListSize; WCHAR strSupportedCountryOrRegionStrings[3]; } WLAN_INTERFACE_CAPABILITY, *PWLAN_INTERFACE_CAPABILITY; typedef struct _WLAN_PHY_RADIO_STATE { DWORD dwPhyIndex; DWORD dwSoftwareRadioState; DWORD dwHardwareRadioState; } WLAN_PHY_RADIO_STATE, *PWLAN_PHY_RADIO_STATE; typedef struct _WLAN_INTERFACE_INFO { GUID InterfaceGuid; WCHAR strInterfaceDescription[WLAN_MAX_NAME_LENGTH]; WLAN_INTERFACE_STATE isState; } WLAN_INTERFACE_INFO, *PWLAN_INTERFACE_INFO; typedef struct _WLS_MASTER_CLIENT { DWORD dwReserved; HANDLE hClientHandle; WLAN_INTERFACE_INFO InterfaceInfo; WLAN_RAW_DATA CurrentConnection; WLAN_INTERFACE_CAPABILITY InterfaceCapability; DWORD dwNumberOfPhys; WLAN_PHY_RADIO_STATE PhyRadioState[WLAN_MAX_PHY_INDEX]; } WLS_MASTER_CLIENT, *PWLS_MASTER_CLIENT; ``` WLS_MASTER_CLIENT 结构体包含了 WLAN 接口的信息,如 GUID、接口描述、状态、当前连接等信息,以及接口的能力和无线物理层的状态等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值