Apache flex BlazeDS JMS适配器断开连接
我将Blazeds消息传递系统与ActiveMQ集成: 我使用Apache flex BlazeDS JMS适配器断开连接,apache-flex,jms,activemq,jmx,blazeds,Apache Flex,Jms,Activemq,Jmx,Blazeds,我将Blazeds消息传递系统与ActiveMQ集成: 我使用flex.messaging.services.messaging.adapters.JMSAdapter(配置如下)配置BlazeDS以创建一个持久的flex目标 我能够创建一个小应用程序,注册到主题并接收消息。因为我需要接收脱机时发送的消息,所以我创建了一个持久查询 只要我正确地取消flex消费者的订阅,一切都正常 我的问题是当flex消费者不调用unsubscribe时。比如我 关闭浏览器 在这种情况下,主题仍然处于活动状态(我
flex.messaging.services.messaging.adapters.JMSAdapter
(配置如下)配置BlazeDS以创建一个持久的flex目标
我能够创建一个小应用程序,注册到主题并接收消息。因为我需要接收脱机时发送的消息,所以我创建了一个持久查询
只要我正确地取消flex消费者的订阅,一切都正常
我的问题是当flex消费者不调用unsubscribe时。比如我
关闭浏览器
在这种情况下,主题仍然处于活动状态(我可以从ActiveMQ web控制台看到它),并且它使用消息
当我再次连接flex应用程序的新实例时,连接正常,但我没有收到任何消息。也不是我不在的时候送来的,也不是新的。
我甚至无法使用ActiveMQ web控制台删除该主题:javax.jms.JMSException:持久消费者正在使用中
唯一的解决方案是删除主题,即重新启动包含BlazeDS代理的Web应用程序
有人能给我另一个解决办法吗
这是我的blazeds配置
<adapters>
<adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true" />
<adapter-definition id="jms" class="flex.messaging.services.messaging.adapters.JMSAdapter"/>
</adapters>
...
<destination id="warehouse-topic-jms">
<properties>
<jms>
<destination-type>Topic</destination-type>
<message-type>javax.jms.ObjectMessage</message-type>
<connection-factory>java:comp/env/jms/flex/TopicConnectionFactory</connection-factory>
<destination-jndi-name>java:comp/env/jms/warehouse</destination-jndi-name>
<delivery-mode>PERSISTENT</delivery-mode>
<message-priority>DEFAULT_PRIORITY</message-priority>
<acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode>
<initial-context-environment>
<property>
<name>Context.INITIAL_CONTEXT_FACTORY</name>
<value>org.apache.activemq.jndi.ActiveMQInitialContextFactory</value>
</property>
<property>
<name>Context.PROVIDER_URL</name>
<value>tcp://localhost:61616</value>
</property>
</initial-context-environment>
</jms>
<server>
<durable>true</durable>
</server>
</properties>
<adapter ref="jms"/>
</destination>
...
话题
javax.jms.ObjectMessage
java:comp/env/jms/flex/TopicConnectionFactory
java:comp/env/jms/warehouse
持久的
默认优先级
自动应答
Context.INITIAL\u Context\u工厂
org.apache.activemq.jndi.ActiveMQInitialContextFactory
Context.PROVIDER\u URL
tcp://localhost:61616
真的
这是用于公开JNDI资源的Tomcat上下文
<Resource name="jms/flex/TopicConnectionFactory"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="tcp://localhost:61616"
brokerName="myBroker"/>
<Resource name="jms/warehouse"
type="org.apache.activemq.command.ActiveMQTopic"
description="warehouse.topic"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="warehouse.topic"/>
这是我的flex消费者
<mx:Consumer id="consumer"
channelConnect="consumer_channelConnectHandler(event)"
channelFault="consumer_channelFaultHandler(event)" destination="warehouse-topic-jms"
fault="consumer_faultHandler(event)" message="consumer_messageHandler(event)"/>
我找到的唯一解决方案是使用BlazeDS公开的JMX MBEAN强制JMSAdapter删除ActiveMQ主题。 通过这种方式,我可以用相同的clientID重新创建一个新主题并接收消息 这里是我实现的Java方法的代码
public boolean deleteTopicQueue(String clientId) throws Exception {
if(clientId==null){
throw new Exception("Error removing topic: null name provided");
}
clientId=clientId.trim();
JMXServiceURL url = new JMXServiceURL(DEFAULT_JMX_ADAPTER_URL);
try (JMXConnector jmxc = JMXConnectorFactory.connect(url, null)){
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
ObjectName pattern = new ObjectName(DEFAULT_JMSADAPTER_MEAN_QUERY);
Set<ObjectName> names =
new TreeSet<ObjectName>(mbsc.queryNames(pattern, null));
if(names.size()<=0){
logger.info("Error Removig topic "+clientId+": No JMSAdapter found ");
throw new Exception("Error Removig topic "+clientId+": No JMSAdapter found ");
}
while(names.iterator().hasNext()){
ObjectName ob = names.iterator().next();
JMSAdapterControlMBean obProxy = JMX.newMXBeanProxy(mbsc, ob,JMSAdapterControlMBean.class);
String[] consumerList= obProxy.getTopicConsumerIds();
for(String consumer :consumerList){
if(consumer.trim().equals(clientId)){
logger.info("Removing "+consumer+" from "+ob.getCanonicalName());
obProxy.removeConsumer(consumer);
return true;
}
}
}
logger.debug("No consumer with ID "+clientId+" Found");
return false;
} catch (Exception e) {
logger.info("Error Removig topic "+clientId+": No JMSAdapter found ");
throw new Exception("Error Removig topic "+clientId+" :"+e.getMessage());
}
}
public boolean deleteTopicQueue(字符串clientId)引发异常{
if(clientId==null){
抛出新异常(“删除主题时出错:提供了空名称”);
}
clientId=clientId.trim();
JMXServiceURL=newJMXServiceUrl(默认的JMX适配器url);
try(JMXConnector jmxc=JMXConnectorFactory.connect(url,null)){
MBeanServerConnection mbsc=jmxc.getMBeanServerConnection();
ObjectName模式=新的ObjectName(默认的JMSADAPTER\u MEAN\u查询);
定名=
新树集(mbsc.queryNames(pattern,null));
if(names.size()