Spring統合JMSによるActiveMQ接続
接続ファクトリの管理
JmsTemplateメッセージを送信および受信するためのテンプレートクラス
MessageListernerメッセージリスナー
ConnectionFactory
Springが提供する接続プール
JmsTemplateはメッセージを送るたびに接続、セッション、producerを再作成します.
SpringではSingleConnectionFactoryとCachingConnectionFactoryが提供されています(SingleConnectionFactoryがキャッシュされています)
JmsTemplateはspringで提供されており、springコンテナにこのクラスを注入するだけでJmsTemplateを使用して操作が容易になりますjms JmsTemplateクラスはスレッドが安全で、アプリケーション全体で使用できます.
MessageListernerは、1つのMessageパラメータのみを受信するonMessageメソッドを実装する
pomファイルに参照orgを追加する.springframework spring-jms ${spring.version}
org.apache.activemq activemq-core 5.7.0 spring-context org.springframework
applicationContext-common.xml
applicationContext-producer.xml
applicationContext-consumer.xml
上のプロファイルでは、このリスナーのプロファイルをデフォルトで追加しました.このリスナーを使用したくない場合は、直接コメントすることができます.
リスナーを使用する効果は、手動でメッセージを受信する効果と同じであることがわかります.
JmsTemplateメッセージを送信および受信するためのテンプレートクラス
MessageListernerメッセージリスナー
ConnectionFactory
Springが提供する接続プール
JmsTemplateはメッセージを送るたびに接続、セッション、producerを再作成します.
SpringではSingleConnectionFactoryとCachingConnectionFactoryが提供されています(SingleConnectionFactoryがキャッシュされています)
JmsTemplateはspringで提供されており、springコンテナにこのクラスを注入するだけでJmsTemplateを使用して操作が容易になりますjms JmsTemplateクラスはスレッドが安全で、アプリケーション全体で使用できます.
MessageListernerは、1つのMessageパラメータのみを受信するonMessageメソッドを実装する
pomファイルに参照orgを追加する.springframework spring-jms ${spring.version}
org.apache.activemq activemq-core 5.7.0 spring-context org.springframework
web.xml
contextConfigLocation
classpath:applicationContext*.xml
applicationContext-common.xml
applicationContext-producer.xml
applicationContext-consumer.xml
package com.imooc.mvcdemo.service.impl;
import com.imooc.mvcdemo.service.ProducerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.jms.*;
/**
* @author Jas
* @create 2018-04-14 9:21
**/
@Service
public class ProducerServiceImpl implements ProducerService {
@Resource(name = "jmsTemplate")
private JmsTemplate jmsTemplate;
public void sendMessage(final String message) {
Destination destination = jmsTemplate.getDefaultDestination();
System.out.println(Thread.currentThread().getName()+" "+destination.toString()+" ---------------------->"+message);
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage(message);
return textMessage;
}
});
System.out.println(" :" + message);
}
public void sendMessage(Destination destination,final String message){
System.out.println(Thread.currentThread().getName()+" "+destination.toString()+" ---------------------->"+message);
jmsTemplate.send(destination, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
}
package com.imooc.mvcdemo.service.impl;
import com.imooc.mvcdemo.service.ConsumerService;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.TextMessage;
/**
* Created by QXJJ1697 on 2018/7/16.
*/
@Service
public class ConsumerServiceImpl implements ConsumerService {
@Resource(name="jmsTemplate")
private JmsTemplate jmsTemplate;
public TextMessage receive(Destination destination){
TextMessage textMessage = (TextMessage) jmsTemplate.receive(destination);
try{
System.out.println(" " + destination.toString() + " :\t"
+ textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
return textMessage;
}
}
package com.imooc.mvcdemo.listener;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* @author Jas
* @create 2018-04-14 10:07
**/
public class ConsumerMessageListener implements MessageListener {
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println(" :" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
package com.imooc.mvcdemo.controller;
import com.imooc.mvcdemo.service.ConsumerService;
import com.imooc.mvcdemo.service.ProducerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.jms.Destination;
import javax.jms.TextMessage;
/**
* Created by QXJJ1697 on 2018/7/16.
*/
@Controller
@RequestMapping("/message")
public class MessageController {
private Logger logger = LoggerFactory.getLogger(MessageController.class);
@Resource(name = "activeMQQueue")
private Destination destination;
//
@Resource(name = "producerServiceImpl")
private ProducerService producer;
//
@Resource(name = "consumerServiceImpl")
private ConsumerService consumer;
@RequestMapping(value = "/SendMessage", method = RequestMethod.POST)
@ResponseBody
public void send(String msg) {
logger.info(Thread.currentThread().getName()+"------------send to jms Start");
//producer.sendMessage(msg);
producer.sendMessage(destination,msg);
logger.info(Thread.currentThread().getName()+"------------send to jms End");
}
@RequestMapping(value= "/ReceiveMessage",method = RequestMethod.GET)
@ResponseBody
public void receive(){
logger.info(Thread.currentThread().getName()+"------------receive from jms Start");
consumer.receive(destination);
logger.info(Thread.currentThread().getName()+"------------receive from jms End");
}
}
上のプロファイルでは、このリスナーのプロファイルをデフォルトで追加しました.このリスナーを使用したくない場合は、直接コメントすることができます.
リスナーを使用する効果は、手動でメッセージを受信する効果と同じであることがわかります.