Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现不带注释的Spring代码_Java_Spring_Spring Amqp - Fatal编程技术网

Java 实现不带注释的Spring代码

Java 实现不带注释的Spring代码,java,spring,spring-amqp,Java,Spring,Spring Amqp,我想重写这个没有注释的Spring AMQP代码: @SpringBootApplication public class So51009346Application { public static final String QUEUE_PROCESSING_TRANSACTION = "q1"; public static void main(String[] args) { SpringApplication.run(So51009346Applicati

我想重写这个没有注释的Spring AMQP代码:

@SpringBootApplication
public class So51009346Application {

    public static final String QUEUE_PROCESSING_TRANSACTION = "q1";

    public static void main(String[] args) {
        SpringApplication.run(So51009346Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(RabbitTemplate template) {
        return args -> {
            ReplyObject reply = (ReplyObject) template.convertSendAndReceive("ex", "rk", new RequestObject());
            System.out.println(reply);
        };
    }

    @Bean
    public SimpleMessageListenerContainer container(ConnectionFactory cf, Listener listener) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
        container.setQueueNames(QUEUE_PROCESSING_TRANSACTION);
        container.setMessageListener(new MessageListenerAdapter(listener, "process"));
        return container;
    }

    @Bean
    public Queue queue() {
        return new Queue(QUEUE_PROCESSING_TRANSACTION);
    }

    @Bean
    public TopicExchange te() {
        return new TopicExchange("ex");
    }

    @Bean
    public Binding binding() {
        return BindingBuilder.bind(queue()).to(te()).with("rk");
    }

}

class RequestObject implements Serializable {

    private static final long serialVersionUID = 1L;

}

class ReplyObject implements Serializable {

    private static final long serialVersionUID = 1L;

}

@Component
class Listener {

    public ReplyObject process(RequestObject ro) {
        return new ReplyObject();
    }

}
我尝试了这个没有注释的简单Java代码:

@SpringBootApplication
public class So51009346Application {

    public static final String QUEUE_PROCESSING_TRANSACTION = "q1";

    public static void main(String[] args) {
        SpringApplication.run(So51009346Application.class, args);
    }

    @Bean
    public ApplicationRunner runner(RabbitTemplate template) {
        return args -> {
            ReplyObject reply = (ReplyObject) template.convertSendAndReceive("ex", "rk", new RequestObject());
            System.out.println(reply);
        };
    }

    @Bean
    public SimpleMessageListenerContainer container(ConnectionFactory cf, Listener listener) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
        container.setQueueNames(QUEUE_PROCESSING_TRANSACTION);
        container.setMessageListener(new MessageListenerAdapter(listener, "process"));
        return container;
    }

    @Bean
    public Queue queue() {
        return new Queue(QUEUE_PROCESSING_TRANSACTION);
    }

    @Bean
    public TopicExchange te() {
        return new TopicExchange("ex");
    }

    @Bean
    public Binding binding() {
        return BindingBuilder.bind(queue()).to(te()).with("rk");
    }

}

class RequestObject implements Serializable {

    private static final long serialVersionUID = 1L;

}

class ReplyObject implements Serializable {

    private static final long serialVersionUID = 1L;

}

@Component
class Listener {

    public ReplyObject process(RequestObject ro) {
        return new ReplyObject();
    }

}
生产商代码:

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.plugin.database.bean.TransactionsBean;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.Connection;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@WebListener
public class ContextServer implements ServletContextListener {

    CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
    Connection connection = connectionFactory.createConnection();
    AmqpAdmin admin = new RabbitAdmin(connectionFactory);

    admin.declareExchange(new TopicExchange(EXCHANGE_PROCESSING));
    admin.declareQueue(new Queue(QUEUE_PROCESSING_TRANSACTION, false));

    admin.declareBinding(BindingBuilder.bind(new Queue(QUEUE_PROCESSING_TRANSACTION, false)).to(new TopicExchange(EXCHANGE_PROCESSING)).with(ROUTING_KEY_PROCESSING_TRANSACTION));              
    RabbitTemplate template = new RabbitTemplate(connectionFactory);

    TransactionsBean obj = new TransactionsBean();      
    obj.setMerchant_id(232323);

    template.setReplyTimeout(600000);
    TransactionsBean reply = (TransactionsBean) template.convertSendAndReceive(EXCHANGE_PROCESSING, ROUTING_KEY_PROCESSING_TRANSACTION, obj);
    System.out.println("!!!!! Received Transaction_id " + reply.getTransaction_id());   

    @Override
    public final void contextDestroyed(final ServletContextEvent sce) {     
    }
}
消费者代码:

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import org.plugin.database.bean.TransactionsBean;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

    @SpringBootApplication
@WebListener
public class ContextServer implements ServletContextListener {

    private static String QUEUE_PROCESSING_TRANSACTION = "processing-process-queue";
    private static final String EXCHANGE_PROCESSING = "processing";
    private static final String ROUTING_KEY_PROCESSING_TRANSACTION = "processing.trx.process";

    @Override
    public final void contextInitialized(final ServletContextEvent contextEvent) {

        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
    AmqpAdmin admin = new RabbitAdmin(connectionFactory);
    admin.declareExchange(new TopicExchange(EXCHANGE_PROCESSING));
    admin.declareQueue(new Queue(QUEUE_PROCESSING_TRANSACTION, false));

    admin.declareBinding(BindingBuilder.bind(new Queue(QUEUE_PROCESSING_TRANSACTION, false))
            .to(new TopicExchange(EXCHANGE_PROCESSING)).with(ROUTING_KEY_PROCESSING_TRANSACTION));
    RabbitTemplate template = new RabbitTemplate(connectionFactory);
    }

    @Bean
    public SimpleMessageListenerContainer container(ConnectionFactory cf, Listener listener) {
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
    container.setQueueNames(QUEUE_PROCESSING_TRANSACTION);
    container.setMessageListener(new MessageListenerAdapter(listener, "process"));
    container.setMessageConverter(new SerializerMessageConverter());//basic converter for java.io.Serializable POJO
    return container;
    }

    @Override
    public final void contextDestroyed(final ServletContextEvent sce) {
    }

    @Component
    class Listener {

        public TransactionsBean process(TransactionsBean ro) {
            TransactionsBean obj = new TransactionsBean();
            obj.setTransaction_id("some_id");
            return obj;
        }
    }
}
错误堆栈:

   13:20:44,797 INFO  [org.springframework.amqp.rabbit.listener.DirectReplyToMessageListenerContainer] (ServerService Thread Pool -- 79) Container initialized for queues: [amq.rabbitmq.reply-to]
13:20:44,803 INFO  [org.springframework.amqp.rabbit.listener.DirectReplyToMessageListenerContainer] (ServerService Thread Pool -- 79) SimpleConsumer [queue=amq.rabbitmq.reply-to, consumerTag=amq.ctag-oWxWZJEPgZyP-gRxWe-Ifg identity=42eb5972] started
13:20:49,846 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 79) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./rest_api: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./rest_api: java.lang.RuntimeException: java.lang.NullPointerException
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:81)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:514)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
    at java.base/java.lang.Thread.run(Thread.java:844)
    at org.jboss.threads@2.3.1.Final//org.jboss.threads.JBossThread.run(JBossThread.java:485)
