首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Spring Framework调用Runnable?

如何使用Spring Framework调用Runnable?
EN

Stack Overflow用户
提问于 2011-11-03 03:43:46
回答 2查看 12.5K关注 0票数 3

我有一个需要调用runnable类的服务。

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

代码语言:javascript
复制
@Autowired
private LinkBrc2MemberProfile brcTask;                

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

下面是我的Runnable类

代码语言:javascript
复制
@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文件来配置我想要使用注释的runnable类的例子。提前谢谢。

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

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

我已经将以下bean添加到我的bean-config.xml文件中。

代码语言:javascript
复制
<bean id="brcType" class="com.ws.ocp.service.LinkBrc2MemberProfile" scope="prototype"/>

我删除了@Autowired注释,并将以下内容添加到我的服务类中。

代码语言:javascript
复制
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仍然是空的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-03 03:52:50

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

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

票数 7
EN

Stack Overflow用户

发布于 2017-11-14 20:04:31

为了回答如何正确使用Prototype-Bean的问题,这是我最喜欢的方法:

代码语言:javascript
复制
@Component
abstract class MyBean {
    /* Factory method that will be installed by Spring */
    @Lookup
    protected abstract YourPrototypeBean createBean();

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

因为它是一个工厂方法,所以您可以创建任意数量的实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7986400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档