0

从 Hibernate Search 3.1.1 开始,当想要将索引实体发送到 JMS 队列以进行进一步处理时,在处理onMessage()方法中 MDB 足以应用强制转换来获取 LuceneWork 列表,例如

List<LuceneWork> queue = (List<LuceneWork>) objectMessage.getObject();

但在 4.2.0 版本中,这不再是一个选项,因为它objectMessage.getObject()返回一个byte[].

我怎么能把它反序列byte[]化成List<LuceneWork>?

我检查了这条消息,发现我有JMSBackendQueueTask.INDEX_NAME_JMS_PROPERTY.

4

1 回答 1

1

您可以扩展AbstractJMSHibernateSearchController并让它处理这些细节,或者查看它的源代码,其中包含:

indexName = objectMessage.getStringProperty(JmsBackendQueueTask.INDEX_NAME_JMS_PROPERTY);
indexManager = factory.getAllIndexesManager().getIndexManager(indexName);
if (indexManager == null) {
    log.messageReceivedForUndefinedIndex(indexName);
    return;
}
queue = indexManager.getSerializer().toLuceneWorks((byte[]) objectMessage.getObject());
indexManager.performOperations(queue, null);

与旧版本 3.x 相比,需要牢记两个主要设计差异:

  • Serializer 服务是可插入的,因此需要查找
  • 每个索引(由名称标识)可以有一个独立的后端

现在(默认情况下)使用 Apache Avro 执行序列化,因为较新的 Lucene 类不可序列化。

于 2013-01-29T08:58:37.267 回答