从 Hazelcast 访问 Spring 上下文在密钥所有者上执行
Accesing Spring context from Hazelcast executeOnKeyOwner
我在 Hazelcast 中有一个 MultiMap
,每个 String
键都有一个 List<SomeObject>
,我想用
之类的东西来保存每个列表
IExecutorService executorService = hzInstance.getExecutorService("commonExec");
//...
executorService.executeOnKeyOwner(new PersistTask(key), key);
但是 PersistTask
对象需要在 Spring 上下文中定义的另一个对象。如果我理解正确, PersistTask
的实例被创建,然后序列化并发送给密钥所有者并在那里执行。如何引用本地 Spring 上下文?我想我可以尝试静态访问它,但我觉得这样做很肮脏。有没有更好的办法?作为记录,我使用的是 Hazelcast 3.5.3 和 Spring 4.2.3。提前致谢。
Hazelcast 似乎提供了某种依赖注入器。您的对象(在我的例子中,PersistTask
)必须实现 HazelcastInstanceAware
并且它将在反序列化后注入本地 Hazelcast 实例。您可以在可从 Hazelcast 实例检索的用户上下文中添加对象。 The Hazlcast blog 有一个很好的例子。
有一个更好的、更面向对象的解决方案:您可以将注释 @SpringAware
添加到您的 class(在我的例子中是 PersistTask
),它将使用Spring 反序列化后的上下文。所有 Spring 注释和接口(例如 @Autowired
和 InitializingBean
)将被处理并注入依赖项。为此,您必须在 Hazelcast 实例中定义一个 ManagedContext
。 SpringManagedContext
就是您所需要的。这可以在 XML 配置中指定,如下所示:
<hz:hazelcast id="hzexample">
<hz:config>
<hz:spring-aware /> <!-- this line here !!! -->
<hz:instance-name>hzexample</hz:instance-name>
...
官博里的例子是this但是格式不好
我在 Hazelcast 中有一个 MultiMap
,每个 String
键都有一个 List<SomeObject>
,我想用
IExecutorService executorService = hzInstance.getExecutorService("commonExec");
//...
executorService.executeOnKeyOwner(new PersistTask(key), key);
但是 PersistTask
对象需要在 Spring 上下文中定义的另一个对象。如果我理解正确, PersistTask
的实例被创建,然后序列化并发送给密钥所有者并在那里执行。如何引用本地 Spring 上下文?我想我可以尝试静态访问它,但我觉得这样做很肮脏。有没有更好的办法?作为记录,我使用的是 Hazelcast 3.5.3 和 Spring 4.2.3。提前致谢。
Hazelcast 似乎提供了某种依赖注入器。您的对象(在我的例子中,PersistTask
)必须实现 HazelcastInstanceAware
并且它将在反序列化后注入本地 Hazelcast 实例。您可以在可从 Hazelcast 实例检索的用户上下文中添加对象。 The Hazlcast blog 有一个很好的例子。
有一个更好的、更面向对象的解决方案:您可以将注释 @SpringAware
添加到您的 class(在我的例子中是 PersistTask
),它将使用Spring 反序列化后的上下文。所有 Spring 注释和接口(例如 @Autowired
和 InitializingBean
)将被处理并注入依赖项。为此,您必须在 Hazelcast 实例中定义一个 ManagedContext
。 SpringManagedContext
就是您所需要的。这可以在 XML 配置中指定,如下所示:
<hz:hazelcast id="hzexample">
<hz:config>
<hz:spring-aware /> <!-- this line here !!! -->
<hz:instance-name>hzexample</hz:instance-name>
...
官博里的例子是this但是格式不好