首先在做任何技术预研的时候:我会搞清除它是什么?为什么要使用它?
JMS 它是什么?
Java Message Service是一组接口和相关语义,他定义了JMS客户如何访问企业消息产生的功能。
JMS支持消息中间件的两种传递模式:点到点模式(point to point)和发布-订阅模式(pub/sub)。
JMS消息模型:
消息头(header):JMS消息头包含了许多字段,它们是消息发送后由JMS提供者或消息发送者产生,用来表示消息、设置优先权和失效时间等等,并且为消息确定路由。
属性(property):由消息发送者产生,用来添加删除消息头以外的附加信息。
消息体(body):由消息发送者产生,JMS中定义了5种消息体:ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。
为什么要使用JMS?
- 消息是一个分布式的低耦合通讯方案,生产者A发送一个消息到agent,消费者B去agent上获取消息,但是A,B不需要同时到agent上去注册,agent提供高效率的通讯服务。
- 安全。因为AB不关联,使得其中一方的重启、退出等不至于影响到另一方。
- 对消息的完整性判断,消息不需要遵照严格的事物要求,可以丢失。
目前我所接触的系统大都是每人开发一个模块,然后用HTTP接口访问。有多个用户注册的入口,用户注册事件也分配到不同的代码里,看起来相当的不舒服,所以决定用JMS来处理事件触发后的逻辑,降低系统的耦合,也方便开发修改代码。
- ActiveMQ的安装以及配置,这里就不多做介绍了,大家可以网上查找资料搞定。
- 下面是ActiveMQ与Spring集合时的配置文件:
3. 消息监听处理类(消费者):
import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.springframework.stereotype.Component;
import com.getop.sales.service.JmsBusinessService;
/**
*@ClassName: TopicReceiver
*@Description: 消息监听器,注意要实现MessageListener
*/
@Component
public class TopicReceiver implements MessageListener {
// service接口
@Resource
private JmsBusinessService jmsBusinessService;
// 重写onMessage方法
@Override
public void onMessage(Message message) {
try {
System.out.println("TopicReceiver接收到消息:" + ((TextMessage) message).getText());
boolean financialFlag = false;
boolean loanFlag = false;
// 当消息体为:TextMessage 做出的操作
if (message instanceof TextMessage) {
// 理财客户
financialFlag = jmsBusinessService.modifyFinancialUserByTypes(((TextMessage) message).getText());
if (financialFlag)
System.out.println("理财客户状态->有效->已更改为:待分配.");
// 个贷客户 + Follow、newFollowUserId
loanFlag = jmsBusinessService.modifyLoanUserByTypes(((TextMessage) message).getText());
if (loanFlag)
System.out.println("个贷客户状态->有效->已更改为:待分配.");
} else
// 当消息体为:MapMessage 做出的操作
if (message instanceof MapMessage) {
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}