首页 > 解决方案 > Hazelcast addItemListener 与弹簧自动装配

问题描述

我正在尝试创建一个带有监听器的 hazelcast-spring 应用程序,但目前没有成功。当我尝试自动连接时,我UserListener的 is null

    HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
    IQueue<Object> queue1 = hazelcastInstance.getQueue("q");
    queue1.addItemListener(new UserListener(), true);
    }

这是我的主要方法,当我使用 UserListener 类的新实例(我的侦听器)添加项目侦听器时它工作正常,但我需要使用 spring autowired 注释,因为在侦听器中我有 service->dao 并且我希望一切都是autowired.Any 想法我怎么能做到这一点?这是我的整个代码:

主类:


    public static void main(String[] args) {
        HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
        IQueue<Object> queue1 = hazelcastInstance.getQueue("q");
        queue1.addItemListener(new UserListener(), true);
        }

监听类:


    @Component
    public class UserListener implements ItemListener<Object> {
    
        @Autowired
        private UserService userService;
    
        public void itemAdded(ItemEvent<Object> arg0) {
        if (arg0 != null) {
            try {
            userService.process(arg0);
            } catch (SQLException e) {
            e.printStackTrace();
            }
        } else {
            System.out.println("null");
        }
       }
    
        public void itemRemoved(ItemEvent<Object> item) {
        System.out.println("The item is removed succesfully");
        }
    }

POM.xml


    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>hazelcastServer</groupId>
      <artifactId>hazelcastServer</artifactId>
      <version>0.0.1-SNAPSHOT</version> 
    
    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.1.RELEASE</version>
            <relativePath/>
        </parent>
      
      <dependencies>
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast</artifactId>
        <version>3.12.9</version>
    </dependency>
    <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
     <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-jdbc</artifactId>
             <version>5.0.5.RELEASE</version>
          </dependency>
      </dependencies>
      
      
    </project>

标签: javaspringspring-boothazelcast

解决方案


这部分代码

queue1.addItemListener(new UserListener(), true);

绕过 Spring 创建一个新的 UserListener 对象,因此注释为的任何字段@Autowired都不会被实例化。

你需要尝试

UserListener userListener = applicationContext.getBean(UserListener.class)
queue1.addItemListener(userListener, true);

检查 object 是否为 null 可能是值得的userListener,因为它可能是 Spring 组件扫描没有找到你的类并创建了一个 @Bean,因为组件扫描可以选择它扫描的包。


推荐阅读