Caused by: java.lang.RuntimeException: java.lang.NullPointerException
    at io.undertow.servlet//io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:251)
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:96)
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:78)
    ... 8 more
Caused by: java.lang.NullPointerException
    at deployment.rest_api.war//org.rest.api.context.ContextServer.contextInitialized(ContextServer.java:43)
    at io.undertow.servlet//io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187)
    at io.undertow.servlet//io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:215)
    at io.undertow.servlet//io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:184)
    at io.undertow.servlet//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
    at io.undertow.servlet//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)
    at org.wildfly.extension.undertow//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1526)
    at io.undertow.servlet//io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:249)
    ... 10 more

13:20:49,885 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 2) WFLYCTL0013: Operation ("deploy") failed - address: ([("deployment" => "rest_api.war")]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.undertow.deployment.default-server.default-host./rest_api" => "java.lang.RuntimeException: java.lang.NullPointerException
    Caused by: java.lang.RuntimeException: java.lang.NullPointerException
    Caused by: java.lang.NullPointerException"}}
13:20:49,908 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) WFLYSRV0010: Deployed "rest_api.war" (runtime-name : "rest_api.war")
来自生产者的消息已成功发送。 我在Producer:
reply.getTransaction\u id()
使用基本Java代码实现没有注释的使用者的正确方法是什么?

