Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何使用Spring框架调用Runnable?_Multithreading_Spring_Autowired - Fatal编程技术网

Multithreading 如何使用Spring框架调用Runnable?

Multithreading 如何使用Spring框架调用Runnable?,multithreading,spring,autowired,Multithreading,Spring,Autowired,我有一个需要调用可运行类的服务 下面是我的服务中使用的代码行 @Autowired private LinkBrc2MemberProfile brcTask; // Background Task. SimpleAsyncTaskExecutor sate = new SimpleAsyncTaskExecutor(); sate.createThread(new LinkBrc2MemberProfile(user)); 这是我的跑步课 @Service

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

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

@Autowired
private LinkBrc2MemberProfile brcTask;                

// Background Task.
SimpleAsyncTaskExecutor sate = new SimpleAsyncTaskExecutor();
sate.createThread(new LinkBrc2MemberProfile(user));
这是我的跑步课

@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();
            }
        }
    }

为什么我的dao仍然为空?

runnable将抛出一个
NullPointerException
,因为它是您自己创建的(使用
new
操作符),而不是让Spring创建的。这显然意味着自动连线DAO属性不会自动连线,这将导致调用
DAO.findBrcByEmailAddress(…)
时出现
NPE


您应该从bean工厂(作为原型)获取您的
Runnable
实例,设置其成员属性,然后将其提交给执行者。

要回答您关于如何正确使用原型bean的问题,我最喜欢的方法是:

@Component
abstract class MyBean {
    /* Factory method that will be installed by Spring */
    @Lookup
    protected abstract YourPrototypeBean createBean();

    void someCode() {
        YourPrototypeBean bean = createBean();
    }
}

由于它是一个工厂方法,您可以创建任意多的实例。

因此,如果我正确理解您的“autowire”链接BRC2MemberProfile,请为我的成员添加一个setter,然后将其传递到sate.createThread(brcTask);是的,但请确保它配置为原型而不是单例,因为它有状态。谢谢@JB nize最后一个问题,原型的注释是什么?我刚刚更新了我的帖子,请告知这是否是将Runnable配置为原型的正确方法?就是这样,但是在singleton中注入原型是不好的。从bean工厂获取。如果您将原型注入到单例中,那么从单例中获得的可运行实例将始终是同一个实例,因为单例只注入一次。如果你从beanfactory得到一个原型,你每次都会得到一个新的实例。
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);
@Component
abstract class MyBean {
    /* Factory method that will be installed by Spring */
    @Lookup
    protected abstract YourPrototypeBean createBean();

    void someCode() {
        YourPrototypeBean bean = createBean();
    }
}