Seam : Wie von einer MDB die Messages an View weiterleiten ?

Tonteria

Grünschnabel
Hi,

ich wollte zum Einarbeiten in Seam und JMS im Speziellen eine kleine Mini-Chat-Anwendung schreiben in der 2 Chatter miteinander kommunizieren können. (Bin Anfänger in J2EE allgemein).

Dazu sollen 2 MDBs aus 2 verschiedenen Queues die Messages rausholen bzw. hineinpacken.

Für das Beispiel reicht aber erstmal 1 Sender, 1 Queue, 1 Empfänger, 1 EmpfängerPostfach, 1 View.

Bisher habe ich das folgendermaßen gehandhabt (ich gehe davon aus, dass es der falsche Ansatz ist, aber ich wollte wissen ob es auch so klappt) :

Sender :

PHP:
package org.domain.chat.session;

import javax.jms.QueueSender;
import javax.jms.QueueSession;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.ScopeType;

@Name("chatterone")
@Scope(ScopeType.CONVERSATION)
public class ChatterOne {
@In
private QueueSender aQueueSender;
@In(create = true)
private QueueSession queueSession;

public void sendMessage() {
  try {
	aQueueSender.send(queueSession.createTextMessage("Test!"));
  } catch (Exception e) {
    System.out.println("aaaaaarrrggghhhh");
  }
  
}

}

Empfänger :

PHP:
package org.domain.chat.session;

import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.ejb.ActivationConfigProperty;


import org.jboss.beans.metadata.api.annotations.Inject;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

@Name("chattertworeceiver")
@MessageDriven(name = "chatterTwoReceiver", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/chatQueue") })
public class ChatterTwoReceiver implements MessageListener {
	
@In(create=true)
public ChatterTwoInbox inbox;
  

  public void onMessage(Message message) {
      TextMessage textMsg = (TextMessage) message;
      System.out.println(textMsg);
      try {
		inbox.setValue(textMsg.getText());
	} catch (JMSException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
  }
 
  

}

EmpfängerPostfach

PHP:
package org.domain.chat.session;


import org.jboss.seam.annotations.Name;

@Name("chattertwoinbox")
public class ChatterTwoInbox {
	
	public String value;
    
    public ChatterTwoInbox() {
    }
    
	public void setValue(String string) {
		this.value=string;
		System.out.println(string);
	}
	
	public String getValue(){
		return value;
	}

	
}

View :

HTML:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:s="http://jboss.com/products/seam/taglib"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    template="layout/template.xhtml">

    <ui:define name="body">

        <h:form>
        <rich:panel>
            <h:panelGrid columns="2">
                <h:graphicImage value="/img/seamlogo.png" alt="Seam logo"/>
                <s:div styleClass="info">
                    <p><strong>Chat</strong></p>
                    <ul class="bullets">
                        <li><a4j:commandButton value="start chat" action="#{chatterone.sendMessage}" reRender="a"/></li>
                        <h:outputText id="a" value="#{chattertwoinbox.value}" />
                    </ul>
                </s:div>
            </h:panelGrid>
        </rich:panel>
      </h:form>
    </ui:define>
</ui:composition>

Bisher wird der Text nur als outputtext ausgegeben, was nur zu Testzwecken dienen soll (das funktioniert aber nicht aufgrund des fehlerhaften Codes im View nehm ich an). Eigentlich wollte ich die Messages untereinander in
Textfeldern oder Listboxen ausgeben lassen, weiß aber nicht wie das anzustellen ist :(
Ausserdem ist das mit dem Singleton nur eine Notlösung weil ich auch nicht wusste wie man MDBs aus dem View aus sonst ansprechen kann.

Meine Fragen :

1.) Wie geht man mit Listboxen in Seam um ?
2.) Ist es einfach die von einer MDB empfangene Message an eine Listbox weiterzuleiten ?

Bin am Verzweifeln... besten Dank für jeden Tipp im Voraus !

Herzliche Grüße,

Tonteria
 
Zuletzt bearbeitet:
Ich hab jetzt das Postfach per CDI in den Empfänger eingebunden um die Message an den View weiterzuleiten.
Siehe dazu erstes Post : Code von Empfänger und EmpfängerPostfach.
Wenn ich das aber mache bekomme ich folgende JBoss-Fehlermeldung :

PHP:
javax.ejb.EJBTransactionRolledbackException
	at org.jboss.ejb3.tx.Ejb3TxPolicy.handleInCallerTx(Ejb3TxPolicy.java:115)
	at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:130)
	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:194)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:80)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.mdb.MessagingContainer.localInvoke(MessagingContainer.java:262)
	at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.delivery(MessageInflowLocalProxy.java:270)
	at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.invoke(MessageInflowLocalProxy.java:140)
	at $Proxy300.onMessage(Unknown Source)
	at org.jboss.resource.adapter.jms.inflow.JmsServerSession.onMessage(JmsServerSession.java:178)
	at org.jboss.jms.client.container.ClientConsumer.callOnMessageStatic(ClientConsumer.java:160)
	at org.jboss.jms.client.container.SessionAspect.handleRun(SessionAspect.java:831)
	at org.jboss.aop.advice.org.jboss.jms.client.container.SessionAspect_z_handleRun_17807976.invoke(SessionAspect_z_handleRun_17807976.java)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)
	at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.jms.client.delegate.ClientSessionDelegate.run(ClientSessionDelegate.java)
	at org.jboss.jms.client.JBossSession.run(JBossSession.java:199)
	at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:234)
	at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:213)
	at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:260)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
	at org.domain.chat.session.ChatterOneReceiver.onMessage(ChatterOneReceiver.java:26)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111)
	at org.jboss.ejb3.EJBContainerInvocationWrapper.invokeNext(EJBContainerInvocationWrapper.java:69)
	at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor$InvocationContext.proceed(InvocationContextInterceptor.java:138)
	at org.jboss.seam.intercept.EJBInvocationContext.proceed(EJBInvocationContext.java:44)
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56)
	at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28)
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
	at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44)
	at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68)
	at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:118)
	at org.jboss.seam.intercept.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:50)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.ejb3.interceptors.aop.EJB3InterceptorInterceptor.invoke(EJB3InterceptorInterceptor.java:83)
	at org.jboss.ejb3.interceptors.aop.EJB3InterceptorInterceptor.invoke(EJB3InterceptorInterceptor.java:70)
	at org.jboss.ejb3.EJBContainerInvocationWrapper.invokeNext(EJBContainerInvocationWrapper.java:59)
	at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:73)
	at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:59)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.jboss.aop.advice.PerJoinpointAdvice.invoke(PerJoinpointAdvice.java:174)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.fillMethod(InvocationContextInterceptor.java:72)
	at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_fillMethod_17807976.invoke(InvocationContextInterceptor_z_fillMethod_17807976.java)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:88)
	at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_17807976.invoke(InvocationContextInterceptor_z_setup_17807976.java)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:62)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:56)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:68)
	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
	at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126)
	... 30 more
00:57:06,075 WARN  [AbstractDLQHandler] Message redelivered=6 max=5 sending it to the dlq delegator->JBossMessage[20878292186660866]:PERSISTENT, deliveryId=0

Sieht so aus als sei der Empfänger nicht initialisiert. ich dachte aber das geschieht automatisch vom JBoss aus.
Hat vielleicht jemand Ahnung davon und weiß dazu einen Rat ?

Beste Grüße,

Tonteria
 
Zuletzt bearbeitet:
Zurück