亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

EJB 消息驅動bean 的開發

系統 1956 0
//-----------------------JMS 消息服務 java message service
    
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


EJB 消息驅動bean 的開發

開發 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>

  

EJB 消息驅動bean 的開發


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本亚洲一区二区三区 | 一级片亚洲 | 日日操综合 | 2021精品综合久久久久 | 天天操天| 成年女人免费看一级人体片 | 丁香婷婷综合网 | 日本中文一区 | 国产精品成人观看视频国产奇米 | 久久久久久综合对白国产 | 超激情碰碰碰啪在线视频 | 成人毛片免费网站 | 午夜视频在线观看国产www | 久青草影院在线观看国产 | 久久国内精品自在自线400部o | 欧美无吗 | 久久国产精品一区 | 免费操片 | 日日摸日日添夜夜爽97 | 精品亚洲一区二区在线播放 | 久久99国产精品亚洲 | 亚洲精品成人a | 亚洲精品日韩一区二区 | 97影院午夜在线观看视频 | 曰本一级毛片 | 国产亚洲精品激情一区二区三区 | 青草香蕉精品视频在线观看 | 亚洲天堂福利视频 | 青青青爽在线视频观看 | 99热99热| 久久机热这里只有精品无需 | 九九热8| 日日日干干干 | 亚洲最新视频在线观看 | 色老成人精品视频在线观看 | 亚洲国产成人综合 | 97视频精品| 久久99热精品免费观看无卡顿 | 在线播放人成午夜免费视频 | 成人亚洲精品一区二区 | 精品久久网站 |