0

まず最初に、この質問は CDI、特に CDI イベントに関するものであることを伝えたいと思います。コンテナー (私の場合、Weblogic 12 はEventオブジェクトを注入できません)

質問の動機:

JMS を WebSocket と統合しようとしています。基本的に、JMS からのメッセージを消費してからイベントを発生させて、サーバー エンドポイントが JMS メッセージを受信し、最終的に WebSocket プロトコルを介してブラウザーに送信できるようにしようとしています。このブログから、JMS と WebSocket を統合するというアイデアを思いつきました。 他の目的で CDI を使用していないことに注意してください。. しかし、注入されたイベントを起動しようとすると、NPE に直面しています。

私の理解では、使用するには、ほとんど空であってもCDIを定義する必要があります。beans.xml

私の(これをWebアプリのディレクトリbeans.xml内に配置し、以下の内容を貼り付けました:WEB-INF

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
  http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

EventProducerのクラスは次のようになります。

public class EventProducer {
    @Inject
    @WSJMSMessage
    Event<DataChangeEvent> wsDeltaEvent;
    boolean raiseEvent = false;

    void produceEvent() {
        if (raiseEvent) {
            DataChangeEvent event = new DataChangeEvent(lastSeqNumberOfChangeLists, messageSelector, dataChangeEntries);
            wsDeltaEvent.fire(event); //Raising the NPE because wsDeltaEvent has not been injected.
        }
    }
}

は次のEvent Qualifierように定義されます。

/**
 * Identifies WebSocket JMS messages.
 */
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})

public @interface WSJMSMessage {
}

イベントの消費者はクラスのメソッドonJMSMessageであり、関連する部分が以下に貼り付けられます。ServerEndpoint

@ServerEndpoint(value = "/{projectName}/{businessViewName}/wsdata",
                encoders = {WSJsonEncoder.class},
                decoders = {WSJsonDecoder.class})
public class WebSocketActiveDataHandler {

    // Other Lifecycle methods omitted for brevity

    public void onJMSMessage(@Observes @WSJMSMessage DataChangeEvent dataChangeEvent) {
        //Something here
    }
}

ここで何が欠けていますか?ポインタはありますか?

4

0 に答える 0