multithreading - 如何使用 Spring Framework 调用 Runnable?

标签 multithreading spring autowired

我有一个需要调用可运行类的服务。

以下是我的服务中使用的代码行。

@Autowired
private LinkBrc2MemberProfile brcTask;                

// Background Task.
SimpleAsyncTaskExecutor sate = new SimpleAsyncTaskExecutor();
sate.createThread(new LinkBrc2MemberProfile(user));

这是我的 Runnable 类
@Service
public class LinkBrc2MemberProfile implements Runnable {

    private final Logger log = LoggerFactory.getLogger(LinkBrc2MemberProfile.class);

    @Autowired
    private LoyaltyDao dao;

    private Member member;

    public LinkBrc2MemberProfile() {
        super();
    }

    public LinkBrc2MemberProfile(Member member) {
        this.member = member;
    }

    public void run() {
        log.debug("*** Member User Name: " + member.getString("USER_NAME"));
        String emailAddress = member.getString("USER_NAME");
        Map<String, Object> map = dao.findBrcByEmailAddress( emailAddress );
        log.debug("==========================================================");

        if( ! map.isEmpty() ) {
            try {
                //a.CUSTOMER_ID, a.EMAIL_ADDRESS, b.card_no
                String customerId    = (String) map.get("CUSTOMER_ID");
                String brcCardNumber = (String) map.get("CARD_NO");

                log.debug("\ncustomerId: " + customerId + " brcCardNumber: " + brcCardNumber);
                if(!brcCardNumber.equals("")) {
                    // Add the Be Rewarded Card.
                    HashMap<String, String> userAttributes = new HashMap<String, String>();
                    String brcNumber = member.getString("BREWARDED_CARD_NO");
                    if (brcNumber.equals("")) {
                       userAttributes.put("BREWARDED_CARD_NO", brcCardNumber);
                       try {
                          member.putAll(userAttributes);
                       } catch (Exception e) {
                          String errorMessage = "Unable to save user's BRC information due to: " + e.getMessage();
                          log.error("{}", errorMessage);
                       }
                    }
                }
            } catch (Exception e) {
                log.error(e.getMessage());
                e.printStackTrace();
            }
        }
    }

我在日志中没有看到任何错误,但同时它似乎没有调用 Runnable 类。我在某处缺少注释吗?有没有什么好的例子可以指点我,我发现唯一的例子是使用 XML 文件来配置我想使用注释的可运行类。提前致谢。

我已更新我的服务以执行以下操作。

请帮忙,我的 DAO 是 NULL,所以看起来我的 Runnable 类中的 @Autowired 没有连接它。

我已将以下 bean 添加到我的 bean-config.xml 文件中。
<bean id="brcType" class="com.ws.ocp.service.LinkBrc2MemberProfile" scope="prototype"/>

我删除了 @Autowired 注释并将以下内容添加到我的服务类中。
ClassPathResource rsrc = new ClassPathResource("bean-config.xml");
XmlBeanFactory factory = new XmlBeanFactory(rsrc);
LinkBrc2MemberProfile brcTask = (LinkBrc2MemberProfile) factory.getBean("brcType");                

SimpleAsyncTaskExecutor sate = new SimpleAsyncTaskExecutor();               
// Set Member attribute
brcTask.setMember(user);
// Executer
sate.execute(brcTask);

为什么我的dao还是null?

最佳答案

runnable 将抛出 NullPointerException ,因为您自己创建它(使用 new 运算符),而不是让 Spring 创建它。这显然意味着 Autowiring 的 DAO 属性不会被 Autowiring ,这将导致 NPE调用dao.findBrcByEmailAddress(...)时.

你应该得到你的Runnable bean factory 中的实例(作为原型(prototype)),设置其成员属性,然后将其提交给执行器。

关于multithreading - 如何使用 Spring Framework 调用 Runnable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986400/

相关文章:

java - jackson 没工作?

java - 从 JMS header 获取字符串值

java - 使用静态实例化方法在构建器类中 Autowiring 依赖项

java - CompletableFuture#whenComplete 如果使用 thenApply 则不调用

java + 使用wait和notify我们会错过信号吗?

.net - .NET Compact Framework中的信号灯

java - Spring MVC项目本地资源

java - spring hibernate 自动接线 - 在自动接线 sessionFactory 上获取 NPE - httpinvoker 远程处理项目

Spring Autowiring 不适用于抽象类

java - 静态和非静态同步,为什么输出结果不同?