简介
Message Infrastructure
开发IntelliJ平台的插件时,可以使用它提供的消息服务,使用Publish/Subscribe模式实现,可以支持消息的广播消费。
内置消息
除了自己新建一个Topic给消费者订阅之外,IntelliJ已经内置了许多的Topic,你可以监听它们来得到某个事件发生后的通知,具体的Topic可以去官网查询:https://plugins.jetbrains.com/docs/intellij/extension-point-list.html#intellij-platform-listeners
设计
消息API有3个重要的组件,类似于你用的其他消息服务:
- Topic : 主题
- Message Bus : 消息总线
- Connection : 连接,消费者需要通过Connection才能订阅Topic
使用方法
消息定义
需要创建一个接口,定义消息的Topic以及消息提供哪些事件,事件取决于你的业务,例如你想弄个用户退出登录通知,你可以定义一个方法为afterLogout(User user)。事件方法由发送者显示调用。
public interface ChangeActionNotifier {
@Topic.ProjectLevel
Topic<ChangeActionNotifier> CHANGE_ACTION_TOPIC =
Topic.create("<topic display name>", ChangeActionNotifier.class);
void beforeAction(Context context);
void afterAction(Context context);
}
监听消息
消费者需要通过连接消息总线后,才能进行订阅某个Topic动作。一般可以把这个操作放在消费者的构造器中。
project.getMessageBus().connect().subscribe(
ChangeActionNotifier.CHANGE_ACTION_TOPIC,
new ChangeActionNotifier() {
@Override
public void beforeAction(Context context) {
// Process 'before action' event.
}
@Override
public void afterAction(Context context) {
// Process 'after action' event.
}
});
除了通过硬编码的方式,从project或者application中获取MesssageBus进行消息监听外,还可以通过配置文件plugin.xml中配置的方式:
<idea-plugin>
<applicationListeners>
<listener class="" topic=""/>/>
</applicationListeners>
<projectListeners>
<listener class="com.demo.listener.ChangeActionNotifierListner" topic="com.demo.message.ChangeActionNotifier"/>/>
</projectListeners>
</idea-plugin>
发布消息
发送者通过消息总线进行发送消息的动作,与一些消息中间件不同的是,消息体不是一些内容,而是发送者在合适时机显示调用消息的事件。
public void produceMessage(Context context) {
ChangeActionNotifier publisher = project.getMessageBus()
.syncPublisher(ChangeActionNotifier.CHANGE_ACTION_TOPIC);
publisher.beforeAction(context);
try {
// do some your business logic
} finally {
publisher.afterAction(context);
}
}
参考文献
https://plugins.jetbrains.com/docs/intellij/messaging-infrastructure.html#publishing-messages