0

私は現在CDIプッシュイベントに取り組んでいます。commandButton によるフロントエンド jsf の代わりに、バックエンド Java コードによって pushevent をトリガーする予定です。PushCdiBean.java のコードは次のとおりです。

import java.io.Serializable;
import java.util.UUID;

import javax.annotation.PostConstruct;
import javax.enterprise.event.Event;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;



import org.richfaces.application.push.MessageException;
import org.richfaces.application.push.TopicKey;
import org.richfaces.application.push.TopicsContext;
import org.richfaces.cdi.push.Push;

/**
 * @author <a href="http://community.jboss.org/people/lfryc">Lukas Fryc</a>
 */
@javax.inject.Named("pushCdiBean") 
@javax.enterprise.context.RequestScoped 
//@ManagedBean(name="pushCdiBean")
//@ViewScoped


public class PushCdiBean implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -5241937306040858158L;
    private static final String CDI_PUSH_TOPIC = "pushCdi";
    private String userIdentifier; 
    private String message; 

    @Inject
    @Push(topic=CDI_PUSH_TOPIC)//i thought that the topic is initialized with this ?!
    private Event<String> pushEvent;

    @PostConstruct
    public void initialize() {
                   if(userIdentifier == null) {
                                  userIdentifier = UUID.randomUUID().toString().replace("-", ""); 
                   } 

    TopicsContext topicsContext = TopicsContext.lookup();
    topicsContext.getOrCreateTopic(new TopicKey(CDI_PUSH_TOPIC, userIdentifier));//initialize the topic and make the troublesome message disappears
    }

    public synchronized void sendMessage() throws MessageException {
              pushEvent.fire(message);
    }


    public String getMessage() {
              return message;
    }


    public void setMessage(String message) {
              this.message = message;
    } 

    public Event<String> getPushEvent() {
        return pushEvent;
    }

    public void setPushEvent(Event<String> pushEvent) {
        this.pushEvent = pushEvent;
    }

    public String getUserIdentifier() {
        return userIdentifier;
    }

    public void setUserIdentifier(String userIdentifier) {
        this.userIdentifier = userIdentifier;
    }

しかし、PushCdiBean クラスを作成して sendMessage() 関数を呼び出そうとすると、pushEvent.fire が失敗します。コードはこちらです。

/**
 * 
 */
public void run() {
      while (running) {
            try {
                            PushCdiBean pushTest = new PushCdiBean();
                            pushTest.setMessage("This is CDI push Test");
                            pushTest.sendMessage();
                         }
                         catch (Exception e) {
                    System.out.println("Exception: " + e.getMessage());
                          }
                       sleep(4000);
                     }
}

いくつか提案をお願いできますか?どうもありがとうございました。

4

1 に答える 1

1

@Injectnew を介して独自にインスタンス化するのではなく、CDI Beanを使用する必要があります。

于 2012-12-19T14:07:53.840 に答える