easy-asyn
介绍
一个简单的异步消息推送框架。我们都知道rpc通讯框架是同步的,姑且称之为同步消息框架吧。然而市面上目前并没有专门针对异步消息的框架。作者在长期的开发实践中,发现异步消息几乎是大型应用程序中必不可少的一部分,很多系统会通过mq或者redis等消息中间件来实现异步消息的功能。但是呢,各有各的写法,并没有统一的规范。于是想到了写这样一个小插件来优化开发。
Maven引用(点击 最新版本地址 查看最新版本)
<dependency>
<groupId>io.github.xiaoyudeguang</groupId>
<artifactId>easy-asyn</artifactId>
<version>3.1.8-RELREASE</version>
</dependency>
使用说明
基本功能->异步通讯(默认jms方式(只能在一个应用程序内传递异步消息);如果配置了MQ,则走MQ方式(不同应用程序间传递消息))
发送异步消息
@AysnMsg(todo = "异步消息发送层")
public interface MqSender {
@AysnMsg(value = "自定义消息主题", todo = "发送一条异步消息")
public String sendMsg(String msg);
}
接收异步消息
@EasyBean(todo = { "JMS消息接收器" })
public class MqListener {
private final static Logger logger = LoggerFactory.getLogger(MqListener.class);
@JmsListener(destination = "自定义消息主题", containerFactory = "jmsListenerContainerQueue")
public void onQueueMessage(String msg) {
logger.info("接收到queue消息:{}",msg);
}
}
高级功能->自定义扩展(以redis为例)
发送异步消息
@AysnMsg(todo = "异步消息发送层")
public interface MqSender {
@AysnMsg(value = "自定义消息主题", todo = "发送一条异步消息")
public String sendMsg(String msg);
}
@EasyBean(todo = { "Redis异步消息通讯" })
public class RedisAsynHandler implements IAysnHandler{
@Autowired
private static StringRedisTemplate stringRedisTemplate;
@Override
public Object doSendMsg(String title, String msg) {
stringRedisTemplate.convertAndSend(title, msg);
return "success";
}
}
接收异步消息
@Configuration
public class RedisConfig {
@Autowired(required = false)
private MessageListener listener;
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer() {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(RedisUtils.getConnectionFactory());
container.addMessageListener(listener, new ChannelTopic("自定义消息主题"));
return container;
}
}
@EasyBean(todo = { "接收redis消息" })
public class RedisMsgListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
String key = RedisUtils.deserialize(pattern); //消息通道名称
String msg = RedisUtils.deserialize(message.getBody()); //消息内容
LogUtils.info(this, key + "订阅消息", message);
}
}