加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java-调用Spring控制器方法而不需要上网

发布时间:2020-12-15 01:17:47 所属栏目:大数据 来源:网络整理
导读:tldr:有没有办法在不连接互联网的情况下发出内部请求(使用方法的路径)? 我为什么需要它?我有一个接收很多事件的项目.由谁来决定谁将处理每个事件.所以我有类似的东西: @RestController@RequestMapping("/events")public class EventHandlerAPI { @Autowi

tldr:有没有办法在不连接互联网的情况下发出内部请求(使用方法的路径)?

我为什么需要它?我有一个接收很多事件的项目.由谁来决定谁将处理每个事件.所以我有类似的东西:

@RestController
@RequestMapping("/events")
public class EventHandlerAPI {

    @Autowired 
    private EventAHandler eventAhandler;
    @Autowired 
    private EventBHandler eventBhandler;

    @PostMapping("/a")
    public void handleEventA(@RequestBody EventA event) {
       eventAhandler.handle(id,event);
    }

    @PostMapping("/b")
    public void handleEventB(@RequestBody EventB event) {
       eventBhandler.handle(id,event);
    }

}

我们最近增加了对通过队列服务接收事件的支持.它向我们发送有效负载和事件类.我们的决定是让两个接口都正常工作(休息和排队).避免代码重复的解决方案是让Controller选择哪个处理程序来处理事件.如今的代码与此类似:

@Configuration
public class EventHandlerQueueConsumer {

    @Autowired 
    private EventHandlerAPI eventHandlerAPI;

    private Map<Class,EventHandler> eventHandlers;

    @PostConstruct 
    public void init() { 
        /* start listen queue */ 
        declareEventHandlers();
    }

    private void declareEventHandlers() {
        eventHandlers = new HashMap<>();
        eventHandlers.put(EventAHandler.class,(EventHandler<EventAHandler>) eventHandlerAPI::handleEventA);
        eventHandlers.put(EventBHandler.class,(EventHandler<EventBHandler>) eventHandlerAPI::handleEventB);
    }

   private void onEventReceived(AbstractEvent event) {
       EventHandler eventHandler = eventHandlers.get(event.getClass());
       eventHandler.handle(event);
   }

    private interface EventHandler<T extends AbstractEvent> {
        void handle(T event);
    }

}

这段代码有效,但是它不允许控制器选择谁来处理事件(我们的意图).该决定实际上是由地图做出的.

我想做的是通过请求映射调用控制器方法,而无需访问互联网.像这样:

@Configuration
public class EventHandlerQueueConsumer {

    // MADE UP CLASS TO SHOW WHAT I WANT
    @Autowired
    private ControllerInkover controllerInvoker;

    @PostConstruct 
    public void init() { /* start listen queue */ }

   private void onEventReceived(AbstractEvent event) {
       controllerInvoker.post(event.getPath(),new Object[] { event });
   }

}

这种方式更清洁,并且让所有决策由控制器做出.

我研究了很多,却没有找到实现它的方法.在调试Spring时,我发现他是如何在DispatcherServlet之后路由请求的,但是所有spring内部使用HttpServletRequest和HttpServletResponse

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读