正如我在中所解释的,如果您不熟悉Spring,最好的入门方法是使用Spring引导。选择RabbitMQ作为依赖项后,转到并构建新项目。这正是我对示例代码所做的

如果您坚持使用自己的代码,而不是使用Spring来管理这些组件的依赖关系和生命周期;您需要自己完成这项工作—调用
afterPropertiesSet()
start()

我得到了NPE

这是完全不够的信息。您需要显示完整的堆栈跟踪和所有代码,包括
TransactionBean

相信我;“没有注释”意味着您必须自己编写更多的代码

编辑

System.out.println(“!!!!!!!!!Transaction_id”+receivedobj.getTransaction_id())

当然,您将得到一个NPE——您实际上没有检查返回的对象是否为null;模板的默认回复超时为5秒,之后返回
null

容器在
start()
ed之前不会执行任何操作;再一次;请学习使用Spring来管理这些对象的生命周期。

正如我在中所解释的,如果您不熟悉Spring,最好的入门方法是使用Spring Boot。选择RabbitMQ作为依赖项后,转到并构建新项目。这正是我对示例代码所做的

如果您坚持使用自己的代码,而不是使用Spring来管理这些组件的依赖关系和生命周期;您需要自己完成这项工作—调用
afterPropertiesSet()
start()

我得到了NPE

这是完全不够的信息。您需要显示完整的堆栈跟踪和所有代码,包括
TransactionBean

相信我;“没有注释”意味着您必须自己编写更多的代码

编辑

System.out.println(“!!!!!!!!!Transaction_id”+receivedobj.getTransaction_id())

当然,您将得到一个NPE——您实际上没有检查返回的对象是否为null;模板的默认回复超时为5秒,之后返回
null


容器在
start()
ed之前不会执行任何操作;再一次;请学习使用Spring管理这些对象的生命周期。

这里有多个问题:

  • 如上@Gary Russell所述,起初没有连接超时

  • 接收
    null
    的根本问题是
    convertSendAndReceive
    使用POJO操作,POJO应该是可序列化的,并且应该在用户端描述序列化程序:

  • @Bean
    公共SimpleMessageListenerContainer容器(ConnectionFactory cf,侦听器){
    SimpleMessageListenerContainer容器=新SimpleMessageListenerContainer(cf);
    setQueueNames(队列处理事务);
    setMessageListener(新的MessageListenerAdapter(监听器,“进程”);
    container.setMessageConverter(新的SerializerMessageConverter());//java.io.Serializable POJO的基本转换器
    返回容器;
    }
    
    这里有多个问题:

  • 如上@Gary Russell所述,起初没有连接超时

  • 接收
    null
    的根本问题是
    convertSendAndReceive
    使用POJO操作,POJO应该是可序列化的,并且应该在用户端描述序列化程序:

  • @Bean
    公共SimpleMessageListenerContainer容器(ConnectionFactory cf,侦听器){
    SimpleMessageListenerContainer容器=新SimpleMessageListenerContainer(cf);
    setQueueNames(队列处理事务);
    setMessageListener(新的MessageListenerAdapter(监听器,“进程”);
    container.setMessageConverter(新的SerializerMessageConverter());//java.io.Serializable POJO的基本转换器
    返回容器;
    }
    
    我添加了迄今为止尝试的所有内容。但是我需要一些帮助才能使代码正常工作。我肯定会开始学习Spring,但现在为了使这个概念验证代码尽快工作,我需要你的帮助。我尝试应用更改,但我得到了NPE。你能建议如何解决这个问题吗?你会得到一个NPE,因为你没有检查空结果。在我看来,您是在Spring初始化应用程序上下文之前发送消息的。根据
    contextInitialized
    javadocs:
    >接收web应用程序初始化过程正在启动的通知。
    在使用RabbitMQ之前,请等待应用程序启动。是否有解决方法?例如,在contextInitialized之后立即调用Spring?您需要等到以后—例如,像我的示例中的
    ApplicationRunner
    中—这些bean在Spring完成初始化后运行。我添加了迄今为止尝试的所有内容。但是我需要一些帮助才能使代码正常工作。我肯定会开始学习Spring,但现在为了使这个概念验证代码尽快工作,我需要你的帮助。我尝试应用更改,但我得到了NPE。你能建议如何解决这个问题吗?你会得到一个NPE,因为你没有检查空结果。在我看来,您是在Spring初始化应用程序上下文之前发送消息的。根据
    contextInitialized