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);
並且你的生產者在發送了消息後就關閉了。。。
我在想,消費者沒有確認你就關閉了鏈接。。。。