まず最初に、この質問は 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
}
}
ここで何が欠けていますか?ポインタはありますか?