A. 如何在 JBoss 里配置 IBM MQ
如何在JBoss里安裝、配置WebSphere MQ資源適配器:
安裝WebSphere MQ資源適配器:
從安裝目錄復制wmq.jmsra.rar文件到伺服器的部署目錄中,例如:<安裝路徑>/server/default/deploy。此時資源適配器將會自動選擇伺服器。
安裝WebSphere MQ擴展事務客戶端:
WebSphere MQ擴展事務客戶端允許你使用XA分布式事務,並用客戶端模式連接到WebSphere MQ隊列管理器。要將客戶端安裝在JBoss,需要從安裝目錄復制com.ibm.mqetclient.jar文件到伺服器的lib目錄中,例如<安裝路徑>/server/default/lib。
為你的應用程序配置資源適配器:
WebSphere MQ資源適配器允許你定義一些全局的屬性。在JBoss中JCA出站流的資源定義在-ds.xml文件,名為wmq.jmsra-ds.xml。
此文件的概要如下:
<?xml version="1.0" encoding="UTF-8"?>
<connection-factories>
<!-- mbeans defining JCA administered objects -->
<mbean/>
<!-- JCA Connection factory definitions -->
<tx-connection-factory/>
</connection-factories>
從上可以看出JCA連接工廠的定義在<tx-connection-factory>元素,而且JMS隊列和主題被定義在JCA的管理對象mbean裡面。
簡單的兩個隊列-入站和出站的完整示例如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<connection-factories>
<tx-connection-factory>
<jndi-name>jms/MyAppConnectionFactory</jndi-name>
<rar-name>wmq.jmsra.rar</rar-name>
<use-java-context>true</use-java-context>
<connection-definition>javax.jms.QueueConnectionFactory</connection-definition>
<min-pool-size>8</min-pool-size>
<max-pool-size>36</max-pool-size>
<config-property type="java.lang.String" name="channel">${channel}</config-property>
<config-property type="java.lang.String" name="hostName">${hostName}</config-property>
<config-property type="java.lang.String" name="port">1414</config-property>
<config-property type="java.lang.String" name="queueManager">${queueManager}</config-property>
<config-property type="java.lang.String" name="transportType">CLIENT</config-property>
<config-property type="java.lang.String" name="username">munish</config-property>
<security-domain-and-application>JmsXARealm</security-domain-and-application>
<xa-transaction/>
</tx-connection-factory>
<mbean name="imq.queue:name=MY.APP.INBOUND.QUEUE" code="org.jboss.resource.deployment.AdminObject" >
<attribute name="JNDIName">jms/IncomingQueue</attribute>
<depends optional-attribute-name="RARName">jboss.jca:name='wmq.jmsra.rar',service=RARDeployment</depends>
<attribute name="Type">javax.jms.Queue</attribute>
<attribute name="Properties">
baseQueueManagerName=${queueManager}
baseQueueName=MY.APP.INBOUND.QUEUE
</attribute>
</mbean>
<mbean name="imq.queue:name=MY.APP.OUTBOUND.QUEUE" code="org.jboss.resource.deployment.AdminObject">
<attribute name="JNDIName">jms/OutgoingQueue</attribute>
<depends optional-attribute-name="RARName">jboss.jca:name='wmq.jmsra.rar',service=RARDeployment</depends>
<attribute name="Type">javax.jms.Queue</attribute>
<attribute name="Properties">
baseQueueManagerName=${queueManager}
baseQueueName=MY.APP.OUTBOUND.QUEUE
</attribute>
</mbean>
</connection-factories>
在JBoss啟動腳本中佔位符屬性被定義為:
-Dchannel=MQTEST -DhostName=localhost -DqueueManager=TST_MGR
配置入站消息傳遞:
消息傳遞配置在jboss.xml文件中,這個文件的內容會有所不同,但大致如下:
jboss.xml
<jboss xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee
http://www.jboss.org/j2ee/schema/jboss_5_0.xsd" version="5.0">
<enterprise-beans>
<message-driven>
<ejb-name>MyMessageBean</ejb-name>
<!-- Make sure following System properties are defined in JBoss before deploying the application -->
<activation-config>
<activation-config-property>
<activation-config-property-name>DestinationType</activation-config-property-name>
<activation-config-property-value>javax.jms.Queue</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>destination</activation-config-property-name>
<activation-config-property-value>MY.APP.INBOUND.QUEUE</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>channel</activation-config-property-name>
<activation-config-property-value>${channel}</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>hostName</activation-config-property-name>
<activation-config-property-value>${hostName}</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>port</activation-config-property-name>
<activation-config-property-value>1414</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>queueManager</activation-config-property-name>
<activation-config-property-value>${queueManager}</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>transportType</activation-config-property-name>
<activation-config-property-value>CLIENT</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>username</activation-config-property-name>
<activation-config-property-value>munish</activation-config-property-value>
</activation-config-property>
</activation-config>
<!-- instruct the MDB to use the WebSphere MQ resource adapter -->
<resource-adapter-name>wmq.jmsra.rar</resource-adapter-name>
</message-driven>
</enterprise-beans>
</jboss>
必須指定目標類型和名稱屬性。其他屬性都是可選的,如果省略,將使用其默認值。
一個簡單的MDB定義入站消息如下所示:
/**
* This message driven bean is used to collect asynchronously received messages.
*
* @author Munish Gogna
*/
@MessageDriven(mappedName = "jms/IncomingQueue")
public final class MyMessageBean implements javax.jms.MessageListener {
private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger.getLogger(MyMessageBean.class);
public void onMessage(final javax.jms.Message message) {
LOGGER.info("Received message: " + message);
// TODO - do processing with the message here
}
}
一個簡單的java類發送消息到輸出隊列如下所示:
/**
* This class is used to send text messages to a queue.
*
* @author Munish Gogna
*/
public final class MessageSender {
private static final org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger.getLogger(MessageSender.class);
/**
* A coarse-grained method, nothing fancy. In actual applications please re factor the code and
* handle the exceptions properly.
*
* @throws Exception
*/
public void send(final String message) throws Exception {
if (message == null) {
throw new IllegalArgumentException("Parameter message cannot be null");
}
javax.jms.QueueConnection connection = null;
javax.jms.Session session = null;
try {
javax.naming.Context fContext = new javax.naming.InitialContext();
javax.jms.QueueConnectionFactory fConnectionFactory = (javax.jms.QueueConnectionFactory) fContext
.lookup("java:jms/MyAppConnectionFactory");
connection = fConnectionFactory.createQueueConnection();
session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
final javax.naming.Context jndiContext = new javax.naming.InitialContext();
final javax.jms.Destination destination = (javax.jms.Destination) jndiContext.lookup("jms/OutgoingQueue");
final javax.jms.MessageProcer messageProcer = session.createProcer(destination);
final javax.jms.TextMessage textMessage = session.createTextMessage(message);
messageProcer.send(textMessage);
messageProcer.close();
} catch (Exception nex) {
throw nex;
} finally {
if (session != null) {
try {
session.close();
} catch (JMSException e) {
LOGGER.error("Failed to close JMS session", e);
}
}
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
LOGGER.error("Failed to close JMS connection", e);
}
}
}
}
}
最終RFHUTILC.EXE可用於連接到遠程隊列。
英文鏈接 , OSChina.NET編譯
B. RabbitMQ消息過濾的一個思路
生產者 Procer 向 一個 隊列發送消息,並且為消息打上不同的 Tag。假設這個隊列有 3 個消費者:Consumer #[1:3],Consumer #1 只想消費 tag1 標記的消息,Consumer #2 只想消費 tag2 標記的消息,Consumer #3 只想消費 tag3 標記的消息。
生產者 publish 消息時,將 Tag 保存在 Map<String, Object> 類型的 header 欄位,作為構建 AMQP.BasicProperties 參數
消費者如何告知 Broker 只消費特定 Tag?
假設 Consumer #1 只希望消費帶 tag1 標記的消息,那麼 Consumer #1 可以在向 Broker 請求 Basic.Consume 指令時,捎帶自己期望的 Tag 字元串。Client 在具體生成 consumerTag 時可以用 Tag 關鍵字加上隨機字元串(避免 consumerTag 重復):
消費者通過 Basic.Consume 指令來監聽隊列的消息,這些消費者信息服務端是如何存儲的?
保存在隊列主進程(Pid)的 state 中(具體調試可以通過 sys:get_state(Pid) )
並且隊列進程在初始化時,會進行 consumers 初始化:
consumers 欄位實際由 priority_queue:new() 初始化。當有新的 consumer 注冊到隊列進程,那麼會調用 rabbit_queue_consumers 模塊的 add_consumer 方法來向 priority_queue 添加一個元素;同理當有 consumer下線時,最終也會調用該模塊的 remove_consumer 方法。 priority_queue 完整實現見 附二
Broker 向 Consumer 投遞消息時,底層是通過 rabbit_amqqueue_process 調用 rabbit_queue_consumers 模塊的 deliver 方法。默認採用
從 priority_queue 中獲取一個 QEntry( {ChPid, Consumer} ),然後通過 FetchFun 從隊列中獲取消息,發送到 ChPid(Channel 進程)
在 consumers 不為空的情況下,通過 FetchFun 獲取消息,此時可以獲取該消息的 header,取出 Tag 值(如果消息打了 Tag 標記),然後通過 priority_queue 的 filter/2 方法
在 Pred 實現中,我們可以判斷當前消息 Tag 值是否被包含在 consumerTag 中,從而可以過濾出消費特定 tag 的consumers,最後向這些 consumers 中的一個發送 Message 消息。
附一 (隊列進程 state 中的 consumers 信息例子)
附二 (priority_queue 模塊實現
rabbit_common )
注 :上述思路建議在測試環境測試,考慮到有可能出現的性能問題,作為一個調研也會有很多工作要做,整個過程會涉及 RabbitMQ 服務端源碼改造、編譯、打包( rabbitmq-public-umbrella )以及客戶端的相關改造,如果能實際嘗試下,也會有不小的收獲。
C. linux怎麼 設置 activemq jvm 內存參數
典型JVM參數設置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:設置JVM最大可用內存為3550M。
-Xms3550m:設置JVM促使內存為3550m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配內存。
-Xmn2g:設置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss128k:設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所佔比值為1:4,年輕代占整個堆棧的1/5
-XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6
-XX:MaxPermSize=16m:設置持久代大小為16m。
D. 創建mq隊列 process參數啥意思
在第一台計算機上創建的消息被傳遞到第二台計算機上的隊列 Q1(此隊列被稱為遠程隊列)。要點: 在本教程中,您將使用創建了隊列管理器 QM_APPLE 和本地隊列 Q1 的機器作為接收機器。您將在發送機器上設置隊列管理器和隊列(遠程隊列定義和傳輸隊列)。然後定義消息通道。最後,您將把測試消息放入發送機器,並從接收機器上的隊列獲取該消息。
E. 在windows7環境中activemq-5.1需要配置環境變數嗎
方法/步驟
1、首先,右擊「此電腦」,選擇「屬性」
2、選擇「高級系統設置」
3、選擇「環境變數」
4、選擇「新建」
5、點擊新建後,就會出現這個,變數名為「JAVA_HOME」(復制我引號內的內容就可以了,不含引號,下同),變數值,必須是自己裝jdk時的路徑,比如我的安裝路徑是E:java\jdk\,路徑問題也需要注意
6、接下來找到「CLASSPATH」,沒有的話就「新建」
7、變數名為「CLASSPATH」變數值「.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;」
8、找到Path,對其進行編輯,在其原有變數值前加上「;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;」,加的方法就是這樣的C:變數值
9、記得完成後要點兩個確定
10、最後,就是測試自己配置是否成功了,同時按 R+ WIN(那個windows標志的鍵),輸入cmd
11、進入命令提示符,輸入JAVA,點擊「Enter」,出來這些中文,就行了
12、再輸入JAVAC,點擊「Enter」,出來這些中文就行了。
F. i74712mq用什麼頻率內存
i74712mq頻率內存參數。
顯卡參數
核心顯卡 Intel HD Graphics 4600
顯卡基本頻率 0.40 GHz
顯卡加速頻率 1.15 GHz
內存參數
內存類型 DDR3L-1333 SO-DIMM DDR3L-1600 SO-DIMM
支持最大內存 32 GB
通道數 2
ECC 不支持
G. 2020-07-28 activeMq 兩種模式的測試
activeMq有兩種模式,說下個人理解
activemq 8186 管理埠 61616 默認服務埠
queue隊列模式
topic 主題模式
隊列模式: 生產者生成消息存入隊列,消費者通過監聽隊列的queue消費者負責消費,且每個消息只能消費一次.
應用場景: 登陸成功,記錄日誌/記錄狀態/記錄ip 等的一些列操作,可以非同步執行,相對於來說不須要同步的操作,可以保證操作要求的請求不丟失
主題模式: 生產者生成消息,發布消息,訂閱之後的消費者都可以讀取到發布的消息,並且所有消息均可被多個消費者都消費一次
應用場景: 商城下單成功後,發送一條成功的消息,被日誌系統/庫存系統/物流系統 分別讀取到,並做相應操作
springboot+activemq整合
1 引入pom依賴
<groupId>org.springframework.boot
<artifactId>spring-boot-starter-activemq
<version>1.5.20.RELEASE
<groupId>org.messaginghub
<artifactId>pooled-jms
<version>1.0.4
</dependency>
2 分別編寫 生產者 消費者 配置類
@Component
public class ActiveSend {
@Autowired
private Queuequeue;
@Autowired
private Topictopic;
@Autowired
private ;
public void sendQueue()throws JMSException {
ObjectMessage objectMessage =new ActiveMQObjectMessage();
objectMessage.setObject("nihao");
jmsMessagingTemplate.convertAndSend(queue,objectMessage);
}
public void sendTopic()throws JMSException {
ObjectMessage objectMessage =new ActiveMQObjectMessage();
objectMessage.setObject("nihao");
jmsMessagingTemplate.convertAndSend(topic,objectMessage);
}
}
@Component
public class ActiveListenner {
@JmsListener(destination ="active-queue")
public void reciveQueueMsg(ObjectMessage message)throws JMSException {
System.out.println("收到的消息"+message.getObject().toString());
}
@JmsListener(destination ="active-topic")
public void reciveTopicMsg(ObjectMessage message)throws JMSException {
System.out.println("主題收到的消息"+message.getObject().toString());
}
}
@Configuration
public class ActiveMqConfig {
@Bean
public Queuequeue (){
return new ActiveMQQueue("active-queue");
}
@Bean
public Topictopic (){
return new ActiveMQTopic("active-topic");
}
}
做一下說明,隊列模式/主題模式,都是以配置類中的 關鍵字為判斷對象,且兩種模式不能共存
為了測試什麼呢?
測試隊列模式,是否兩個消費者都消費,且均分
測試主題模式,是否消息產生後,兩個消費者都消費一次
yml 配置:
spring:
jms:
# 默認情況下activemq提供的是queue模式,若要使用topic模式需要配置下面配置
pub-sub-domain:false
# activemq消息隊列
activemq:
broker-url: tcp://172.18.3.180:61616
#是否是內存模式(內置MQ,true是 false否)
in-memory:false
# 等待消息發送響應的時間。設置為0等待永遠
send-timeout: 0
user:'admin'
password:'admin'
packages:
#信任所有的包
trust-all:true
pool:
#是否替換默認的連接池,使用ActiveMQ的連接池需引入的依賴
enabled:false
現在是隊列模式,編寫測試類測試
改變配置 將yml中的配置 pub-sub-domain:false 變為pub-sub-domain:true,開啟主題模式
假如有10個監聽者,那麼主題模式下(topic),一個消息將被消費十次
H. 學python入門應該先學什麼
零基礎情況下,想學一門語言。其實python非常適合初學者入門。相比較其他不少主流編程語言,有更好的可讀性,因此上手相對容易。那麼如何快速掌握python?
設定目標:做 Python 開發除了熟悉語言本身之外,還需要掌握很多相關聯的技能,好比打NBA,你不光要學如何投籃,還要練習力量、技戰術等一整套東西。所以,一個普通Python Web開發工程師需要掌握的技能包括至少一個Web框架,比如:Django、Flask、Tornado,做業務系統必須熟知一種資料庫,還需要對Linux系統的基本操作和常用命令有所了解,因為以後你寫到程序基本上都會運行在Linux平台上。
開發工具:工欲善其事必先利其器,Python IDE層出不窮,推薦Pycharm 和Sublime兩個工具都是免費的,而且它們的學習成本非常低,網上找一篇教程看了基本就能上手,Vim、Emacs這樣的遠古神器還是放以後再去了解吧。
Python3:新手開始總糾結學 Python2 還是 Python3,這種糾結完全就是給自己徒增煩惱,因為它們是同一種語言,只有少部分地方語法不兼容,盡管目前大部分公司還在用Python2,但是Python3逐漸成為主流已是不爭事實,畢竟後者性能方面更佔有優勢。
學習框架:對於剛入門的人,最重要的是培養Ta的學習興趣和信心。有的會擔心自己的基礎知識都那麼薄弱,如何能學好框架呢?其實這個擔心倒是不必,大多數大型的框架都把功能封裝得很完整,定義了一套在自己的框架下做事的「規則」,學習框架更多的是學習這些「規則」,入門倒不需要很深的理論基礎。
I. 怎樣用MQ把消息從一台機器傳到另一台機器
Rabbitmq的配置文件有三個,位於/etc/rabbitmq/, 這三個文件分別是: (1)enabled_plugins, 設置允許的插件列表,該配置文檔的格式為erlang的列表格式如 [rabbitmq_management,rabbitmq_visualiser]. (2)rabbitmq.conf,設置rabbitmq的運行參數。該配置文件中的每個參數為一個erlang的 tuple,結構為{Key,Value}, Key為atom類型, Value為一個term。其中幾個關鍵參數為: tcp_listerners設置rabbimq的監聽埠,默認為[5672]。 disk_free_limit 磁碟低水位線,若磁碟容量低於指定值則停止接收數據,默認值為 {mem_relative, 1.0},即與內存相關聯1:1,也可定製為多少byte. vm_memory_high_watermark,設置內存低水位線,若低於該水位線,則開啟流控機制,默認值是0.4,即內存總量的40%。 hipe_compile 將部分rabbimq代碼用High Performance Erlang compiler編譯
J. RocketMq部分參數實驗
實驗拍攝的圖片就不放了
(1) pullBatchSize :單次從每個隊列中拉取消息的條數(故單次拉取的總數為 pullBatchSize*master總數*該taopic的隊列數,以本次實驗為例,實驗中用到的topic 在每台伺服器共有16個寫隊列,集群共有3台master,所以單次拉取的總數約為 32X3X16=1536條),若要加大這個值則一點更要修改參數:(單次拉取消息數量),默認值為32;還可能涉及到修改:(註:若消息量過大,則可以考慮修改
:一次服務端消息拉取,消息在內存中傳輸允許的最大傳輸字 節,默認為256K
:一次服務消息端消息拉取,消息在磁碟中傳輸允許的最大字 節, 默認為64K
:一次消息服務端消息拉取,消息在磁碟中傳輸允許的最大條 數, 默認為8條)
(2) PullInterval :兩次拉取之間的間隔時間(測試中設為10s)
(3) consumeThreadMin :最小拉取線程數
(4) consumeThreadMax :最大拉取線程數(實驗中發現,線程數並未在最小拉取線程數和最大拉取線程數之間,而是大約等於最小線程數)
(5) consumeMessageBatchMaxSize :每次傳入messageListener#consumeMessage中的消息的條數,被pullBatchSize限制,並且這些消息中要是有一條處理失敗,則全部失敗