Java 实现不带注释的Spring代码
我想重写这个没有注释的Spring AMQP代码: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
@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