//-----------------------JMS 消息服務 java message service
一個message由三個部分組成
消息的傳遞模型
開始開發 --> 配置目標隊列地址 -->開發消息發送類--->消息接受類
jboss 5.0 是需要個*-service.xml這個一個xml文件來配置目標隊列地址.
編寫好后,拷貝到E:\jboss-6.0.0.Final\server\default\deploy 這就發布了
--> 經過上面發布好后 就可以在jmx-console就可以看到了
http://localhost:8989/jmx-console/jboss.mq.destination 中可以看到剛配置JNDI名稱
jboss 6.0 就不需要了,在
E:\jboss-6.0.0.Final\server\default\deploy\hornetq\hornetq-jms.xml 只需要配置一個 queue topic 這個兩個標簽實體
--> 經過上面發布好后 就可以在jmx-console就可以看到了
http://localhost:8989/jmx-console/org.hornetq
開發 PTP 消息發送對象類
開發PUB/SUB 消息發送對象
//注意 實現? MessageListener? 這個監聽接口
開發 queue消息驅動bean 去讀取消息? (一當被部署到jboss服務器中就會去讀取是否有queue類型的消息)
開發 Topic消息驅動bean 去讀取消息? (需要監聽先存在,然后發送的消息才會被監聽到.)
---jndi.properties
--Ant 文件 build
java消息服務 java messae service 簡稱 JMS ,用于訪問企業消息系統的中立的API,說白了就是一組API.
企業消息系統可以協助應用軟件通過網絡進行消息交互.
JMS(編程)簡單概括為應用程序A發送一條消息到消息的服務器的某個目的Destination,然后消息服務把消息發送給應用程序B,因為應用程序A和應用程序B,沒有直接的代碼關聯.所以兩者實現了解耦.
一個message由三個部分組成
頭部 heand , 屬性 (property) , 主體 body
消息類型 都派生自Message接口
StreamMessage:一種主體中包含Java元值流的信息,其填充和讀取均按順序進行,
MapMessage:主體包含 組名----值對.沒有定義條目順序
TextMessage: 包含java字符串的信息 例如 XML信息
ObjectMessage:主體包含序列化Java對象的信息
BytesMessage:連續字節流的消息
消息的傳遞模型
傳遞模型:
點對點 :point-to-point PTP
發布/訂閱: publish/subscribe 簡稱 PUB/SUB
兩種區別如下:
PTP: 規定了一條消息只能傳遞給一個接受方,目標類型采用javax.jms.Queue 表示
PUB/SUB: 允許 一條消息傳遞給多個接受方,目標類型采用java.jms.Topic表示
這兩種模型都通過擴展公用基類來實現,例如 java.jms.Queue 和java.jmx.Topic 都擴展自java.jms.Destination 類
開始開發 --> 配置目標隊列地址 -->開發消息發送類--->消息接受類
jboss 5.0 是需要個*-service.xml這個一個xml文件來配置目標隊列地址.
編寫好后,拷貝到E:\jboss-6.0.0.Final\server\default\deploy 這就發布了
<!--
<attribute name="JNDIName">屬性制定了目標地址的全局JNDI名稱,
默認全局JNDI名稱(如果不制定JNDIName屬性)
jboss會為你生成一個默認全局JNDI名稱有 "queue/" +目標地址的名稱組成
使用之前都必須<depends> 部署應用該服務器DestinationManager -->
<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=jmsQueue">
<attribute name="JNDIName">queue/jmsQueue</attribute>
<depends optional-attribute-name="DestinationManager">
jboss.mq:service=DestinationManager
</depends>
</mbean>
<mbean code="org.jboss.mq.server.jmx.Topic"
name="jboss.mq.destination:service=Topic,name=jmsTopic">
<attribute name="JNDIName">topic/jmsTopic</attribute>
<depends optional-attribute-name="DestinationManager">
jboss.mq:service=DestinationManager
</depends>
</mbean>
</server>
--> 經過上面發布好后 就可以在jmx-console就可以看到了
http://localhost:8989/jmx-console/jboss.mq.destination 中可以看到剛配置JNDI名稱
jboss 6.0 就不需要了,在
E:\jboss-6.0.0.Final\server\default\deploy\hornetq\hornetq-jms.xml 只需要配置一個 queue topic 這個兩個標簽實體
<queue name="DLQ">
<entry name="/queue/DLQ"/>
</queue>
<queue name="ExpiryQueue">
<entry name="/queue/ExpiryQueue"/>
</queue>
<topic name="testTopic">
<entry name="/topic/topicA"/>
</topic>
--> 經過上面發布好后 就可以在jmx-console就可以看到了
http://localhost:8989/jmx-console/org.hornetq
開發 PTP 消息發送對象類
package com.sh.app;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.naming.InitialContext;
public class QueueSender {
public static void main(String [] args){
try {
//初始化JNDI上下文
InitialContext ctx=new InitialContext();
//根據上下文查找連接工廠該工廠有JMS提供,不需要我們自己創建,每個廠商都為他綁定了一個全局的JDNI,通過他就可以獲取
QueueConnectionFactory factory=(QueueConnectionFactory)ctx.lookup("ConnectionFactory");
//注意 jboss5.0 為 ctx.lookup("QueueConnectionFactory");
//ConnectionFactory cf = (ConnectionFactory) ctx.lookup("ConnectionFactory");
QueueConnection conn=factory.createQueueConnection();
//根據連接得到會話
QueueSession session=conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
//獲取目標地址
Destination destination=(Destination)ctx.lookup("/queue/DLQ");
//獲取消息的發送者
MessageProducer producer=session.createProducer(destination);
producer.send(session.createTextMessage("你好,JMS我來了,Queue!"));
session.close();
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
開發PUB/SUB 消息發送對象
package com.sh.app;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.QueueSession;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.naming.InitialContext;
public class TopicSender {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//初始化JNDI上下文
InitialContext ctx=new InitialContext();
//根據上下文查找連接工廠該工廠有JMS提供,不需要我們自己創建,每個廠商都為他綁定了一個全局的JDNI,通過他就可以獲取
TopicConnectionFactory factory=(TopicConnectionFactory)ctx.lookup("ConnectionFactory");
//注意 jboss5.0 為 ctx.lookup("TopicConnectionFactory");
//ConnectionFactory cf = (ConnectionFactory) ctx.lookup("ConnectionFactory"); // jboss6.0
TopicConnection conn=factory.createTopicConnection();
//根據連接得到會話
TopicSession session=conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
//獲取目標地址
Destination destination=(Destination)ctx.lookup("/topic/topicA");
//獲取消息的發送者
MessageProducer producer=session.createProducer(destination);
producer.send(session.createTextMessage("你好,JMS我來了,Topic"));
session.close();
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//注意 實現? MessageListener? 這個監聽接口
開發 queue消息驅動bean 去讀取消息? (一當被部署到jboss服務器中就會去讀取是否有queue類型的消息)
package com.sh.message;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig={
@ActivationConfigProperty(
propertyName="destinationType",
propertyValue="javax.jms.Queue"
),
@ActivationConfigProperty(
propertyName="destination",
propertyValue="/queue/DLQ"
)
})
//jboss 6.0 目標地址類型有"/" 開頭
//jboss 5.0 沒有 "/" 默認為 "queue/地址名稱" 地址名稱==*-sercie.xml中配置的
public class MessageDrivenBean implements MessageListener {
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
try {
//消息發送者是什么類型就轉換成什么類型
TextMessage msg=(TextMessage)message;
System.out.println(msg.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
開發 Topic消息驅動bean 去讀取消息? (需要監聽先存在,然后發送的消息才會被監聽到.)
//第一個 topic 消息
package com.sh.message;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig={
@ActivationConfigProperty(
propertyName="destinationType",
propertyValue="javax.jms.Topic"
),
@ActivationConfigProperty(
propertyName="destination",
propertyValue="/topic/topicA"
)
})
public class ReceiveBean implements MessageListener {
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
try {
TextMessage msg=(TextMessage)message;
System.out.println(this.getClass()+msg.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//第二個類
package com.sh.message;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(activationConfig={
@ActivationConfigProperty(
propertyName="destinationType",
propertyValue="javax.jms.Topic"
),
@ActivationConfigProperty(
propertyName="destination",
propertyValue="/topic/topicA"
)
})
public class ReceiveOtherBean implements MessageListener {
@Override
public void onMessage(Message message) {
try {
TextMessage msg=(TextMessage)message;
System.out.println(this.getClass()+msg.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
---jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
--Ant 文件 build
<?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
2013-2-25 下午1:53:33
project
description
Bin
====================================================================== -->
<project name="MessageDrivenBean" basedir=".">
<description>
description
</description>
<!-- 設置項目原目錄 -->
<property name="src.dir" value="${basedir}\src" />
<!-- 獲取環境變量 -->
<property environment="env"/>
<property name="jboss.home" value="${env.JBOSS_HOME}"/>
<property name="jboss.server.config" value="default"/>
<property name="build.dir" value="${basedir}\build"/>
<!-- 引入 jboss client 下的 所有jar -->
<path id="build.classpath">
<fileset dir="${jboss.home}\client">
<include name="*.jar"/>
</fileset>
<!-- 講編譯過后的路徑加入到 path中去 方便 接口和實現的引用 -->
<pathelement location="${build.dir}"/>
</path>
<target name="prepare" description="創建build目錄">
<delete dir="${build.dir}"/>
<mkdir dir="${build.dir}"/>
</target>
<!-- - - - - - - - - - - - - - - - - -
target: compile
- - - - - - - - - - - - - - - - - -->
<target name="compile" depends="prepare" description="編譯">
<javac srcdir="${src.dir}" destdir="${build.dir}" includeantruntime="false" includes="com/**">
<classpath refid="build.classpath"/>
</javac>
</target>
<!-- =================================
target: ejbjar
================================= -->
<target name="ejbjar" depends="compile" description="創建EJB發布包">
<jar jarfile="${basedir}\${ant.project.name}.jar">
<fileset dir="${build.dir}">
<include name="**/*.class"/>
</fileset>
</jar>
</target>
<!-- =================================
target: deploy
================================= -->
<target name="deploy" depends="ejbjar" description="發布EJB">
<copy file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
</target>
<!-- - - - - - - - - - - - - - - - - -
target: undeploy
- - - - - - - - - - - - - - - - - -->
<target name="undeploy" description="卸載EJB">
<delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar"/>
</target>
</project>
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

