首页 > 解决方案 > Axon 框架 - GZIP JSON 数据

问题描述

在 Axon和Axon 上JacksonSerializer实现GZIP 压缩装饰器的最简单方法是什么?在将事件作为 BLOB 保存到 MySQL 之前,我正在尝试 GZIP JSON 消息。EventsMessages

我尝试像这样实现装饰器:

public class GzipSerializer implements Serializer {

  private Serializer serializer;
  ...

然后使用以下方式配置它:

  @Autowired
  public void serializerConfiguration(Configurer configurer) {
    Serializer defaultSerializer = new GzipSerializer(JacksonSerializer.defaultSerializer());
    configurer.configureSerializer(configuration -> defaultSerializer)
        .configureMessageSerializer(configuration -> defaultSerializer)
        .configureEventSerializer(configuration -> defaultSerializer);
  }

但它似乎不起作用。是否有一些更简单的方法(或者可能已经实现的功能)?

标签: javacqrsevent-sourcingaxon

解决方案


看来您正在使用 Spring(Boot?)来连接您的应用程序。在这种情况下,定义/覆盖序列化程序的方法是声明 bean:

@Primary  // <-- Use the Primary annotation for the generic serializer. This makes sure spring returns this instance when no specific qualifier is provided
@Bean
public Serializer serializer() {
  return new GzipSerializer(....);
}

我们建议仅将基于 Jackson 的序列化程序用于消息,因为其他一些对象结构与 Jackson 的期望不符。例如,聚合(用于快照)和 Sagas 不太可能满足这些期望。

您可以为消息定义序列化程序,如下所示:

@Qualifier("messageSerializer") // <-- this qualifier tells Axon you intend to use this to serialize messages (incl. events)
@Bean
public Serializer serializer() {
  return new GzipSerializer(....);
}

推荐阅读