銆銆 Spring妗嗘灦鍒欑畝鍖栦簡浣跨敤JEE緇勪歡(鍖呮嫭JMS)鐨勪換鍔°傚畠鎻愪緵鐨勬ā鏉挎満鍒墮殣钘忎簡鍏稿瀷鐨凧MS瀹炵幇鐨勭粏鑺傦紝榪欐牱寮鍙戜漢鍛樺彲浠ラ泦涓簿鍔涙斁鍦ㄥ鐞嗘秷鎭殑瀹為檯宸ヤ綔涓紝鑰屼笉鐢ㄦ媴蹇冨浣曞幓鍒涘緩錛岃闂垨娓呴櫎JMS璧勬簮銆?/p>
銆銆 鏈枃灝嗗Spring JMS API浣滀竴涓榪幫紝騫墮氳繃涓涓繍琛屽湪JBoss MQ鏈嶅姟鍣ㄤ笂鐨剋eb渚嬬▼鏉ヤ粙緇嶅浣曚嬌鐢⊿pring JMS API鏉ュ紓姝ュ鐞嗭紙鍙戦佸拰鎺ユ敹錛夋秷鎭傛垜灝嗛氳繃浼犵粺JMS瀹炵幇鍜孲pring JMS瀹炵幇涓よ呴棿鐨勬瘮杈冿紝鏉ュ睍紺轟嬌鐢⊿pring JMS澶勭悊娑堟伅鏄浣曠殑綆鍗曞拰鐏墊椿銆?/p>
銆銆鍦ㄧ幇瀹炰腑錛屽ぇ澶氭暟web璇鋒眰閮芥槸鍚屾澶勭悊鐨勩備緥濡傦紝褰撶敤鎴瘋鐧誨叆涓涓綉绔欙紝棣栧厛杈撳叆鐢ㄦ埛鍚嶅拰瀵嗙爜錛岀劧鍚庢湇鍔″櫒楠岃瘉鐧誨綍鍚堟硶鎬с傚鏋滈獙璇佹垚鍔燂紝紼嬪簭灝嗗厑璁歌鐢ㄦ埛榪涘叆緗戠珯銆傝繖閲岋紝鐧誨綍璇鋒眰鍦ㄤ粠瀹㈡埛绔帴鏀朵互鍚庤鍗蟲椂澶勭悊浜嗐備俊鐢ㄥ崱楠岃瘉鏄彟涓涓悓姝ュ鐞嗙殑渚嬪瓙錛涘彧鏈夋湇鍔″櫒璇佸疄杈撳叆鐨勪俊鐢ㄥ崱鍙鋒槸鏈夋晥鐨勶紝鍚屾椂瀹㈡埛鍦ㄥ笎鎴蜂笂鏈夎凍澶熺殑瀛樻錛屽鎴鋒墠琚厑璁哥戶緇搷浣溿備絾鏄鎴戜滑鎬濊冧竴涓嬪湪欏哄簭澶勭悊緋葷粺涓婄殑鏀粯緇撶畻姝ラ銆備竴鏃︾郴緇熻瘉瀹炶鐢ㄦ埛淇$敤鍗$殑淇℃伅鏄噯紜殑錛屽茍涓斿湪甯愭埛涓婃湁瓚沖鐨勮祫閲戯紝灝變笉蹇呯瓑鍒版墍鏈夌殑鏀粯緇嗚妭钀藉疄銆佽漿璐﹀畬鎴愩傛敮浠樼粨綆楀彲浠ュ紓姝ユ柟寮忚繘琛岋紝榪欐牱瀹㈡埛鍙互緇х畫榪涜鏍告煡鎿嶄綔銆?/p>
銆銆 闇瑕佹瘮鍏稿瀷鍚屾璇鋒眰鑰楄垂鏇撮暱鏃墮棿鐨勮姹傦紝鍙互浣跨敤寮傛澶勭悊銆傚彟涓涓紓姝ュ鐞嗙殑渚嬪瓙鏄紝鍦ㄦ湰鍦拌捶嬈懼鐞嗙▼搴忎腑錛屾彁浜よ嚦鑷姩鎵塊攢緋葷粺錛圓US錛夌殑淇$敤璇鋒眰澶勭悊榪囩▼銆傚綋鍊熸柟鎻愪氦璐鋒鐢寵鍚庯紝鎶墊娂鍏徃浼氬悜AUS鍙戦佽姹傦紝浠ヨ幏鍙栦俊鐢ㄥ巻鍙茶褰曘傜敱浜庤繖涓姹傝姹傚緱鍒板叏闈㈣屽張璇︾粏鐨勪俊鐢ㄦ姤鍛婏紝鍖呮嫭鍊熸柟鐜頒粖鍜岃繃鍘葷殑甯愭埛錛屾渶榪戠殑浠樻鍜屽叾浠栬儲鍔¤祫鏂欙紝鏈嶅姟鍣ㄩ渶瑕佽楄垂杈冮暱鐨勬椂闂達紙鍑犲皬鏃舵垨鐫鏈夋椂鐢氳嚦鏄嚑澶╋級鏉ュ榪欎簺璇鋒眰浣滃嚭鍝嶅簲銆傚鎴風紼嬪簭錛堝簲鐢級瑕佷笌鏈嶅姟鍣ㄨ繛鎺ュ茍鑰楄垂濡傛闀跨殑鏃墮棿鏉ョ瓑寰呯粨鏋滐紝榪欐槸姣棤鎰忎箟鐨勩傚洜姝ら氫俊搴旇鏄紓姝ュ彂鐢熺殑錛涗篃灝辨槸錛屼竴鏃﹁姹傝鎻愪氦錛屽畠灝辮鏀劇疆鍦ㄩ槦鍒椾腑錛屽悓鏃跺鎴風涓庢湇鍔″櫒鏂紑榪炴帴銆傜劧鍚嶢US鏈嶅姟浠庢寚瀹氱殑闃熷垪涓夊嚭璇鋒眰榪涜澶勭悊錛屽茍灝嗗鐞嗗緱鍒扮殑娑堟伅鏀劇疆鍦ㄥ彟涓涓秷鎭槦鍒楅噷銆傛渶鍚庯紝瀹㈡埛绔▼搴忎粠榪欎釜闃熷垪涓夊嚭澶勭悊緇撴灉錛岀揣鎺ョ潃澶勭悊榪欎釜淇$敤鍘嗗彶鏁版嵁銆?/p>
銆銆 濡傛灉鎮ㄤ嬌鐢ㄨ繃JMS浠g爜錛屾偍浼氬彂鐜板畠涓嶫DBC鎴朖CA寰堝儚銆傚畠鎵鍖呭惈鐨勬牱鏈唬鐮佸垱寤烘垨JMS璧勬簮瀵硅薄鍥炴函錛屼嬌寰楁瘡涓嬈℃偍闇瑕佸啓涓涓柊綾繪潵鍙戦佸拰鎺ユ敹娑堟伅鏃訛紝閮藉叿鏈夋洿濂界殑浠g爜瀵嗛泦鎬у拰閲嶅鎬с備互涓嬪簭鍒楁樉紺轟簡浼犵粺JMS瀹炵幇鎵鍖呮嫭鐨勬楠わ細
鎮ㄥ彲浠ョ湅鍒幫紝姝ラ6鏄鐞嗘秷鎭殑鍞竴鍦版柟銆傚叾浠栨楠ら兘鍙槸綆$悊涓庡疄闄呬笟鍔¤姹傛棤鍏崇殑JMS璧勬簮錛屼絾鏄紑鍙戜漢鍛樺繀欏葷紪鍐欏茍緇存姢榪欎簺棰濆姝ラ鐨勪唬鐮併?/p>
銆銆 Spring妗嗘灦鎻愪緵浜嗕竴涓ā鏉挎満鍒舵潵闅愯棌Java APIs鐨勭粏鑺傘侸EE寮鍙戜漢鍛樺彲浠ヤ嬌鐢↗DBCTemplate鍜孞NDITemplate綾繪潵鍒嗗埆璁塊棶鍚庡彴鏁版嵁搴撳拰JEE璧勬簮錛堟暟鎹簮錛岃繛鎺ユ睜錛夈侸MS涔熶笉渚嬪銆係pring鎻愪緵JMSTemplate綾伙紝鍥犳寮鍙戜漢鍛樹笉鐢ㄤ負涓涓狫MS瀹炵幇鍘葷紪鍐欐牱鏈唬鐮併傛帴涓嬫潵鏄湪寮鍙慗MS搴旂敤紼嬪簭鏃禨pring鎵鍏鋒湁涓浜涚殑浼樺娍銆?/p>
璇存槑錛氬洜涓哄彧鏄負浜嗘紨紺哄浣曚嬌鐢╯pring緙栧啓jms鐨勫簲鐢紝鎵浠ユ湰渚嬫病鏈変粈涔堝疄闄呯敤閫斻?/p>
紼嬪簭鍔熻兘錛歁essageProducer.java鏍規嵁涓鐢ㄦ埛淇℃伅浜х敓涓涓秷鎭彂閫佸埌 JMS Provider錛涚敱MessageConsumer.java鎺ユ敹銆?/p>
1.鍦↗boss閲岄厤緗甔ML鏂囦歡鍒涘緩涓涓柊鐨凧MS provider銆?br />
鎵撳紑浣嶄簬%JBOSS_HOME%server\default\deploy\jms鏂囦歡澶逛笅鐨刯bossmq-destinations-service.xml鏂囦歡錛屽姞鍏ヤ互涓嬩唬鐮佺墖鏂細
<!-- Register User Send/Receive Queue -->
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=registerUserQueue">
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
<!-- Register User Send/Receive Topic -->
<mbean code="org.jboss.mq.server.jmx.Topic"
name="jboss.mq.destination:service=Topic,name=registerUserTopic">
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
2.鍦╯pring鐨勯厤緗枃浠朵腑閰嶇疆JMS緇勪歡鐨勫叿浣撶粏鑺傘?br />
錛?錛塉NDI涓婁笅鏂囨槸鍙栧緱JMS璧勬簮鐨勮搗濮嬩綅緗紝鍥犳棣栧厛鎴戜滑瑕侀厤緗甁NDI妯℃澘錛?br />
<!-- JNDI涓婁笅鏂?瀹冩槸鍙栧緱JMS璧勬簮鐨勮搗濮嬩綅緗? -->
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
org.jnp.interfaces.NamingContextFactory
</prop>
<prop key="java.naming.provider.url">localhost</prop>
<prop key="java.naming.factory.url.pkgs">
org.jnp.interfaces:org.jboss.naming
</prop>
</props>
</property>
</bean>
娉ㄦ剰錛氭JNDI妯℃澘鐢ㄥ埌浜唎rg.jnp.interfaces.NamingContextFactory鎵浠ヨ鎶?JBOSS_HOME%\client涓嬬殑jbossall-client.jar鍔犲埌浣犵殑欏圭洰鐨刢lasspath涓?br />
錛?錛夐厤緗繛鎺ュ伐鍘傦細
<!-- JMS榪炴帴宸ュ巶 -->
<bean id="jmsConnectionFactory"class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName">
<value>XAConnectionFactory</value>
</property>
</bean>
娉ㄦ剰錛歑AConnectionFactory榪欎釜JNDI鍚嶅瓧鏄湪%JBOSS_HOME%server\default\deploy\jms鏂囦歡澶逛笅鐨刯ms-ds.xml涓畾涔夌殑(瀹冩槸鐢盝Boss鎸囧畾鐨?銆?br />
錛?錛夐厤緗甁msTemplate緇勪歡銆傚湪渚嬬▼涓垜浠嬌鐢↗msTemplate102銆傚悓鏃朵嬌鐢╠efaultDestination灞炴ф潵鎸囧畾JMS鐩爣銆?br />
<!-- JMS妯℃澘閰嶇疆 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="defaultDestination" ref="destination" />
<property name="pubSubDomain">
<value>true</value>
</property>
<!-- 絳夊緟娑堟伅鐨勬椂闂?ms) -->
<property name="receiveTimeout">
<value>30000</value>
</property>
</bean>
娉ㄦ剰錛氬鏋滀嬌鐢╰opic-subscribe(涓婚璁㈤槄)妯″紡錛岃妯℃澘鐨刾ubSubDomain灞炴у間負true;鑻ヤ嬌鐢≒ToP(鐐瑰鐐?妯″紡錛宲ubSubDomain灞炴у間負false鎴栦笉閰嶇疆璇ュ睘鎬с?br />
(4)瀹氫箟涓涓狫MS鐩爣鏉ュ彂閫佸拰鎺ユ敹娑堟伅:
<bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName">
<value>topic/registerUserTopic</value>
</property>
</bean>
(5)閰嶇疆鍙戦佽呭拰鎺ユ敹鑰呯粍浠?
<!-- 娑堟伅鍙戝竷鑰?-->
<bean id="msgProducer" class="com.boco.jms.MessageProducer">
<property name="jmsTemplate" ref="jmsTemplate" />
</bean>
<!-- 娑堟伅鎺ユ敹鑰?-->
<bean id="msgConsumer" class="com.boco.jms.MessageConsumer">
<property name="jmsTemplate" ref="jmsTemplate" />
</bean>
3.鐩稿簲鐨勭被:
(1). User瀵硅薄銆?br />
/**
* User.java
* created on Jul 2, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.dto;
import java.io.Serializable;
/**
* desc: 鐢ㄦ埛淇℃伅 Bean
* @author qiujy
*/
public class User {
private int id;
private String username;
private String password;
private String email;
public User(){}
//浠ヤ笅涓篏etter,setter鏂規硶鐣?br />
......
}
(2).娑堟伅鐢熶駭鑰咃細
/**
* MessageProducer.java
* created on Jul 22, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.jms;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import com.boco.dto.User;
/**
* desc:娑堟伅鐢熶駭鑰?br />
* @author qiujy
*
*/
public class MessageProducer {
/** JMS妯℃澘 */
private JmsTemplate jmsTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate){
this.jmsTemplate = jmsTemplate;
}
public void sendMessage(final User user){
//璋冪敤妯℃澘鐨剆end鏉ュ彂閫佹秷鎭?br />
jmsTemplate.send(new MessageCreator(){
public Message createMessage(Session session) throws JMSException {
//鏋勯犱竴涓鍙戦佺殑娑堟伅
MapMessage message = session.createMapMessage();
message.setInt("id", user.getId());
message.setString("username", user.getUsername());
message.setString("password", user.getPassword());
message.setString("email", user.getEmail());
System.out.println("send success!!");
return message;
}
});
}
}
(3).娑堟伅娑堣垂鑰咃細
/**
* MessageConsumer.java
* created on Jul 22, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.jms;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import org.springframework.jms.core.JmsTemplate;
import com.boco.dto.User;
/**
* desc:娑堟伅娑堣垂鑰?br />
* @author qiujy
*
*/
public class MessageConsumer {
/** JMS妯℃澘 */
private JmsTemplate jmsTemplate;
public void setJmsTemplate(JmsTemplate jmsTemplate){
this.jmsTemplate = jmsTemplate;
}
public User receiveMessage(){
//鍙傛暟涓篋estination鐨凧NDI鍚嶅瓧鍘繪帀鍓嶉潰鐨勬ā寮忕被鍨嬫爣璇?br />
//MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserQueue");
MapMessage msg = (MapMessage)jmsTemplate.receive("registerUserTopic");
User user = new User();
try {
user.setId(msg.getInt("id"));
user.setUsername(msg.getString("username"));
user.setPassword(msg.getString("password"));
user.setEmail(msg.getString("email"));
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return user;
}
}
(4).嫻嬭瘯鐢ㄤ緥錛?br />
//======== 鐢熶駭鑰呮祴璇曠敤渚?===============
/**
* TestMsgProducer.java
* created on Jul 22, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.jms;
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.boco.dto.User;
/**
* desc:
* @author qiujy
*
*/
public class TestMsgProducer extends TestCase {
private ApplicationContext context;
/**
* @param arg0
*/
public TestMsgProducer(String arg0) {
super(arg0);
context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");
}
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Test method for {@link com.boco.jms.MessageProducer#sendMessage(com.boco.dto.User)}.
*/
public void testSendMessage() {
User user = new User();
user.setId(132);
user.setUsername("JMSTest");
user.setPassword("password");
user.setEmail("support@boco.com.cn");
MessageProducer producer = (MessageProducer)context.getBean("msgProducer");
producer.sendMessage(user);
}
}
//============ 娑堣垂鑰呮祴璇曠敤渚?===============
/**
* TestMsgConsumer.java
* created on Jul 22, 2006
* Copyrights 2006 BOCO,Inc. All rights reserved.
*/
package com.boco.jms;
import junit.framework.TestCase;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.boco.dto.User;
/**
* desc:
* @author qiujy
*
*/
public class TestMsgConsumer extends TestCase {
private ApplicationContext context;
/**
* @param arg0
*/
public TestMsgConsumer(String arg0) {
super(arg0);
context = new ClassPathXmlApplicationContext("applicationContext_jms.xml");
}
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
}
/* (non-Javadoc)
* @see junit.framework.TestCase#tearDown()
*/
protected void tearDown() throws Exception {
super.tearDown();
}
/**
* Test method for {@link com.boco.jms.MessageConsumer#receiveMessage()}.
*/
public void testReceiveMessage() {
MessageConsumer consumer = (MessageConsumer)context.getBean("msgConsumer");
User user = consumer.receiveMessage();
assertNotNull(user);
System.out.println( "id========" + user.getId()
+ "\nname======" + user.getUsername()
+ "\npassword==" + user.getPassword()
+ "\nemail=====" + user.getEmail());
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1418938
鍚姩JBOSS鏈嶅姟鍣?鍏堣繍琛孴estMsgConsumer.java;鍐嶈繍琛孴estMsgProducer.java,鍗沖彲鐪嬪埌鎺у埗鍙扮殑杈撳嚭浜?鍢誨樆~~~~~