0 0

通过EJB容器调用JMS处理信息所遇到的问题?10

EJB接口实现jms队列发送,然后同步方法receive()接收消息。在通过客户端远程调用的时候,发现服务器线程阻塞在receive()处直到超时异常抛出,观察发现 send()方法执行后,并没有立即把消息发出。而通过普通的java类直接实现jms消息收发,则正常发送和接收。

MessageSendAndReceiveForSync.java类的sendAndReceive(String reqMessage)方法实现发送和接收。 Company.java类是提供的远程EJB调用接口方法。CompanyBean.java是远程接口实现。TestCompany.java是远程客户端调用

 

package com.jms;

import java.util.Hashtable;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class MessageSendAndReceiveForSync {
	
	public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";	
	public final static String PROVIDER_URL = "t3://localhost:7001";	
	public final static String JMS_FACTORY = "jndiConnectionFactory";
	public final static String QUEUE = "jndiQueue";
	public final static String RSPQUEUE = "GSRspQueue";
    
    public String sendAndReceive (String reqMessage)throws Exception  {
    	InitialContext ctx = getInitialContext();
    	QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup(JMS_FACTORY);  
        QueueConnection qconn = factory.createQueueConnection();  
        qconn.start();
        //=========================消息发送================================
        Queue queue = (Queue)ctx.lookup(QUEUE);       
        final QueueSession session = qconn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
        Message message = session.createTextMessage(reqMessage);
//        message.setJMSMessageID(System.currentTimeMillis());
        QueueSender qs = session.createSender(queue);
        qs.send(message);
        System.out.println(System.currentTimeMillis()+"=======Send Message Completed!");

        //=========================同步消息接收================================
        Queue rspQ = (Queue)ctx.lookup(RSPQUEUE);
        QueueReceiver qr = session.createReceiver(rspQ);
        System.out.println(System.currentTimeMillis()+"=======receive()方法开始被调用---");
        Message recvMessage = qr.receive(180000L);
        System.out.println(System.currentTimeMillis()+"=======receive()方法已执行完成---");
        TextMessage tm = (TextMessage)recvMessage;
        
        String rspMessage = tm.getText();
        qr.close();
        qs.close();
        qconn.close();
        
        return rspMessage;
    }
    public  InitialContext getInitialContext() throws NamingException {
		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
		env.put(Context.PROVIDER_URL, PROVIDER_URL);
		return new InitialContext(env);
	}
    
    public static void main(String[] args) {
    	MessageSendAndReceiveForSync msar = new MessageSendAndReceiveForSync();
    	try {
			String sendAndReceive = msar.sendAndReceive("htjs");
			System.out.println(System.currentTimeMillis()+"=======客户端收到返回消息:"+sendAndReceive);
		} catch (Exception e) {
			
			e.printStackTrace();
		}
	}
    
 

}

 

package com.ejb;


import javax.ejb.Stateless;

import com.jms.MessageSendAndReceive;
import com.jms.MessageSendAndReceiveForSync;

@Stateless(mappedName = "Company")
public class CompanyBean implements Company {

	
	public String getNameForSync(String name) {
		
		String rspMessage ="系统错误";
		 try {
			 
			 MessageSendAndReceiveForSync qs = new MessageSendAndReceiveForSync();
		     rspMessage = qs.sendAndReceive(name);
		
		} catch (Exception e) {			
			e.printStackTrace();
		} 		
		
		return rspMessage;
	}

}

 

package com.ejb;

import javax.ejb.Remote;
@Remote
public interface Company
{
  
    public String getNameForSync(String name);
    
}

 客户端代码

写道
package com.ejb;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;

import com.ejb.Company;

public class TestCompany
{
public static void main(String[] args) throws Exception
{
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
props.setProperty(Context.PROVIDER_URL, "t3://localhost:7001");

InitialContext ctx = new InitialContext(props);
Company companyRemote = (Company) ctx.lookup("Company#com.ejb.Company");
String name = companyRemote.getNameForSync("htjs");
System.out.println(name);

}
}

 

 


问题补充:EJB应用相当于一个中间转发的作用,和客户端通讯采用提供的EJB接口,和远程服务器通信采用JMS。负责把客户端的EJB请求,转化为JMS的消息,然后发送给专门处理的服务器。
2013年12月03日 17:31
目前还没有答案

