日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

EJB 消息驅(qū)動bean 的開發(fā)

系統(tǒng) 2103 0
//-----------------------JMS 消息服務(wù) java message service
    
java消息服務(wù) java messae service 簡稱 JMS ,用于訪問企業(yè)消息系統(tǒng)的中立的API,說白了就是一組API.
企業(yè)消息系統(tǒng)可以協(xié)助應用軟件通過網(wǎng)絡(luò)進行消息交互.

JMS(編程)簡單概括為應用程序A發(fā)送一條消息到消息的服務(wù)器的某個目的Destination,然后消息服務(wù)把消息發(fā)送給應用程序B,因為應用程序A和應用程序B,沒有直接的代碼關(guān)聯(lián).所以兩者實現(xiàn)了解耦.


  

一個message由三個部分組成
    
頭部 heand , 屬性 (property) , 主體 body

消息類型 都派生自Message接口
StreamMessage:一種主體中包含Java元值流的信息,其填充和讀取均按順序進行,

MapMessage:主體包含 組名----值對.沒有定義條目順序

TextMessage: 包含java字符串的信息 例如 XML信息

ObjectMessage:主體包含序列化Java對象的信息

BytesMessage:連續(xù)字節(jié)流的消息
  


消息的傳遞模型

    
傳遞模型:
點對點 :point-to-point  PTP

發(fā)布/訂閱: publish/subscribe  簡稱 PUB/SUB  

兩種區(qū)別如下:

PTP: 規(guī)定了一條消息只能傳遞給一個接受方,目標類型采用javax.jms.Queue 表示

PUB/SUB: 允許 一條消息傳遞給多個接受方,目標類型采用java.jms.Topic表示

這兩種模型都通過擴展公用基類來實現(xiàn),例如 java.jms.Queue 和java.jmx.Topic 都擴展自java.jms.Destination 類


  


開始開發(fā) --> 配置目標隊列地址 -->開發(fā)消息發(fā)送類--->消息接受類

jboss 5.0 是需要個*-service.xml這個一個xml文件來配置目標隊列地址.
編寫好后,拷貝到E:\jboss-6.0.0.Final\server\default\deploy 這就發(fā)布了
    
  <!-- 
   <attribute name="JNDIName">屬性制定了目標地址的全局JNDI名稱,
 默認全局JNDI名稱(如果不制定JNDIName屬性)
jboss會為你生成一個默認全局JNDI名稱有 "queue/" +目標地址的名稱組成

使用之前都必須<depends> 部署應用該服務(wù)器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>  

  

--> 經(jīng)過上面發(fā)布好后 就可以在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>

  


--> 經(jīng)過上面發(fā)布好后 就可以在jmx-console就可以看到了
http://localhost:8989/jmx-console/org.hornetq


EJB 消息驅(qū)動bean 的開發(fā)

開發(fā) PTP 消息發(fā)送對象類
    
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();
			//根據(jù)上下文查找連接工廠該工廠有JMS提供,不需要我們自己創(chuàng)建,每個廠商都為他綁定了一個全局的JDNI,通過他就可以獲取
			QueueConnectionFactory factory=(QueueConnectionFactory)ctx.lookup("ConnectionFactory");
//注意 jboss5.0 為 ctx.lookup("QueueConnectionFactory");

			//ConnectionFactory cf = (ConnectionFactory) ctx.lookup("ConnectionFactory");
			QueueConnection conn=factory.createQueueConnection();
			//根據(jù)連接得到會話
			QueueSession session=conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
			//獲取目標地址
			Destination destination=(Destination)ctx.lookup("/queue/DLQ");
			//獲取消息的發(fā)送者
			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();
		}
	}
}

  


開發(fā)PUB/SUB 消息發(fā)送對象
    
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();
			//根據(jù)上下文查找連接工廠該工廠有JMS提供,不需要我們自己創(chuàng)建,每個廠商都為他綁定了一個全局的JDNI,通過他就可以獲取
			TopicConnectionFactory factory=(TopicConnectionFactory)ctx.lookup("ConnectionFactory");
//注意 jboss5.0 為 ctx.lookup("TopicConnectionFactory");

			//ConnectionFactory cf = (ConnectionFactory) ctx.lookup("ConnectionFactory"); // jboss6.0
			TopicConnection conn=factory.createTopicConnection();
			//根據(jù)連接得到會話
			TopicSession session=conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
			//獲取目標地址
			Destination destination=(Destination)ctx.lookup("/topic/topicA");
			//獲取消息的發(fā)送者
			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();
		}
	}

}

  


//注意 實現(xiàn)? MessageListener? 這個監(jiān)聽接口
開發(fā) queue消息驅(qū)動bean 去讀取消息? (一當被部署到j(luò)boss服務(wù)器中就會去讀取是否有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 {
			//消息發(fā)送者是什么類型就轉(zhuǎn)換成什么類型
			TextMessage msg=(TextMessage)message;
			System.out.println(msg.getText());
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

  



開發(fā) Topic消息驅(qū)動bean 去讀取消息? (需要監(jiān)聽先存在,然后發(fā)送的消息才會被監(jiān)聽到.)
    

//第一個 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>
	<!-- 設(shè)置項目原目錄 -->
	<property name="src.dir" value="${basedir}\src" />
	<!-- 獲取環(huán)境變量 -->
	<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中去 方便   接口和實現(xiàn)的引用 -->
		<pathelement location="${build.dir}"/>
	</path>
	
	
    <target name="prepare" description="創(chuàng)建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="創(chuàng)建EJB發(fā)布包">
        <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="發(fā)布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>

  

EJB 消息驅(qū)動bean 的開發(fā)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 土默特右旗| 乐昌市| 栾城县| 观塘区| 河间市| 遂平县| 永定县| 临洮县| 伊通| 沐川县| 桂平市| 通江县| 邵武市| 和顺县| 垣曲县| 平顶山市| 建水县| 永丰县| 伊春市| 石城县| 泽库县| 鸡东县| 三原县| 城步| 太湖县| 兴仁县| 平山县| 武强县| 淮北市| 黔西县| 忻城县| 讷河市| 沙洋县| 靖州| 玛曲县| 务川| 娄底市| 博罗县| 广饶县| 宝山区| 东方市|