当前位置: 首页 > 知识库问答 >
问题:

不能在java web servlet中直接调用ActiveMQConnection类

郑狐若
2023-03-14
Warning:   RAR5038:Unexpected exception while creating resource for pool jms_amq_conn_pool. Exception : javax.resource.ResourceException: Could not create connection.
Warning:   RAR5117 : Failed to obtain/create connection from connection pool [ jms_amq_conn_pool ]. Reason : com.sun.appserv.connectors.internal.api.PoolingException: Could not create connection.

我怎么才能绕过这个?

更详细地发布:

我有一个Payara服务器,它加载了一个activemq-rar资源,我调用了一个servlet。我是按照这些指示去做的。

    null
    /**
    * Creates a connection using Payara resource then creates a producer/consumer then sends a message.
    */
    public void sendAMQMessage() {
        javax.jms.ConnectionFactory connectionFactory = InitialContext.doLookup("servlet_jms_amq_conn_factory");
        javax.jms.Connection connection = connectionFactory.createConnection();

        // creation is created, now set the client id and start it
        connection.setClientID("test_client_id");
        connection.start();

        javax.jms.Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        javax.jms.TemporaryQueue queue = session.createTemporaryQueue();

        javax.jms.MessageConsumer consumer = session.createConsumer(queue);

        consumer.setMessageListener(this);

        javax.jms.Queue serviceQueue = session.createQueue("queue_name");

        javax.jms.MessageProducer producer = session.createProducer(serviceQueue);

        producer.send("data");
    
    }


    @Override
    public void onMessage(Message message) {
        // receives data back from the initial request.
    }

当前web应用程序的pom.xml没有引用ActiveMQ库,因为上面的代码没有导入任何ActiveMQ类。但是我希望在Java servlet发送的消息上实现一个超时,这样,如果接收应用程序在一定时间内没有响应,我就可以处理它。

javax.jms.connection没有超时设置器方法。

ActiveMQConnectionJavaDoc确实有setsendtimeout(int sendTimeout)。因此,我将ActiveMQ依赖项包含在应用程序pom.xml中:

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.10.0</version>
            <type>jar</type>
        </dependency>
int milliseconds = 10000; // 10,000 ms = 10 seconds
((ActiveMQConnection)connection).setSendTimeout(milliseconds);
Warning:   RAR5038:Unexpected exception while creating resource for pool jms_amq_conn_pool. Exception : javax.resource.ResourceException: Could not create connection.
Warning:   RAR5117 : Failed to obtain/create connection from connection pool [ jms_amq_conn_pool ]. Reason : com.sun.appserv.connectors.internal.api.PoolingException: Could not create connection.
Warning:   RAR5038:Unexpected exception while creating resource for pool jms_amq_conn_pool. Exception : javax.resource.ResourceException: Could not create connection.
Warning:   RAR5117 : Failed to obtain/create connection from connection pool [ jms_amq_conn_pool ]. Reason : com.sun.appserv.connectors.internal.api.PoolingException: Could not create connection.

javax.jms.JMSException: Error in allocating a connection. Cause: Could not create connection.
    at org.apache.activemq.ra.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:101)
    at org.apache.activemq.ra.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:67)

我看过这个链接,它说只需将jar复制到Payara服务器的domains/domain1/ilb/ext文件夹。因此,我使用activemq-all-5.10.0.jar执行了该操作,然后当我运行上面的代码时,我得到了这个异常:

java.lang.ClassCastException: org.apache.activemq.command.ActiveMQQueue cannot be cast to javax.jms.Queue

一定有办法解决这个问题。有人有想法吗?

共有1个答案

严宸
2023-03-14

您所指的超时与接收消息的消费者“响应”所需的时间无关。超时只是发送客户端等待代理确认它确实收到消息的时间。这发生在使用者收到消息之前。

如果您使用JMS实现请求/响应功能,那么您应该遵循正确的模式,使用相关ID或临时应答队列。

如果您使用的是ActiveMQ JCA资源适配器,那么您的客户机实际上从JNDI查找中获得的连接实现很可能会被容器的JCA实现包装。您不太可能简单地将其强制转换为ActiveMQ实现。此外,所有ActiveMQ客户机类都打包在JCA资源适配器存档中,并与应用程序隔离。如果将相同的类放在运行时环境的其他地方,可能会出现奇怪的类加载行为(例如,意外的ClassCastException)。Java EE应用程序服务器被设计为提供对Java EE API(例如JMS、JDBC、JNDI等)的访问。获得对底层实现的访问以执行不可移植的东西通常是困难的,也是不鼓励的。

 类似资料:
  • 根据Android指南,http://developer.android.com/training/basics/fragments/communicating.html一个片段应该通过宿主Activity向另一个片段发送数据。我想知道这有什么原因。因为在我的代码中,我放置了一个变量来保存指向另一个片段的指针,并在onActivityCreated中赋值 后来,如果我想为FragmentType2

  • 编辑3:我也试图通过这个线程中提到的java选项参数来设置maven代理。 编辑2:我确信intellij idea使用相同的设置。xml,与system maven相同的maven二进制文件和相同的本地存储库。 编辑1:我试图检查每个工作负载的构建日志,主要区别是如何在构建日志的最开始调用maven。 对于intellij idea,如下所示: 对于系统外壳,maven刚刚启动时没有这个调用信息

  • 问题内容: 我正在部署用Java编写的接受命令行参数的命令行工具。我将其打包为JAR文件,因为使用单个文件很方便。 问题是要运行它,您必须先调用它,这很烦人。 我目前拥有的方法是启动一个简单的bash脚本,但这并不理想。 无论如何(在Linux,Ubuntu Server中)是否可以制作一个JAR文件来单独调用Java VM?我一直在寻找Shebang,但找不到它(这是合理的,因为它是编译后的代码

  • 这里是初学者 我正在尝试为我的C++学习项目制作一个“记录器”,我已经设置了代码来管理日志记录本身,但是我无法从其他类获得该功能。 这是我的“调试器”类 我想做的是: 现在这是行不通的,你们有经验的C++程序员可能已经在翻白眼了,但你能不能好心告诉我,我将如何使它工作。 顺便说一句,我希望我做的对,这是我的第一个问题,所以我很抱歉如果它是坏的

  • 问题内容: 根据golang文档,当您使用exec.Command()时,go不会调用系统的外壳程序。 从“ os / exec”软件包上的golang.org文档中: 与使用C和其他语言进行“系统”库调用不同,os / exec软件包有意不调用系统外壳程序,并且不展开任何glob模式或处理其他通常由外壳程序完成的扩展,管道或重定向。 这带来了问题。由于这种设计选择,您在执行命令时不能使用管道。因

  • 我正在修改我以前使用的Visitor模式。我们有基类Element,它有虚拟方法接受(Visitor),并且这个方法在继承自Element的所有类中都被重写。在任何派生类中,接受()所做的就是调用visitor- 为什么客户不能直接打电话给访客- 调用元素中有哪些有用的信息。接受(访客),然后依次呼叫访客。参观(元素)?这使得Visitor模式的使用很麻烦,并且在所有元素类的层次结构中都需要额外的