Spring下開發消息的發送和接收程序
點對點模式
一、創建生產者項目
1.創建maven項目
2.添加spring-jms、jms規范、activemq依賴
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-apis</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.15.4</version>
</dependency>
</dependencies>
3.創建applicationContext.xml和applicationContext-jms.xml
applicationContext.xml中的配置內容:
<import resource="applicationContext-jms.xml"/>
applicationContext-jms.xml中的配置內容:
<!--創建一個連接工廠-->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!--連接地址-->
<property name="brokerURL" value="tcp://localhost:61616"/>
<property name="userName" value="admin"/>
<property name="password" value="admin"/>
</bean>
<!--jms的操作模板-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<!--配置目的地-->
<property name="defaultDestinationName" value="myQueue"/>
</bean>
4.具體實現接口和類
1>創建dao層接口和類
public interface MessageDao {
public void sendMessage(String message);
}
@Repository
public class MessageDaoImpl implements MessageDao {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMessage(final String message) {
System.out.println("send message start");
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(message);
}
});
}
}
2>創建service層接口和類
public interface MessageService {
public void sendMessage(String message);
}
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private MessageDao messageDao;
public void sendMessage(String message) {
messageDao.sendMessage(message);
}
}
3>創建Test類
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
MessageService messageService = context.getBean("messageServiceImpl",MessageServiceImpl.class);
messageService.sendMessage("發送消息了");
}
}
4>applicationContext.xml文件中添加
<context:component-scan base-package="com.test.activemq"/>
二、創建消費者項目
1.創建maven項目
2.添加spring-jms、jms規范、activemq依賴
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-apis</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.15.4</version>
</dependency>
</dependencies>
3.創建applicationContext.xml和applicationContext-jms.xml
applicationContext.xml中的配置內容:
<import resource="applicationContext-jms.xml"/>
applicationContext-jms.xml中的配置內容:
<!--創建一個連接工廠-->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!--連接地址-->
<property name="brokerURL" value="tcp://localhost:61616"/>
<property name="userName" value="admin"/>
<property name="password" value="admin"/>
</bean>
<!--jms的操作模板-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<!--配置目的地-->
<property name="defaultDestinationName" value="myQueue"/>
</bean>
4.具體實現接口和類
同步方式接收:
1>創建dao層接口和類
public interface MessageDao {
public String receiveMessage();
}
@Repository
public class MessageDaoImpl implements MessageDao {
@Autowired
private JmsTemplate jmsTemplate;
public String receiveMessage(){
String msg = "";
Message message = jmsTemplate.receive();
if (message instanceof TextMessage){
try {
msg = ((TextMessage) message).getText();
} catch (JMSException e) {
e.printStackTrace();
}
}
return msg;
}
}
2>創建service層接口和類
public interface MessageService {
public String receiveMessage();
}
@Service
public class MessageServiceImpl implements MessageService {
@Autowired
private MessageDao messageDao;
public String receiveMessage() {
return messageDao.receiveMessage();
}
}
3>創建Test類
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
MessageService messageService = context.getBean("messageServiceImpl",MessageServiceImpl.class);
String message = messageService.receiveMessage();
System.out.println("接收到的消息是:"+message);
}
}
4>applicationContext.xml文件中添加
<context:component-scan base-package="com.test.jms"/>
三、消費者點對點模式-異步接收
需要使用監聽器
1>創建maven項目
2>添加依賴
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.10.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-apis</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.15.4</version>
</dependency>
</dependencies>
3>創建applicationContext.xml和applicationContext-jms.xml
<!--創建一個連接工廠-->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!--連接地址-->
<property name="brokerURL" value="tcp://localhost:61616"/>
<property name="userName" value="admin"/>
<property name="password" value="admin"/>
</bean>
<!--配置一個spring的jms消息監聽器-->
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="DestinationName" value="springQueue"/>
<property name="messageListener" ref="myMessageListener"/>
</bean>
<bean id="myMessageListener" class="com.test.jms.listener.MyMessageListener"/>
4>創建MyMessageListener類
/**
* 實現消息監聽器
*/
public class MyMessageListener implements MessageListener {
/**
* 當消息監聽器監聽到消息后,會自動回調該onMessage方法
* 并且把監聽到的消息回傳給該方法
* @param message
*/
public void onMessage(Message message) {
if (message instanceof TextMessage){
try {
System.out.println("接收到的消息是:"+((TextMessage) message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
5>創建Test測試類
public class Test {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
}
}
啟動發現可以收到消息 console控制臺打印出來的消息是: 接收到的消息是:發送消息了
發布訂閱模式
同步和異步接收只是針對消費者而言的
發布訂閱模式-同步接收
一、創建生產者
生產者和消費者的都配置成發布訂閱模式
同步接收使用receive()接收
創建生產者需要在點對點模式的基礎上在applicationContext-jms.xml文件中添加:
<!--創建一個連接工廠-->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!--連接地址-->
<property name="brokerURL" value="tcp://localhost:61616"/>
<property name="userName" value="admin"/>
<property name="password" value="admin"/>
</bean>
<!--jms的操作模板-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<!--配置目的地-->
<property name="defaultDestinationName" value="springTopic"/>
<!--pubSubDomain這個property對應模式true代表發布訂閱,false代表點對點,默認是false,-->
<property name="pubSubDomain" value="true"/>
</bean>
同理,消費者也是在點對點模式的基礎上做上述配置,后消費者先啟動,再啟動生產者
發布訂閱模式-異步接收
?在異步基礎上添加發布訂閱的配置(生產者和消費者都需要配置)
<!--創建一個連接工廠-->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!--連接地址-->
<property name="brokerURL" value="tcp://localhost:61616"/>
<property name="userName" value="admin"/>
<property name="password" value="admin"/>
</bean>
<!--jms的操作模板-->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<!--配置目的地-->
<property name="defaultDestinationName" value="springTopic"/>
<property name="pubSubDomain" value="true"/>
</bean>
?
?