1. ActiveMQ 消费者能控制消息队列的消息是否删除吗
我就放队列里发,就是不管,处理 完 消息 后,一般不知道 ActiveMQ 发消息 是异步的,你收不没收到。 所以消息 消息掉了 ,再 还一个消息给 发送端, 因此 可以 让 接收 消息 端
2. ActiveMQ 多个队列一个消费者 怎么接收信息
一、WebSphere MQ命令行命令 1、停止队列管理器 endmqm [-z] [([-c -w -i -p] [-r] [-s]) -x] QMgrName endmqm mqm_name 使用默认选项停止队列管理器需要等待当前的应用连接完成并断开。 -i 立即停止队列管理器。 -w 需要等待所有的应用停止以后才会真正关闭队列管理器 -p 使用以上参数都无法正常停止队列管理器的情况下可以使用该参数 2、启动队列管理器 strmqm [-z] [-a -c -r -x] [-d noneminimalall] [-f] [-ns] QMgrName 队列管理器必须在完全停止时才能被启动。 3、创建队列管理器 crtmqm [-z] [-q] [-c Text] [-d DefXmitQ] [-h MaxHandles] [-md DataPath] [-g ApplicationGroup] [-t TrigInt] [-u DeadQ] [-x MaxUMsgs] [-lp LogPri] [-ls LogSec] [-lc -ll] [-lf LogFileSize] [-ld LogPath] QMgrName 队列管理器名大小写敏感且不支持空字符串,长度为48字节,同一网络中不能有重名。 创建队列管理器的时侯最好创建死信队列用于存放无法发送的信息,保证通道不会因为无法发送信息而被关闭。 crtmqm -u deadq_name mqm_name 4、删除队列管理器 dltmqm [-z] QMgrName 删除队列管理器会完全删除其所拥有的对象和相关信息,并且是不可恢复的。要删除一个队列管理器首先要保证他是停止的。 二、WebSphere MQ Script. (MQSC) commands WebSphere MQ Script. (MQSC) commands是常常用来管理队列管理器对象的。这些对象包括队列管理器本身,队列,名称列表,通道,客户端通道,监听,服务等。使用runmqsc 队列管理名来启动,可以运行单个的命令,也可以通过命令集的脚本来运行。 本地队列管理器的作用是接收远程或本地的信息流,并将本地队列中的信息流取出以供应用程序使用。在做这些工作之前需要定义相关的队列管理器,队列和通道等,而这些工作是由WebSphere MQ Script. (MQSC) commands来完整的。在Windows及Linux环境下也可以通过WebSphere MQ Explorer来完成。 启动WebSphere MQ Script. (MQSC) :runmqsc [-e] [-v] [-w WaitTime [-x] [-m LocalQMgrName]] [QMgrName] runmqsc mqm_name。通过命令runmqsc启动队列管理器的命令服务器。WebSphere MQ Explorer也能完成相同的任务。runmqsc的相关命令有三种运行方式,Verify a command without running it,Run a command on a local queue manager,Run a command on a remote queue manager。runmqsc的相关命令在解释的时候都会以大写来解释,比如DEFINE,ALTER,RESET等。但是这些命令并不是大小写敏感的。每行runmqsc命令最长只能到8个字符,可以通过-或者+连接下一行,-是从下一行的第一个字符开始,+是从下一行的第一个非空字符开始。而且所有命令与平台无关。runmqsc的标准输入是键盘,标准输出时屏幕,我们可以通过<,>重定向。例如从脚本输入命令runmqsc </path/filename.in,将结果重定向到文件runmqsc>/path/filename.out。 1、显示队列管理器属性(DISPLAY QMGR): DISPLAY QMGR显示当前队列管理器的所有属性,也可以使用DISPLAY QMGR 属性名,单独查看当前队列管理器的某个特定属性。 2、 更改队列管理器属性(ALTER QMGR ): ALTER QMGR 用于更改队列管理器的相关属性,例如 ALTER QMGR MAXHANDS(255),这个命令将默认队列管理器的MAXHANDS由256更改为255。 3、创建本地队列(DEFINE QLOCAL ): DEFINE QLOCAL Q_LOCAL_NAME,在创建队列的时候可以定义相关属性的值,如果没有定义则使用默认值。也可以全部使用默认值,最后通过ALTER QLOCAL命令来修改相关属性。在同一个队列管理器中不能有同名的队列,可以使用REPLACE关键字重建已有的队列。 4、修改本地队列属性(ALTER QLOCAL): ALTER QLOCAL Q_LOCAL_NAME NEW_ATTRIBUTE。已经定义了的本地队列可以使用ALTER QLOCAL 命令对其属性进行修改。 5、显示本地队列属性(DISPLAY QLOCAL): DISPLAY QLOCAL Q_LOCAL_NAME ATTRIBUTE。此命令用于显示本地队列的属性,可以使用默认的显示全部属性,也可以显示指定的属性。 6、复制本地队列(DEFINE QLOCAL NEW LIKE OLD): DEFINE QLOCAL NEW LIKE OLD。此命令可以创建一个属性与OLD完全一样的本地队列。当然,我们也可以在语句后面指定属性的详细信息,没有指定的则继承OLD的对应属性,指定了的则使用新的属性。 7、清除本地队列中的消息(CLEAR QLOCAL): CLEAR QLOCAL Q_LOCAL_QUEUE。此命令用于清除本地队列中存储的信息。在清除信息的时候系统不会给出任何提示,而是直接把信息删除。在一下两种情况下不能使用CLEAR QLOCAL,本地队列中存储的有在最近一次队列同步以后未提交的信息,有应用程序打开使用本地此队列。 8、删除本地队列(DELETE QLOCAL): DELETE QLOCAL Q_LOCAL_QUEUE。此命令用于删除本地队列,当本地队列中存在有没有提交的数据此队列不能删除。如果队列中存在数据,且数据是提交了的,可以使用PURGE关键字删除本地队列。例如DELETE QLOCAL (Q_LOCAL_QUEUE) PURGE,在删除的时候可以指定NOPURGE关键字代替PURGE以保护删除的队列中可能存在的已提交数据。 三、PCF commands PCF commands允许管理员通过编程的方式将MQ的日常管理任务集成在程序中。包括创建队列,预定义队列,更改队列管理器等, PCF commands与MQSC锁实现的功能是相同。
3. activemq的topic消息一直都会存在数据库中,为什么不会删除
ActiveMQ另问题要软件能挂掉挂掉怕怕挂掉信息给丢所本节析几种持久化式:、持久化文件ActiveMQ默认支持种搜索式要发消息设置消息持久化打安装目录配置文件:D:\ActiveMQ\apache-activemq\conf\activemq.xml越80行发现默认配置项: 注意使用kahaDB基于文件支持事务消息存储器靠高性能扩展消息存储器 设计初衷使用简单并尽能快KahaDB索引使用transaction log并且所destination使用index测试表明:用于产环境支持1万active connection每connection独立queue该表现已经足矣应付部需求再发送消息候改变第二参数:MsgDeliveryMode.PersistentMessage保存式2种PERSISTENT:保存磁盘consumer消费message删除NON_PERSISTENT:保存内存消费message清除注意:堆积消息太能导致内存溢打产者端发送消息:wps30F4.tmp启消费者端同管理界面查看:wps3105.tmp发现消息等待没持久化ActiveMQ宕机重启消息丢失我现修改文件持久化重启ActiveMQ消费者仍能够收消息
4. activemq的topic消息一直都会存在数据库中,为什么不会删除
activemq的topic消息一直都会存在数据库中,为什么不会删除
ActiveMQ另问题要软件能挂掉挂掉怕怕挂掉信息给丢所本节析几种持久化式:、持久化文件ActiveMQ默认支持种搜索式要发消息设置消息持久化打安装目录配置文件:D:\ActiveMQ\apache-activemq\conf\activemq.xml越80行发现默认配置项
5. ActiveMQ之Destination
Wildcard用来支持名字分层体系,它不是JMS规范的一部分,是ActiveMQ的扩展。
ActiveMQ支持以下三种wildcard:
示例,假设有两个Destination:PRICE.STOCK.NASDAQ.IBM 和 PRICE.STOCK.NYSE.SUNW。那么如下配置通配符:
路径符号替换,将“/"替换".",添加如下插件:
组合队列Composite Destinations 允许用一个虚拟的destination代表多个destinations,这样就可以通过composite destinations在一个操作中同时向多个queue/topic发送消息。 有两种实现方式:
在创建客户端连接的Destination时,多个destination之间采用","分隔。如下:
如果希望不同的Destination的话,需要加前缀“queue://”或者“topic://”。如下
客户端发送示例:
当客户端向“comQueue”发送消息时,消息就会同时发送到"queue.FOO"和“topic.FOO”中。
通过配置selecter来过滤掉不需要的消息,如下:
在启动ActiveMQ的时候如果需要创建Destination的话,可以在activemq.xml中配置:
在ActiveMQ的queue在不使用之后,可以通过web控制台或者JMX方式来删除掉,当然,也可以通过配置,使得broker可以自动探测到无用的队列并删除掉,回收相应资源。
参数说明:
:设置多长时间检查一次,单位是毫秒。
inactiveTimoutBeforeGC : 设置当Destination为空后,多长时间被删除,单位是毫秒。
gcInactiveDestinations :设置删除掉不活动的队列,默认为false。
Destination Options是一种无需扩展JMS API即可向JMS消费者提供扩展配置选项的方法。这些选项使用URL查询语法在创建消费者的目标名称中进行编码。
消费者选项如下:
虚拟destination用来创建逻辑destination,客户端可以通过它来生产和消费消息,它会把消息映射到物理destination。
ActiveMQ支持2种方式:
ActiveMQ中,topic只有在持久订阅下才会持久化消息。JMS持久化订阅者 MessageConsumer 在创建时会生成一个 唯一的 JMS clientID 和一个持久化订阅者的name。 为了符合JMS,对于一个JMSclientID,同一时间,只能有一个活跃的JMS连接,并且,对于一个clientID和订阅者name而言,只有一个消费者可以是活跃的。也就是说,对于给定的topic订阅者来说,只能由一个活跃的进程进行消费。这意味着我们不能实现:
如今,JMS中的队列语义提供了通过多个消费者来实现可靠的负载均衡——允许多线程,进程和机器来处理消息。然后我们就有了成熟而复杂的负载均衡技术,就像Messge Groups一样在维护订单时进行负载均衡和并行化处理。如下图所示,全量的消息先发送到队列,然后再分发给消费者,通过队列来解决负载均衡和故障转移问题。
virtual topic背后的思想是生产者用正常的JMS方式把消息发送到一个topic。消费者可以继续使用JMS标准中的Topic语义。然而,如果 topic 是虚拟的, 订阅一个逻辑topic的消费者可以从一个真实队列中消费,允许多个消费者分布在多个机器上且多线程的进行负载均衡。 例如,假定我们现在有一个叫做 VirtualTopic.Orders 的topic。(前缀 VirtualTopic. 表明这是一个 virtual topic)。
我们希望将orders 发送到系统A 和 系统B。于是,用通常的 rable topics ,我们需要为 clientID_A 和 "A" 创建一个JMS消费者,同时为 clientID_B 和 "B"创建一个JMS消费者。 有了virtual topics 我们可以直接从队列 Consumer.A.VirtualTopic.Orders 中为系统A 消费,或者从队列 Consumer.B.VirtualTopic.Orders 中为系统B 消费。
默认前缀是: VirtualTopic.>
自定义消费虚拟地址默认格式: Consumer. .VirtualTopic.>*
下面的示例演示如何使所有主题成为虚拟主题。下面的示例使用名称“>“”表示“匹配所有主题”,“VirtualTopicConsumers”为消费队列的前缀。
其他的配置参数:
通常情况下,使用网络连接消费者队列。在这种情况下,不要在虚拟主题上桥接任何普通主题消费者,因为任何转发的消息都会再次分散到网络代理上的消费者队列,从而导致消息重复。下面示例展示了如何排除虚拟队列:
ActiveMQ中每个queue中的消息只能被一个consumer消费。然而,有时候你可能希望能够监视生产者和消费者之间的消息流。你可以通过使用Virtual Destinations 来建立一个virtual queue 来把消息转发到多个queues中。但是 为系统中每个queue都进行如此的配置可能会很麻烦。 使用ActiveMQ支持Mirrored Queues。Broker会把发送到某个queue的所有消息转发到一个名称类似的topic,因此监控程序只需要订阅这个mirrored queue topic。为了启用Mirrored Queues,首先要将BrokerService的“useMirroredQueues“属性设置成true,然后可以通过destinationInterceptors设置其它属性,如mirror topic的前缀,缺省是“VirtualTopic.Mirror.”。如下订阅“*.qmirror”的主题就开启了mirrored queue。
http://activemq.apache.org/features
6. activeMQ删除废弃队列
霍尔电压随磁场强度的变化而变化,磁场越强,电压越高,磁场越弱,电压越低,霍尔电压值很小,通常只有几个毫伏,但经集成电路中的放大器放大,就能使该电压放大到足以输出较强的信号。若使霍尔集成电路起传感作用,需要用机械的方法来改变磁场强度。下图所示的方法是用一个转动的叶轮作为控制磁通量的开关,当叶轮叶片处于磁铁和霍尔集成电路之间的气隙中时,磁场偏离集成片,霍尔电压消失。这样,霍尔集成电路的输出电压的变化,就能表示出叶轮驱动轴的某一位置,利用这一工作原理,可将霍尔集成电路片用作用点火正时传感器。霍尔效应传感器属于被动型传感器,它要有外加电源才能工作,这一特点使它能检测转速低的运转情况。
7. ActiveMQ 消息消费者不主动监听消息队列是否有消息,只监听是是否有消息进去消息队列
Queue模式获取之后,消息队列中消息就应该会被删除:
Topic模式 在持久化之后,才可能被拿走之后,依然存在
8. activemq的topic消息一直都会存在数据库中,为什么不会删除
Queue模式获取,消息队列消息应该删除:
Topic模式 持久化,才能拿走,依存
9. 请问ActiveMQ 如何删除指定名字的Topic
activemq 有管理页面
10. 请教jms中queue内消息如何删除3求解答
另写一测试java程序,模拟生产者
运行该web应用和java程序,一切都OK,onMessage方法可以正确接收消息队列中的消息
现在有如下的问题和疑惑:
停止java程序,不再给消息队列中添加数据,然后重启tomcat,Servlet中onMessage方法仍然会把以前消息队列中
的数据又重新显示,我的疑问是,在p2p模式下,queue中的消息何时会被清除,按照我测试的情况发现,并不是有消费者消费
ps:有些文章介绍队列保留着消息,直到它们被消费,这我和的测试结果不一样
一般来说,我们QueueSession session = (QueueSession) connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); arg1:与事物有关,true表示最后提交,false表示自动提交
arg2:表示消息向中间件发送确认通知,这里采用的是自动通知的类型
这个session关联到MessageListener上面我servlet代码如下 public void init() throws ServletException { // TODO Auto-generated method stub try { InitialContext initCtx = new InitialContext(); Context context = (Context) initCtx.lookup("java:comp/env"); ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("jms/NormalConnectionFactory"); Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); Destination destination = (Destination) context.lookup("jms/queue/MyQueue"); System.out.println(destination); MessageConsumer consumer = session.createConsumer(destination); consumer.setMessageListener(this); connection.start(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public void onMessage(Message message) { // TODO Auto-generated method stub TextMessage textMessage = (TextMessage) message; if(textMessage != null) { try { System.out.println("收到的消息为:" + textMessage.getText()); System.out.println("收到的消息ID为:" + textMessage.getJMSMessageID()); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println("没收到消息"); } }问题补充:beneo 写道queueSession是如何设置的呢?这个session关系到了事物和握手方式
一般来说,我们QueueSession session = (QueueSession) connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE); arg1:与事物有关,true表示最后提交,false表示自动提交
arg2:表示消息向中间件发送确认通知,这里采用的是自动通知的类型
这个session关联到MessageListener上面java生产者程序代码如下
public static void main(String[] args) throws JMSException { ConnectionFactory factory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,ActiveMQConnection.DEFAULT_PASSWORD,"tcp://127.0.0.1:61616"); Connection connection = factory.createConnection(); connection.start(); Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("MY.TEST.FOO.QUEUE"); MessageProcer messageProcer = session.createProcer(destination); messageProcer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); sendMsg(destination,session, messageProcer); session.commit(); connection.close(); } public static void sendMsg(Destination destination, Session session,MessageProcer messageProcer) throws JMSException { TextMessage msMessage = session.createTextMessage("Hello ActiveMQ"); messageProcer.send(msMessage); System.out.println("发送信息成功"); } 问题补充:我的意思是,当我运行生产者java程序给消息队列添加数据后,启动tomcat,确实可以打印添加的消息数据,也就是被servlet消费了,一切都很正常,我认为,该消息队列内的数据被消费成功后,按道理来说,消息队列应该清空被消费的数据,再次启动tomcat,不运行生产者java程序,消息队列应该是无数据可以被消费了,但是,仍然还是打印了第一次消息队列内存放的数据,即消息队列的数据第一次消费后,并没清空,这就让我有了疑惑,有很多资料上都说,p2p消费者消费了数据后,就会被该数据从消息队列中删除,这和我的测试情况不同,请大虾们指教 问题补充:beneo 写道我了解了你的意思。
不过你的session,无论是消费者还是生产者,都是开启了事物
引用Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
并且你的生产者在发送了消息后就关闭了。。。
我在想,消费者没有确认你就关闭了链接。。。。