相关推荐

    EJB调用原理分析

    4. **容器管理**: EJB容器在调用实际的bean实例前,会进行一系列容器管理操作,如事务管理、安全验证、性能监控等。 5. **分发请求**: 容器将客户端请求转换为本地方法调用,分发给EJB组件实例。 6. **执行业务逻辑*...

    各种EJB之间的调用示例

    5. EJB容器管理:Java EE应用服务器作为EJB容器,负责管理Bean的生命周期、事务、安全性和资源。这使得开发者能够专注于业务逻辑,而不必关心底层实现。 6. JNDI(Java Naming and Directory Interface):EJB通过...

    EJB容器对bean的管理

    当JMS客户端发送消息时,EJB容器会从池中选取一个实例来处理消息。处理完成后,实例返回池中等待下一次消息。这种机制确保了MDB的异步处理能力,同时避免了频繁创建和销毁bean实例的开销。 **激活与钝化机制** 对于...

    tomcat 调用weblogic EJB

    这是在采用WebLogic作为EJB容器时,远程调用EJB的一种常见模式。初学者可以通过这种方式熟悉基本的远程调用流程。 6. **注意事项** - 在实际部署过程中,需要注意EJB的版本兼容性问题,以及安全认证机制。例如,...

    面向对象方法EJB组件.pdf

    EJB容器管理着EJB组件的生命周期,处理事务、安全、并发等问题,对开发者隐藏了这些复杂的服务的实现细节。 文档进一步介绍了EJB的分类,包括实体Bean、会话Bean和消息驱动Bean。实体Bean代表了持久化存储中的数据...

    EJB 基于Java的远程方法调用(RMI)技术

    EJB容器提供了运行在其内的组件(即EJBs)所需的高级管理功能。只要满足J2EE(Java 2 Platform, Enterprise Edition)规范的EJB部署到容器中,容器将自动进行高效管理。EJB可以通过容器提供的API轻松获取系统级别的...

    各种EJB之间的调用示例.7z

    - **远程方法调用 (Remote Method Invocation, RMI)**:客户端通过接口调用EJB的方法,该接口由EJB容器生成并暴露,实现跨JVM通信。 - **本地方法调用 (Local Method Invocation)**:当EJB和客户端在同一JVM中运行...

    实战EJB 实战EJB 实战EJB

    3. **Container Provider (容器提供商)**:实现EJB容器并提供所需的基础设施服务。 #### 二、编写和部署第一个EJB程序 **编写第一个EJB程序** 1. **定义接口**:为EJB定义本地和远程接口。 2. **实现EJB类**:...

    tomcat调用EJB必须的包.rar

    - JBoss EJB容器的实现库,因为EJB的部署和执行通常需要特定的容器支持。 - 持久化提供者的实现,如Hibernate或OpenJPA,这些是JPA的具体实现,用于实际的数据操作。 - JMS(Java Message Service)库,用于EJB之间...

    EJB3.0容器模型的WEB服务-WebService

    4. **透明的事务管理**:EJB容器自动管理事务,开发者无需关注事务的开始、提交或回滚。 5. **安全管理**:容器提供了基于角色的安全性,可以控制不同用户对Bean的访问权限。 **Web服务与EJB 3.0的结合** EJB 3.0...

    java源码:各种EJB之间的调用示例.zip

    - **远程接口调用(Remote Interface Invocation)**:客户端通过EJB的远程接口调用EJB方法,适用于客户端不在EJB容器内的场景。 - **本地接口调用(Local Interface Invocation)**:当客户端和EJB在同一个JVM内...

    EJB API中文版

    EJB服务器负责管理和协调EJB容器,同时提供对操作系统服务及Java相关服务的访问,如通过JNDI(Java Naming and Directory Interface)访问命名空间和基于OTSI(Object Transaction Service Interface)的事务处理...

    各种EJB之间的调用示例.zip

    - **远程方法调用(Remote Method Invocation, RMI)**:客户端通过RMI调用EJB的接口,实现跨JVM的通信。适用于客户端不在同一个应用服务器上的情况。 - **本地方法调用(Local Method Invocation)**:当客户端和...

    EJB应用开发详解

    EJB容器是EJB组件的运行环境,它提供了上述的管理服务。容器负责创建、初始化、激活、钝化和销毁EJB实例,以及处理与客户端的交互。 **4. EJB编程模型** EJB编程模型包括接口定义、实现类以及部署描述符。接口定义...

    EJB3.1讲解

    EJB容器是EJB类访问所需服务的接口。 - **EJB服务器**:管理EJB容器,为容器提供必要的系统服务。常见的EJB服务器包括JBoss、GlassFish等。 ##### EJB基本特征 - **兼容性**:EJB允许在不废弃现有企业级应用的前提...

    EJB实例工程代码

    调用过程涉及了远程方法调用(RMI,Remote Method Invocation)、EJB容器的拦截器(Interceptors)以及可能的JNDI查找。调用完成后,容器负责执行必要的清理工作,如关闭数据库连接。 通过深入理解上述知识点,并...

    EJB方面相关详解

    EJB容器提供了强大的事务管理支持,它自动处理事务的开始、提交、回滚等操作,确保了业务逻辑中数据处理的原子性、一致性、隔离性和持久性(ACID属性)。开发者无需编写复杂逻辑来管理事务,这减少了错误发生的可能...

Global site tag (gtag.js) - Google Analytics