Как вы вызываете Runnable, используя Spring Framework? - PullRequest
3 голосов
/ 02 ноября 2011

У меня есть служба, которая должна вызывать исполняемый класс.

Вот строки кода, которые используются в моей службе.

@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 НЕДЕЙСТВИТЕЛЕН, поэтому похоже, что мой @Autowired в моем классе Runnable не подключает его в.

Я добавил следующий 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);

Почему мой дао все еще нулевой?

Ответы [ 2 ]

6 голосов
/ 02 ноября 2011

Runnable выдаст NullPointerException, так как вы создаете его самостоятельно (используя оператор new), а не позволяете Spring создать его. Это, очевидно, означает, что атрибут DAO с автоматическим подключением не будет автоматически подключен, что приведет к NPE при вызове dao.findBrcByEmailAddress(...).

Вы должны получить свой экземпляр Runnable из фабрики бинов (в качестве прототипа), установить его атрибут участника и затем передать его исполнителю.

2 голосов
/ 14 ноября 2017

Чтобы ответить на ваш вопрос о том, как правильно использовать Prototype-Bean, это мой любимый способ:

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

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

Поскольку это фабричный метод, вы можете создать столько экземпляров, сколько захотите.

...